Author | FX D |
Date | 2017-05-06T15:09:32 |
Project | a56d8802-5740-429a-b5da-e7eb8dc5bb82 |
Location | 2.sagews |
Original file | 2.sagews |
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.
Tutoriel sur l’algèbre matricielle avec sagemath
D’autres ressources sur internet (google “sagemath matrices”)
Soit la matrice
Quel est le système d’équations linéaires correspondant ? (Appliquer la méthode solve() ). Illustration graphique.
Calculer pour k=2,16,128. Calculer une valeur numérique approchée de avec la méthode (M^k).n()
Mêmes questions avec la matrice
Au passage listes, vecteurs, matrices dans Python, listes imbriquées, génération de listes
M=matrix([[1/3,1/2],[2/3,1/2]]);I=matrix([[1,0],[0,1]])
show("M=",M," , I=",I) #latex(M)
M-I
K=(M-I).right_kernel();K
X=K.basis();X;
M*X[0]
M*K.basis_matrix().transpose()
M.eigenvalues()
M.eigenvectors_right()
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
#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ésultat
S[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
#alternative avec solution_dict
var('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)
#Une alternative sans substitution explicite du paramètre mais avec un choix d'une des inconnues
var('y t');s1=solve([1/3*x+1/2*y==x,2/3*x+1/2*y==y,y==t],[x,y]);s1
f(t)=s1[0];f
f(1)
f(t)=[s1[0][0].rhs(),s1[0][1].rhs()];f
#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:]
#application :
var('x y');S=solve([1/3*x+1/2*y==x,2/3*x+1/2*y==y],[x,y]);S
param=[i.str()[1:] for i in maxima_calculus("%rnum_list")]
t=[var('t'+str(i)) for i in range(len(param))];t
r=[var(i) for i in param];r
v=vector([x,y])
v=v.subs(S).subs(r[0]==t[0])
print "v=", v
g(x)=[i.subs(t0==x) for i in v];g #mais g(x)=v.subs(t0==x) donne une erreur
g(1);g(1).parent()
diff(g,x)
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 M
for n in [2,16,128]:show(M^n)
for n in [2,16,128]:
show("M^",n,"=",(M^n).n())
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)
Avec la matrice N :
N=matrix([[1/2,0,0],[1/4,0,1],[1/4,1,0]]);N;latex(N)
#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]
n=3
x=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=1
A=matrix(3,range(9));A
for k in range(n):show(A[k]*vector(x)==0)
#cf http://stackoverflow.com/questions/3394835/args-and-kwargs pour l'expansion des arguments *arg
sum(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))
sol=solve(*([[A[k]*vector(x)==0 for k in range(2)]]+[inc for inc in x]),solution_dict=True);sol
sol[0][x0]
parametric_plot3d([sol[0][x[i]] for i in range(n)],(-1/2,1/2))
# n comme argument d'une fonction
def f(n):
y=[var('x'+str(i)) for i in range(n)]
f(10)
show_identifiers()
x=[var('x'+str(i)) for i in range(2)];x
x[1].subs(x1==1)
def f(*x):return(sum(x))
print f,',',f(*[1,2]),',',f(*x)