Thème 2 : Algèbre matricielle avec Sagemath, systèmes d’équations linéaires

AuthorFX D
Date2017-05-06T15:09:32
Projecta56d8802-5740-429a-b5da-e7eb8dc5bb82
Location2.sagews
Original file2.sagews

Thème 2 : Algèbre matricielle avec Sagemath, systèmes d’équations linéaires

Sujet de devoir : Application à la théorie des jeux : Ecrire un algorithme prenant en entrée une matrice M (la matrice de paiement du premier joueur J1 d’un jeu fini à somme nulle), rendant les sommets (au sens de la convexité) de l’ensemble des stratégies mixtes prudentes de J1. Dessiner le découpage des stratégies mixtes prudentes de J1, le paiement minimal sur chacun des morceaux, les stratégies mixtes prudentes. Commencer par le cas où J1 a deux stratégies pures (la matrice M a deux lignes).

Document de cours sur la recherche des équilibre de l’extension mixte d’un jeu (fini à deux joueur à somme nulle), exemple de recherche algorithmique des solutions ; voir la page web du cours.

Autre sujet de devoir (difficile) : Application aux Chaînes de Markov : Ecrire un algorithme prenant en entrée la matrice M des probabilités de transition d’une chaîne de Markov (homogène, à temps discret, ayant un ensemble fini d’états), rendant la ou les formes limites de Mn pour n grand. Simuler la chaîne de Markov de matrice M pour un état initial donné ; estimer les probabilités de présence en un état après un temps long, les temps d’atteinte d’un état donné.

Documents de cours sur cette page.


TP2 : Expérimenter l’algèbre matricielle avec Sagemath

Tutoriel sur l’algèbre matricielle avec sagemath

D’autres ressources sur internet (google “sagemath matrices”)

Soit M la matrice

(13122312)
et I la matrice unité. Exhiber avec Sagemath une base du noyau de MI (l’espace propre de M pour la valeur propre 1). Quelles sont les méthodes disponibles ? Comment utiliser la méthode (M_I).kernel() ?

Quel est le système d’équations linéaires correspondant ? (Appliquer la méthode solve() ). Illustration graphique.

Calculer Mk pour k=2,16,128. Calculer une valeur numérique approchée de Mk avec la méthode (M^k).n()

Mêmes questions avec la matrice

N=(120014011410)


Au passage listes, vecteurs, matrices dans Python, listes imbriquées, génération de listes

Corrigé du TP

M=matrix([[1/3,1/2],[2/3,1/2]]);I=matrix([[1,0],[0,1]])show("M=",M," , I=",I) #latex(M)
M= (13122312) , I= (1001)
M-I
[-2/3 1/2] [ 2/3 -1/2]
K=(M-I).right_kernel();KX=K.basis();X;M*X[0]
Vector space of degree 2 and dimension 1 over Rational Field Basis matrix: [ 1 4/3] [ (1, 4/3) ] (1, 4/3)
M*K.basis_matrix().transpose()
[ 1] [4/3]
M.eigenvalues()
[1, -1/6]
M.eigenvectors_right()
[(1, [ (1, 4/3) ], 1), (-1/6, [ (1, -1) ], 1)]
M.eigenvectors_right? #mieux que M.eigenvectors_right()?
File: /projects/sage/sage-7.5/src/sage/matrix/matrix2.pyx
Signature : M.eigenvectors_right(self, extend=True)
Docstring :
Compute the right eigenvectors of a matrix.

For each distinct eigenvalue, returns a list of the form (e,V,n)
where e is the eigenvalue, V is a list of eigenvectors forming a
basis for the corresponding right eigenspace, and n is the
algebraic multiplicity of the eigenvalue. If "extend = True" (the
default), this will return eigenspaces over the algebraic closure
of the base field where this is implemented; otherwise it will
restrict to eigenvalues in the base field.

