2013-06-03 13 views
6

Sto provando a sostituire due simboli nella mia equazione per la forma matrice di ciascuno di essi.Come sostituire il simbolo per matrice usando symPy e numPy

ho creato una funzione di collettore che ha costituito la mia espressione:

t, vS, = sy.symbols('t, vS', commutative = False) 
hS = t + vS 

eta = myComm(t,hS) 

dHs = myComm(eta,hS) 
print dHs.expand() 

cedendo l'espressione corretta che voglio:

2*t*vS*t + t*vS**2 - t**2*vS - 2*vS*t*vS - vS*t**2 + vS**2*t 

Così ora desidero sostituire i t simboli e VS con le matrici, tuttavia quando uso i sottotitoli ottengo un errore, "tipo inattaccabile: 'lista'" Presumo che abbia a che fare con la mia inizializzazione delle matrici o su come dovrebbero essere correttamente sostituiti in quanto sono nuovo sia per numPy che per symPy.

Il resto del codice:

tRel = ([e0, 0],[0,e1]) 
vtmp = ([v0, v1],[v2,v3]) 

dHs = dHs.subs(t, tRel) 
dHs = dHs.subs(vS, vtmp) 
print dHs 
+0

Provare a usare 'MatrixSymbol'. – asmeurer

risposta

4

Forse usano lambdify:

import sympy as sy 
import numpy as np  
from sympy.abc import x, y 

z = ((x+y)**2).expand() 
print(z) 
# x**2 + 2*x*y + y**2 
X = np.arange(6).reshape(2,3) 
Y = np.arange(1,7).reshape(2,3)  

f = sy.lambdify((x, y), z, 'numpy') 
print(f(X, Y)) 
# [[ 1 9 25] 
# [ 49 81 121]] 

assert np.allclose(f(X, Y), (X**2 + 2*X*Y + Y**2)) 
+0

Che ha funzionato perfettamente per le matrici numeriche! Grazie! Qualche idea su come raggiungere lo stesso obiettivo ma con (facendo riferimento al tuo codice sopra) X e Y sono composti da simboli piuttosto che da elementi numerici? – faceforest

+0

Per questo, usa il [metodo subs] (http://docs.sympy.org/dev/modules/core.html#sympy.core.basic.Basic.subs). – unutbu

Problemi correlati