6.1 LinearAlgebra
Il package LinearAlgebra contiene numerose routines che permettono di definire matrici, vettori, ecc. e di operare con questi oggetti.
In una sessione Maple, o in una sua parte che richiede questo package, occorre dichiarare:
Matrici. Una matrice si può definire in più modi:
Mediante la lista delle righe:
> |
M:=Matrix([[1,2,3],[4,5,6]]); |
Definendo una funzione del posto (i,j):
e quindi specificando le dimensioni della matrice:
La matrice definita dalla f di sopra si chiama matrice di Hilbert. Esiste anche un comando che la fornisce direttamente:
Per estrarre l'elemento che sta nel posto (i,j) di una matrice M basta chiedere M[i,j]:
Determinanti: Determinant(M)
> |
for i to 6 do Determinant(HilbertMatrix(i)) od: |
> |
f1:=(i,j)->evalf(1/(i+j-1));
|
> |
for i to 6 do Determinant(Matrix(i,f1)) od: |
Matrici diagonali. Gli elementi della diagonale vanno dati sotto forma di vettore: DiagonalMatrix(V,m,n), m numero di righe, n di colonne
Matrice identica: IdentityMatrix(m,n), IdentityMatrix(n), matrice identica mxn o nxn
> |
IdentityMatrix(4,5); IdentityMatrix(4);
|
Matrice nulla: ZeroMatrix(m,n), ZeroMatrix(n)
> |
ZeroMatrix(4,5); ZeroMatrix(4);
|
Matrice simmetrica
Si inizializza con la matrice nulla:
> |
M:=Matrix(n,shape=symmetric); # dà la matrice nulla n x n |
> |
M:=Matrix(3,shape=symmetric); |
Si assegnano valori M[i,j], e si ottiene la matrice che ha M[i,j]=M[j,i]:
e così per gli altri elementi.
Matrice triangolare
Come per la matrice simmetrica, si inizializza con la matrice nulla. Vi sono due opzioni triangular (che equivale a triangular[upper]) e triangular[lower].
> |
M:=Matrix(n,shape=triangular), ovvero M:=Matrix(n,shape=triangular[lower]), # si crea la matrice nulla n x n e si stabilisce se la matrice sarà triangolare superiore o inferiore |
> |
M:=Matrix(3,shape=triangular); |
> |
M[1,2]:=1; M[1,3]:=-1;M[2,3]:=1/2; |
Si può anche inizializzare con una matrice che ha tutti 1 sulla diagonale e 0 altrove:
> |
M:=Matrix(3,shape=triangular[lower,unit]):
|
> |
M[2,1]:=1; M[3,1]:=-1; M[3,2]:=1/2; |
Trasposta di una matrice:
Matrice di Vandermonde:
> |
h1:=factor(h): # si vede da qui che il determinante di Vandermonde è zero se e solo se due degli elementi a,b,... sono uguali. |
Matrice inversa
> |
B:=MatrixInverse(A): # si osservi che l'inversa di una matrice di Hilbert è a elementi interi e a segni alterni su righe e colonne
|
Il prodotto di due matrici A e B si ottiene con il comando A.B. Verifichiamo che B è effettivamente l'inversa di A facendo il prodotto:
Potenza di una matrice: M^n oppure MatrixPower(M,n)
Matrice di Sylvester di due polinomi
> |
g:=b1*x^3+b2*x^2+b3*x+b4: |
> |
SylvesterMatrix(f,g,x): |
Il determinante della matrice di Sylvester è il risultante dei due polinomi. Il risultante è zero se e solo se i due polinomi hanno una radice in comune.
Esempio. Due polinomi che hanno una radice in comune:
> |
f:=expand((x-1)*(x^3-x-1)); |
> |
g:=expand((x-1)*(x+1)); |
> |
SylvesterMatrix(f,g,x); |
Altro esempio:
> |
f:=x^4-x^3-2*x-1; g:=x^3+1; |
I due polinomi non hanno radici comuni.
Estrazione di elementi e sottomatrici
> |
M[i,j]; # estrae l'elemento di posto (i,j) della matrice M
|
M[i..j,h..k]: # estrae dalla matrice composta dalle righe comprese tra la i e la j (incluse) della matrice M la matrice composta dalle colonne della M comprese tra la h e la k (incluse)
> |
M1[1..4,2..3]; #matrice 4 x 2 |
> |
M1[3..5,4..5]; # matrice 3 x 2 |
> |
M1[1..1,2..4]; #matrice 1 x 3 |
> |
M1[3..3,3..5]; #matrice 1 x 3 |
> |
M1[3..3,2..2]; #matrice 1 x 1 |
> |
M1[3..5,-2..-1]; # estrae dalla matrice composta dalle righe comprese tra la 3 e la 5 della matrice M le colonne comprese tra la penultima e l'ultima. E' una matrice 3 x 2. |
L'indice i sceglie la i-esima riga (colonna), -1 l'ultima, -2 la penultima, ecc.
> |
M1[3..4,1..-1]; # estrae dalla matrice composta dalle righe comprese tra la 3 e la 4 della matrice M le colonne comprese tra la prima e l'ultima (quindi equivale a M1[3..4,1..5]). E' una matrice 2 x 5. |
Il comando Minor
> |
Minor(A,r,c); # determinante della matrice ottenuta sopprimendo la riga r e la colonna s da A, ed è equivalente a |
> |
Minor(A, r, c, output=['determinant']); |
Per avere la matrice:
> |
Minor(A, r, c, output=['matrix']); # crea la matrice ottenuta sopprimendo la riga r e la colonna s da A |
> |
Minor(A, r, c, output=['matrix','determinant']);# dà insieme matrice e determinantea del minore
|
> |
A:=Matrix([[-16,-17,87,-108],[8,9,-42,54],[-3,-3,16,-18],[-1,-1,6,-8]]): |
Eliminazione di Gauss
> |
GaussianElimination(A);
|
Polinomio caratteristico della matrice A
E' il determinante della matrice A-x*id, dove id è la matrice identica:
> |
Determinant(A-x*IdentityMatrix(4)); |
Maple ha un comando che lo dà direttamente:
> |
c:=CharacteristicPolynomial(A,x); |
Per il teorema di Hamilton Cayley si ha p(A)= 0 (matrice nulla). Verifica:
Polinomio minimo della matrice A
E' il polinomio m(x) monico di grado minimo tale m(A)=0. Divide tutti i polinomi f(x) tali che f(A)=0.
Maple ha il comando:
> |
m:=MinimalPolynomial(A,x); |
> |
rem(c,m,x); # il polinomio minimo divide in particolare il polinomio caratteristico |
Autovalori
Sono le radici del polinomio caratteristico
> |
Eigenvalues(A); # si può chiedere la lista delle radici: |
> |
Eigenvalues(A, output='list'); |
Forma normale di Smith di una matrice intera o polinomiale
Una matrice si dice in forma normale di Smith se:
i) è diagonale;
ii) i polinomi e_1(x),e_2(x),...,e_n(x) (gli interi) sulla diagonale sono tali che ognuno è multiplo del precedente (dal secondo in poi). Gli e_i(x) sono i fattori invarianti della matrice; i polinomi della fattorizzazione degli e_i(x) in potenze di polinomi irriducibili (in potenze di primi) sono i divisori elementari della matrice);
iii) il coefficiente direttore degli e_i(x) è 1.
Ogni matrice si può portare a forma normale di Smith mediante trasformazioni elementari.
> |
SmithForm(A-x*IdentityMatrix(4)); |
> |
expand((x-1)*(2-3*x+x^3));
|
L'ultimo polinomio e_n(x) coincide con il polinomio minimo.
La matrice A ha dunque tre divisori elementari (le cui radici sono gli autovalori della matrice):
e dunque ha tre blocchi di Jordan: un blocco 2 x 2, relativo alla radice doppia di
, e due
blocchi 1 x 1 relativi alle radici di x-1 e x+2.
Blocchi di Jordan
Dato un numero a, un blocco di Jordan relativo ad a è una matrice ha tutti a sulla diagonale principale, tutti 1 sulla diagonale secondaria superiore e zero altrove.
Forma di Jordan
Una matrice di Jordan è una matrice diagonale costituita da blocchi di Jordan. La forma di Jordan di una matrice A è la matrice che ha sulla diagonale blocchi di Jordan relativi agli autovalori di A: vi sono tanti blocchi quanti sono i divisori elementari e_i(x) (diversi da 1), ciascuno di dimensione pari al grado di e_i(x).
Sul campo complesso, ogni matrice A si può portare in forma di Jordan: esiste cioè una matrice Q tale che
AQ =J.
Il seguente comando fornisce sia J che Q:
> |
Q := JordanForm(A,output='Q'); |
Prodotto di una matrice per un vettore
> |
u:=<1|0|-1|1>; # vettore riga |
> |
v:=<1,0,-1,1>; # vettore colonna |
Sistemi di equazioni lineari
> |
solve({f,g,h},{x,y,z}); |
> |
M:=Matrix([[2,-1,3],[2,-1,1],[1,-4,2]]): |
> |
solve({f,g,h},{x,y,z,u}); |
> |
M1:=Matrix([[1,2,-3,4],[1,3,-1,0],[6,0,1,2]]); |