2016-01-05 13 views
6

Ciao Sto cercando di eseguire una moltiplicazione di matrice ed espanderlo in seguito. Tuttavia, sympy non sembra supportare l'espansione delle equazioni di matrice. Ad esempio Runge-Kutta 4 per matrici:Come espandere l'espressione di matrice in sympy

from sympy import init_session 
init_session() 
from sympy import * 

A = MatrixSymbol('A', 3, 3) 
x = MatrixSymbol('x', 3, 1) 
dt = symbols('dt') 

k1 = A*x 
k2 = A*(x + S(1)/2*k1*dt) 
k3 = A*(x + S(1)/2*k2*dt) 
k4 = A*(x + k3*dt) 
final = dt*S(1)/6*(k1 + 2*k2 + 2*k3 + k4) 
final.expand() 

Con risultato

Traceback (most recent call last) 
<ipython-input-38-b3ff67883c61> in <module>() 
    12 final = dt*1/6*(k1+2*k2+2*k3+k4) 
    13 
---> 14 final.expand() 

AttributeError: 'MatMul' object has no attribute 'expand' 

Spero l'espressione può essere espansa come la variante scalare:

A,x,dt = symbols('A x dt') 
k1 = A*x 
k2 = A*(x+k1*dt*S(1)/2) 
k3 = A*(x+k2*dt*S(1)/2) 
k4 = A*(x+k3*dt) 
final = x+dt*(S(1)/6)*(k1+k2+k3+k4) 
collect(expand((final)),x) 

Con risultato:

x*(A**4*dt**4/24 + A**3*dt**3/8 + A**2*dt**2/3 + 2*A*dt/3 + 1) 

È possibile modificare anche un'espressione di matrice?

La risposta di nicoguaro elimina l'errore, ma espande l'intera espressione in una matrice. Come illustrato nell'esempio scalare, non quello che sto cercando

+0

Dovrebbe funzionare. Ho aperto https://github.com/sympy/sympy/issues/10360. – asmeurer

risposta

0

Penso che sia possibile espandere le espressioni Matrix. Ma quello che hai non è una matrice ma la moltiplicazione di due matrici simboliche (Matsymbols). Se trasformi la tua espressione in una matrice puoi ottenere l'espansione desiderata. Vedi la riga in basso

from sympy import init_session 
init_session() 
from sympy import * 

A = MatrixSymbol('A', 3, 3) 
x = MatrixSymbol('x', 3, 1) 
dt = symbols('dt') 

k1 = A*x 
k2 = A*(x + S(1)/2*k1*dt) 
k3 = A*(x + S(1)/2*k2*dt) 
k4 = A*(x + k3*dt) 
final = dt*S(1)/6*(k1 + k2 + k3 + k4) 
Matrix(final).expand() 
+0

Grazie per la tua risposta !, Questo non dà un errore, ma non è quello che sto cercando, spero che l'espressione possa essere semplificata, espansa e raccolta proprio come la variante scalare (ho aggiunto lo scalare variante alla domanda) –