使用sympy收集和替换非常长且嵌套的表达式中的术语

时间:2019-07-17 09:52:13

标签: python sympy

简短版本:我想收集并替换一些我可以在表达式中清楚阅读但未被sympy subs函数选择的术语。

我已经在python中完成了符号计算,但是最后我将不得不在C#中进行这些计算。为此,我正在尝试进行一些替换和部分数值计算,这些工作将在C#中进行硬编码。

例如,这是表达式之一(简单,我必须对表达式进行十倍长且括号级别更高的工作):

from sympy import symbols
x,y,rho_0,v = symbols('x y rho_0 v')
expr = 4*x*(x**2 + y**2)*(7*(-1 + 2*(x**2 + y**2)/rho_0**2)**2 + 8 - 14*(x**2 + y**2)/rho_0**2)/rho_0**4 + (x**2 + y**2)**2*(56*x*(-1 + 2*(x**2 + y**2)/rho_0**2)/rho_0**2 - 28*x/rho_0**2)/rho_0**4

抱歉,我不知道如何以更好的格式显示方程式。 但是关键是我可以清楚地看到,我可以用非常小的操作收集和替换(x**2 + y**2)/rho_0**2

使用expr.subs((x**2 + y**2)/rho_0**2, v)未给出任何结果。我上周开始使用sympy,所以我还不很了解,我认为应该尝试从括号的最内层浏览表达式,分解并尝试替换,但是我对如何执行此操作一无所知。

1 个答案:

答案 0 :(得分:0)

subs在目标包含加法并乘以有理数时很难。首先定位“添加”并继续操作会带来更多成功:

>>> expr
4*x*(x**2 + y**2)*(7*(-1 + (2*x**2 + 2*y**2)/rho_0**2)**2 + 8 - (14*x**2 + 
14*y**2)/rho_0**2)/rho_0**4 + (x**2 + y**2)**2*(56*x*(-1 + (2*x**2 + 
2*y**2)/rho_0**2)/rho_0**2 - 28*x/rho_0**2)/rho_0**4

将Rational与Add分开

>>> factor_terms(expr)
4*x*(x**2 + y**2)*(7*(-1 + 2*(x**2 + y**2)/rho_0**2)**2 + 8 + 7*(-3 + 4*(x**2 + 
y**2)/rho_0**2)*(x**2 + y**2)/rho_0**2 - 14*(x**2 + y**2)/rho_0**2)/rho_0**4

分两步执行操作:先添加符号,然后添加/添加符号

>>> _.subs(x**2+y**2, v).subs(v/rho_0**2, v)
4*v*x*(7*v*(4*v - 3) - 14*v + 7*(2*v - 1)**2 + 8)/rho_0**2

根据需要进行简化

>>> _.simplify()
4*v*x*(56*v**2 - 63*v + 15)/rho_0**2