2016-10-19 3 views
1

Je veux évaluer une expression contenant des symboles (données dans la matrice s) dont les valeurs sont données dans la matrice v:Maxima: la conversion d'une équation de matrice dans une liste d'assignation

s: matrix([a,b,c]); 
v: matrix([1,2,3]); 
expr: a*b+c; 
ev(expr,s=v); /* not working but gives the idea of the purpose */ 

Comment puis-je générer la liste d'assignation correcte [a=1,b=2,c=3] à passer à ev?

Merci d'avance.

Répondre

1

Vous pouvez utiliser des listes au lieu de matrices et de créer un adaptateur pour subst

(%i1) msubst(a, b, c):=block([L: map(lambda([a0, b0], a0=b0), a, b)], subst(L, c)) $ 
(%i2) s : [a,b,c] $ 
(%i3) v : [1,2,3] $ 
(%i4) msubst(s, v, a*b+c); 
(%o4)         5 

Si vous avez besoin de convertir une matrice à une liste

(%i1) m2l(M):=block([L: []], matrixmap(lambda([e], push(e, L)), M), L) $ 
(%i2) s: matrix([a,b,c]) $ 
(%i3) m2l(s); 
(%o3)        [c, b, a] 
+0

Merci, il semble fonctionne, seulement j'ai remarqué que la fonction 'm2l' renvoie les éléments dans l'ordre inverse. Sur la liste de diffusion Maxima, j'ai trouvé une autre façon de convertir la matrice en liste, ce qui préserve l'ordre; 'xreduce ('append, args (M))'. Vous pourriez vouloir prendre note et mettre à jour votre réponse. – mmj

2

Sur la liste de diffusion Maxima j'ai trouvé un moyen de générer la liste d'affectation [a=1,b=2,c=3] à passer à ev, en utilisant une méthode beaucoup plus générale (qui permet de résoudre les équations matricielles A=B avec unknonws des deux côtés - jamais cuit un hot-dog avec une flamme lancée r?). À condition qu'une matrice peut être convertie en une liste avec la fonction

m2l(M):= xreduce('append,args(M)) $ 

la liste assignation [a=1,b=2,c=3] à passer à ev peut être obtenu par

assign_list(s,v):= algsys(xreduce('append, args(s-v)), m2l(s)) $ 

Par conséquent, les matrices données s, v et expression expr , expr peut être évaluée simplement avec

ev(expr,assign_list(s,v));