用sympy收集和替换超长嵌套表达式中的术语

2024-06-28 15:52:06 发布

您现在位置:Python中文网/ 问答频道 /正文

短版本:我想要收集并替换一些我在表达式中可以清楚阅读但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,所以我还不太清楚,我想应该试着从括号的最内层来导航表达式,分解并尝试替换,但是我不知道怎么做。你知道吗


Tags: 函数from版本编码表达式级别括号数值
1条回答
网友
1楼 · 发布于 2024-06-28 15:52:06

subs当一个目标包含一个Add并被一个有理数相乘时,会遇到困难。首先瞄准Add并从那里继续会带来更多成功:

>>> 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

把有理数和加法分开

>>> 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:make Add a Symbol,然后Add/Pow该符号

>>> _.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

相关问题 更多 >