Faremo qui vedere alcuni esempi che riguardano l'utilizzo delle matrici di compagnia.
Matlab fornisce alcune funzioni che ci sono utili per ottenere una matrice di compagnia: la funzione ``poly'', che riceve un vettore contenente gli autovalori, restituisce un vettore contenente i coefficienti del polinomio che ha come radici i valori contenuti nel vettore di input; la funzione ``compan'' genera la matrice di compagnia utilizzando i valori del vettore in ingresso per calcolare il valore degli elementi della prima riga.
Vediamo un utilizzo:
» v=poly([17;3;12]) v = 1 -32 291 -612 » A=compan(v) A = 32 -291 612 1 0 0 0 1 0 » eig(A) ans = 16.99999999999995 12.00000000000003 3.00000000000000 » [l,i]=potenze(A, rand(3,1), 10e-15, 2000) l = 17.00000000000039 i = 88 »
Quello che abbiamo fatto è stato generare il vettore ``v'' dei
coefficienti del polinomio avente come radici tramite la
funzione ``poly'', dopo di che abbiamo costruito la matrice di
compagnia con la funzione ``compan''; per essere certi che gli
autovalori della matrice fossero proprio gli elementi del
vettore parametro di ``poly'' abbiamo richiamato nuovamente la
funzione ``eig'' che ci ha confermato la bontà delle operazioni
svolte fin ora; infine abbiamo eseguito il nostro codice ottenendo
il risultato desiderato. Si vuol far notare anche come
l'algoritmo, eseguito numerose volte sullo stesso esempio, abbia
mantenuto praticamente sempre lo stesso comportamento: converge
verso la medesima soluzione
in un
numero costante di passi, , anche con valori del vettore
iniziale sempre diversi.
Ora vogliamo evidenziare una ben precisa caratteristica delle matrici, ma per fare questo proponiamo prima due esempi per poi trarne le conclusione solo dopo un loro esame:
Primo esempio:
» v=poly([-1,2,-4,3,1+i,1]) v = Columns 1 through 2 1.00000000000000 -2.00000000000000 - i Columns 3 through 4 -14.00000000000000 + 1.00000000000000i 40.00000000000000 + 15i Columns 5 through 6 -11.00000000000000 -25.00000000000000i-38.00000000000000 -14i Column 7 24.00000000000000 +24.00000000000000i » A=compan(v) A = Columns 1 through 2 2.00000000000000 + 1.00000000000000i 14.00000000000000 - i 1.00000000000000 0 0 1.00000000000000 0 0 0 0 0 0 Columns 3 through 4 -40.00000000000000 -15.00000000000000i 11.00000000000000 +25i 0 0 0 0 1.00000000000000 0 0 1.00000000000000 0 0 Columns 5 through 6 38.00000000000000 +14.00000000000000i-24.00000000000000 -24i 0 0 0 0 0 0 0 0 1.00000000000000 0 » [l,i]=potenze(A, rand(6,1), 10e-15, 2000) l = -4.00000000000001 + 0.00000000000001i i = 121 »
Il secondo esempio:
» v=poly([-1,2,-4,3,1+i,1-i]) v = 1 -2 -13 40 -26 -28 48 » A=compan(v) A = 2 13 -40 26 28 -48 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 » [l,i]=potenze(A, rand(6,1), 10e-15, 2000) l = -3.99999999999998 i = 113 »
Tralasciando la brutta forma del primo esempio, veniamo a quanto ci interessa: se si guarda con attenzione il vettore che contiene gli autovalori nel primo esempio si nota un numero complesso, mentre nel secondo ce ne sono due; di più, i due numeri complessi del secondo esempio non sono slegati tra di loro, ma anzi, sono uno il complesso coniugato dell'altro. Se si riguarda ancora la matrice del primo esempio si nota come questa sia una matrice complessa, mentre la matrice del secondo esempio è una matrice reale. In ogni caso l'algoritmo converge alla soluzione attesa. Quello che si voleva far notare è che la presenza di valori complessi, uniti ai loro complessi coniugati, tra gli autovalori rende la matrice reale, mentre la presenza di numeri complessi senza i coniugati rende la matrice complessa.
Abbiamo utilizzato le matrici di compagnia per verificare quello che può essere formulato come
Morpheus 2004-01-04