Une matrice stochastique

> restart:with(linalg):

Warning, the protected names norm and trace have been redefined and unprotected

> A:=matrix([[1/6,0,1/3],[1/2,1/2,1/3],[1/3,1/2,1/3]]);

A := matrix([[1/6, 0, 1/3], [1/2, 1/2, 1/3], [1/3, ...

Caractérisation des matrices stochastiques

> evalm(vector([1,1,1])&*A);

vector([1, 1, 1])

Forcément... cela traduit exactement le fait que la somme sur chaque colonne vaut 1.

> evalm(A^50);

matrix([[131072639588880658482671286560519398925/80...
matrix([[131072639588880658482671286560519398925/80...
matrix([[131072639588880658482671286560519398925/80...
matrix([[131072639588880658482671286560519398925/80...
matrix([[131072639588880658482671286560519398925/80...
matrix([[131072639588880658482671286560519398925/80...

> evalm(vector([1,1,1])&*A);

vector([1, 1, 1])

Ainsi, A^50 est stochastique

A-I3 non inversible...

La relation de la qestion précédente, une fois transposée, nous dit que t(A)-I n'est pas injective donc par inversible. Il en est donc de même pour t(t(A)-I)=A-I...

> I3:=Matrix(3,3,shape=identity);

I3 := _rtable[17746208]

Ben oui...

> kernel(A-I3);

{vector([1, 8/3, 5/2])}

> colspace(A-I3);

{vector([1, 0, -1]), vector([0, 1, -1])}

A^100 et A^200

> map(evalf,evalm(A^100));

matrix([[.1621621622, .1621621622, .1621621622], [....

> map(evalf,evalm(A^200));

matrix([[.1621621622, .1621621622, .1621621622], [....

Tiens tiens...
Au fait, comment Maple fait-il pour calculer A^100 ? Plus précisément, il fait combien de multiplications matricielles ?

Un polynôme annulateur

> B:=evalm(A^3+a*A^2+b*A+c*I3);

B := matrix([[35/216+5/36*a+1/6*b+c, 1/6+1/6*a, 17/...

> eq:=seq(seq(B[i,j],i=1..3),j=1..3);

eq := 35/216+5/36*a+1/6*b+c, 31/72+4/9*a+1/2*b, 11/...
eq := 35/216+5/36*a+1/6*b+c, 31/72+4/9*a+1/2*b, 11/...

> solve({eq},{a,b,c});

{b = 1/36, a = -1, c = -1/36}

> minpoly(A,X);

-1/36+1/36*X-X^2+X^3

Cette fonction magique sera expliquée... l'année prochaine en maths.

> P:=X^3-X^2+X/36-1/36:

> evalm(subs(X=A,P));

matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0]])

Calcul de A^n

> factor(P);

1/36*(X-1)*(36*X^2+1)

Le reste dans la division de X^n par P est de la forme dX^2+eX+f : on trouve d e et f en évaluant cette relation en les racines de P :

> solve(P);

1, 1/6*I, -1/6*I

> S:=solve({1=d+e+f,(I/6)^n=-d/36+e*I/36+f,(-I/6)^n=-d/36-e*I/6+f},{d,e,f});

S := {e = -36/7*I*(-(-1/6*I)^n+(1/6*I)^n), f = 216/...
S := {e = -36/7*I*(-(-1/6*I)^n+(1/6*I)^n), f = 216/...

> assign(%):

> evalm(d*A^2+e*A+f*I3);

matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...
matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...
matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...
matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...
matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...
matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...
matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...
matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...
matrix([[6/37-216/259*I*(-1/6*I)^n+216/259*I*(1/6*I...

> evalm(subs(n=50,%)-A^50);

matrix([[0, 0, 0], [0, 0, 0], [0, 0, 0]])

"Limite" de A^n lorsque n tend vers l'infini

> d,e,f;

36/37-1296/259*I*(-1/6*I)^n+1296/259*I*(1/6*I)^n-21...
36/37-1296/259*I*(-1/6*I)^n+1296/259*I*(1/6*I)^n-21...

> limit(d,n=infinity);

limit(36/37-1296/259*I*(-1/6*I)^n+1296/259*I*(1/6*I...

Tsss...

> d_inf:=36/37:e_inf:=0:f_inf:=1/37:

> B:=evalm(d_inf*A^2+f_inf*I3);

B := matrix([[6/37, 6/37, 6/37], [16/37, 16/37, 16/...

> map(evalf,B);

matrix([[.1621621622, .1621621622, .1621621622], [....

Voir la troisième question...

Propriétés de la limite

> evalm(B^2);

matrix([[6/37, 6/37, 6/37], [16/37, 16/37, 16/37], ...

Ainsi, B est un projecteur.

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

matrix([[6/37, 6/37, 6/37], [16/37, 16/37, 16/37], ...

B commute bien avec A. On peut le montrer en passant à la limite la relation A^(n+1)=A.A^n...

> colspace(B);

{vector([1, 8/3, 5/2])}

C'est le noyau de A-I. Déjà, si AX=X, alors A^nX=X pour tout n, puis BX=X, donc X est dans l'image du projecteur. Réciproquement, si X est dans l'image de B, alors BX=X, donc ABX=AX, mais AB=B, donc ABX=BX=X, et ainsi AX=X.

> kernel(B);

{vector([-1, 0, 1]), vector([-1, 1, 0])}

C'est l'image de A-I. Preuve ? Déjà, au niveau des dimensions, le théorème du rang appliqué à B et à A-I nous assure que ça marche. Il reste à montrer une inclusion : à vous de jouer !