【问题标题】:Collect and substitute terms in very long and nested expressions with sympy用 sympy 收集和替换非常长的嵌套表达式中的术语
【发布时间】:2019-07-17 09:52:13
【问题描述】:

短版:我想收集和替换一些我可以在表达式中清楚阅读但未被 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 所以我还不太了解,我认为应该尝试从括号的最内层导航表达式,分解并尝试替换,但我不知道如何去做。

【问题讨论】:

  • (x**2 + y**2)/rho_0**2 = v 求解为x,然后将x 替换为求解后的表达式。

标签: python sympy


【解决方案1】:

subs 在目标包含 Add 并乘以 Rational 时会遇到困难。首先定位添加并从那里继续会带来更大的成功:

>>> 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:添加一个符号,然后添加/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

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多