EXAMPLES: We compute the right eigenvectors of a 3 x 3 rational
matrix.

   sage: A = matrix(QQ,3,3,range(9)); A
   [0 1 2]
   [3 4 5]
   [6 7 8]
   sage: es = A.eigenvectors_right(); es
   [(0, [
   (1, -2, 1)
   ], 1),
   (-1.348469228349535?, [(1, 0.1303061543300932?, -0.7393876913398137?)], 1),
   (13.34846922834954?, [(1, 3.069693845669907?, 5.139387691339814?)], 1)]
   sage: A.eigenvectors_right(extend=False)
   [(0, [
   (1, -2, 1)
   ], 1)]
   sage: eval, [evec], mult = es[0]
   sage: delta = eval*evec - A*evec
   sage: abs(abs(delta)) < 1e-10
   True

Méthode solve, exploitation de la réponse

var('x,y')show(1/3*x+1/2*y==x);show(2/3*x+1/2*y==y)S=solve([1/3*x+1/2*y==x,2/3*x+1/2*y==y],[x,y]);S
(x, y)
13x+12y=x
23x+12y=y
[[x == 3/4*r16, y == r16]]
#le paramètre r* est créé par Sage et change à chaque exécution. Peut on lui assigner une valeur ?#solution après visualisation du résultatS[0][1].rhs() #rhs pour "right hand side"vector([x,y]).subs(S).subs(S[0][1].rhs()==1) #[x,y].subs(S).subs(S[0][1].rhs()==1) donne une erreur
r16 (3/4, 1)
#alternative avec solution_dictvar('x y');T=solve([1/3*x+1/2*y==x,2/3*x+1/2*y==y],[x,y],solution_dict=True);T[T[0][x],T[0][y]]vector([T[0][x],T[0][y]]).subs(T[0][y]==1)
(x, y) [{y: r5, x: 3/4*r5}] [3/4*r5, r5] (3/4, 1)
#Une alternative sans substitution explicite du paramètre mais avec un choix d'une des inconnuesvar('y t');s1=solve([1/3*x+1/2*y==x,2/3*x+1/2*y==y,y==t],[x,y]);s1
(y, t) [[x == 3/4*t, y == t]]
f(t)=s1[0];f
t |--> (x == 3/4*t, y == t)
f(1)
(x == (3/4), y == 1)
f(t)=[s1[0][0].rhs(),s1[0][1].rhs()];f
t |--> (3/4*t, t)
#Liste des paramètres dans la réponse de solve :#maxima_calculus("%rnum_list") cf https://ask.sagemath.org/question/26205/questions-about-the-parameters-in-the-output-of-solve/var('y');solve([1/3*x+1/2*y==x,2/3*x+1/2*y==y],[x,y])a=maxima_calculus("%rnum_list")print a, a[0].str()[1:]
y [[x == 3/4*r12, y == r12]] [%r12] r12
#application :var('x y');S=solve([1/3*x+1/2*y==x,2/3*x+1/2*y==y],[x,y]);Sparam=[i.str()[1:] for i in maxima_calculus("%rnum_list")]t=[var('t'+str(i)) for i in range(len(param))];tr=[var(i) for i in param];rv=vector([x,y])v=v.subs(S).subs(r[0]==t[0])print "v=", v
(x, y) [[x == 3/4*r3, y == r3]] [t0] [r3] v= (3/4*t0, t0)
g(x)=[i.subs(t0==x) for i in v];g #mais g(x)=v.subs(t0==x) donne une erreur
x |--> (3/4*x, x)
g(1);g(1).parent()
(3/4, 1) Vector space of dimension 2 over Symbolic Ring
diff(g,x)
x |--> (3/4, 1)

Dessin

