2015-10-13 26 views
1

表達我有以下表達式:代與sympy

p/l 

我從基質中提取。我以後限定P和L具有以下代碼

from sympy.abc import c,G,M,J,l,u,v,w 
us = (2*G*M/c**2) 
a = (J/(M*c)) 
p = (u**2 + a**2*cos(v)) 
l = (u**2 - us*u + a**2) 

我想替代表達p/l並與所有上述的表達式描述它來代替。我試着做下面的事情。如果g是一個sympy.Matrix對象,第一個元素定義爲p/l,然後

g[0,0].subs([(p,u**2 + a**2*cos(v)),(l,u**2 - us*u + a**2)]) 

應該做的伎倆,但不是我仍然得到p/l,表達保持不變。如果我只是在IPython的會話中鍵入p/l,我得到的輸出

(J**2*cos(v)/(M**2*c**2) + u**2)/(-2*G*M*u/c**2 + J**2/(M**2*c**2) + u**2) 

這是我的願望。 (好吧,我寧願首先應用簡化,如:(J**2*cos(v) + M**2*c**2*u**2)/(-2*G*M**3*u + J**2 + M**2*c**2*u**2))。

回答

2

您將替換具有相同表達式的表達式,因此替換的結果與原始表達式相同。

確保不要混淆SymPy符號和Python變量:

# Python variable: `p` stores an addition object: 
p = (u**2 + a**2*cos(v)) 

# SymPy symbol, it's just a symbol, no expressions: 
p = Symbol('p') 

# express symbol-expression relation in some way, like: 
{p: (u**2 + a**2*cos(v))} 
+0

感謝。我只想評論一下,因爲上面列出的表達式是相互依存的,所以我必須確保以正確的順序替換:'us,p,a,l = symbols('us,p,a,l' ); g = g.subs({p:u ** 2 + a ** 2 * cos(v)}); g = g.subs({l:u ** 2-us * u + a ** 2}); g = g.subs({us:2 * G * M/c ** 2}); g = g.subs({a:J /(M * c)}); g =簡化(g)' – imranal