Operazioni con le matrici

Per sommare due matrici/vettori si usa il normale segno + , mentre per moltiplicare due matrici (matrice con vettore) si usa il segno &* .

> A := matrix(3,5):
B := matrix(3,7):
A + B;
A &* B;

> evalm(B);

Per ottenere i risultati bisogna chiederlo esplicitamente con il comando evalm

> evalm(A + B);
evalm (A &* B);

Perché questi errori?

> A := matrix (3,7,
[1,2,3,4,5,6,7,
9,8,7,6,5,4,3,
-1,-2,-3,-4,-5,-6,-7]):

B := matrix (3,7,
[-1,-2,-3,-4,-5,-6,-7,
-9,-8,-7,-6,-5,-4,-3,
1,2,3,4,5,6,7]):

evalm(A + B);

> C1 := evalm(A &* id(7));

> C2 := evalm(id(3) &* A);

> equal ( A , C1 ) and equal ( A , C2 ) ;

> A := matrix ( 5, 7);B := matrix ( 5, 7);

> evalm(3 * A) ;

In generale il prodotto di matrici non è commutativo :

> A := matrix( 3,3,[-7,2,3,-4,5,3,-7,11,9]):
B := matrix( 3,3,[-2,12,31,-14,1,1,0,-32,5]):
equal(A &* B , B &* A);

Per Maple il simbolo &* denota un prodotto che gode di tutte le proprietà formali della moltiplicazione tranne la proprietà commutativa, il comando evalm interpreta poi questo simbolo come prodotto di matrici.

L'elevamento a potenza di matrici quadrate si esegue semplicemente usando il simbolo ^

> A := matrix (2,2,[0,1,1,0]);
evalm(A^4631);

> A:=matrix(7,8);

> evalm(B &* A);

La traccia

La traccia di una matrice quadrata è data dalla somma dei suoi elementi sulla diagonale

tr(A) = sum(A[i,i],i = 1 .. n)

il calcolo della traccia di una matrice può essere effettueto mediante l'istruzione trace .

> trace(id(25750));

> A:=matrix(100,100,(i,j)->j+i):
trace(A);

> A:=matrix(20,20):
B:=matrix(20,20):
evalb (trace(A &* B) = trace(B &* A));

Questo calcolo mostra che prese due matrici arbitrarie, A e B 20x20 la traccia di AB coincide con la traccia di BA . Questo è un fatto generale:
Siano A e B due matrici n x n allora tr(AB) = tr(BA) .
Lo si provi.
Non è però in generale vero che
tr(AB) = tr(A)*tr(B) . Per esempio:

> A := matrix(2,2,[1,0,0,0]):
B := matrix(2,2,[0,0,0,1]):
trace( A &* B) ;
trace ( B ) * trace( A);

Le due matrici dell'esempio sono molto particolari, ciò non tragga in inganno. Tentiamo il seguente esperimento facciamo generare matrici quadrate 2x2 a caso per 500 volte e vediamo quante volte si ha che tr(AB) = tr(A)*tr(B) .

> successi := 0:
for i from 1 to 1000 do
A:=randmatrix(2,2):
B:=randmatrix(2,2):
if trace (A &* B) = trace (A) * trace (B) then
successi := successi + 1 fi:
od:
successi;

In effetti si può provare che

la probabilità che due matrici n x n con 2 <= n siano tali che tr(AB) = tr(A)*tr(B) è nulla .

Diversamente vanno le cose rispetto alla somma:

> A:=matrix(20,20):
B:=matrix(20,20):
evalb (trace(A + B) = trace(A) + trace(B));

Anche in questo caso il conto appena fatto è una dimostrazione solo nel caso di matrici 20x20 del seguente fatto generale:
siano A e B due matrici nxn, allora tr(A+B) = tr(A)+tr(B) .
Lo si provi.