show(implicit_plot(1/3*x+1/2*y==x,(x,-2,2),(y,-2,2))+implicit_plot(2/3*x+1/2*y==y,(x,-2,2),(y,-2,2))+point(v,size=20))
#Puissances de Mfor n in [2,16,128]:show(M^n)
(4951259712)
(302261775799705277476864403015701065940369969152403015701065705277476864537354268087940369969152)
(4298562765586746942926842915395475513596859808294798813523998167130845417777347052009458452416055591002997978636907620016263346925610953172600621935453056488932905663863930814714312135540305563746304573141702078232925723579055386063401812914641105973175136533088950779389036979606934594460322140745133733063818254349335501779590081460423013416258060407531857720755181857441961908284738707408499507257314170207823292572357905538606340181291464110597317513653308895077938903697960693459446032214074510029979786369076200162633469256109531726006219354530564889329056638639308147143121355403055637463047641889361043105676314387405147512024172195214746309001820441186010391853826394759127926137628543271337330638182543493355017795900814604230134162580604075318577207551818574419619082847387074084995072)
for n in [2,16,128]:    print    show("M^",n,"=",(M^n).n())
M^ 2 = (0.4444444444444440.4166666666666670.5555555555555560.583333333333333)
M^ 16 = (0.4285714285716310.4285714285712770.5714285714283690.571428571428723)
M^ 128 = (0.4285714285714290.4285714285714290.5714285714285710.571428571428571)
show((v/sum(v)).column().n()) # la limite de chacune des colonnes de M^n qd n tend vers l'infini (telle que prédite par la théorie des chaînes de Markov)
(0.4285714285714290.571428571428571)

Avec la matrice N :

N=matrix([[1/2,0,0],[1/4,0,1],[1/4,1,0]]);N;latex(N)
[1/2 0 0] [1/4 0 1] [1/4 1 0] \left(
120014011410
\right)
#points fixes de la matrice (ou espace propre pour la valeur propre 1)var('x,y,z')show(implicit_plot3d(1/2*x==x,(x,-1,1),(y,-1,1),(z,-1,1))+implicit_plot3d(1/4*x+z==y,(x,-1,1),(y,-1,1),(z,-1,1),color='darkkhaki')+implicit_plot3d(1/4*x+y==z,(x,-1,1),(y,-1,1),(z,-1,1),color='aquamarine'))  #,1/4*x+z==y,1/4*x+y==z]
(x, y, z)

Complément : Système d’équations avec un nombre n d’inconnues, où n est un paramètre

n=3x=var(['x'+str(i) for i in range(n)]);x # fait une erreur si n n'a pas de valeur ou si n=1 !x=[var('x'+str(i)) for i in range(n)] # ok si n=1A=matrix(3,range(9));Afor k in range(n):show(A[k]*vector(x)==0)#cf http://stackoverflow.com/questions/3394835/args-and-kwargs pour l'expansion des arguments *argsum(implicit_plot3d(*([A[k]*vector(x)==0]+[(x[i],-1,1) for i in range(n)])) for k in range(n))#for k in range(n-1):#    for l in [k+1..n-1]:#        eqs=eqs+[A[k]*vector(x)==A[l]*vector(x)]#eqs#show(sum(implicit_plot3d(*([eq]+[(x[i],-1,1) for i in range(n)])) for eq in eqs))
(x0, x1, x2) [0 1 2] [3 4 5] [6 7 8]
x1+2x2=0
3x0+4x1+5x2=0
6x0+7x1+8x2=0
sol=solve(*([[A[k]*vector(x)==0 for k in range(2)]]+[inc for inc in x]),solution_dict=True);solsol[0][x0]
[{x0: r15, x1: -2*r15, x2: r15}] r15
parametric_plot3d([sol[0][x[i]] for i in range(n)],(-1/2,1/2))
# n comme argument d'une fonctiondef f(n):    y=[var('x'+str(i)) for i in range(n)]f(10)show_identifiers()
['x9', 'x2', 'x3', 'x0', 'x6', 'x7', 'x4', 'x5', 'x8', 'x1', 'f']
x=[var('x'+str(i)) for i in range(2)];xx[1].subs(x1==1)def f(*x):return(sum(x))print f,',',f(*[1,2]),',',f(*x)
[x0, x1] 1 , 3 , x0 + x1