Sympy中的因子/收集表达

时间:2012-03-10 18:33:21

标签: python sympy symbolic-math symbolic-computation

我有一个类似的公式:

     R₂⋅V₁ + R₃⋅V₁ - R₃⋅V₂
i₁ = ─────────────────────
     R₁⋅R₂ + R₁⋅R₃ + R₂⋅R₃

已定义,我想将其拆分为仅包含单个变量的因子 - 在本例中为V1和V2。

因此我希望

        -R₃                        (R₂ + R₃)
i₁ = V₂⋅───────────────────── + V₁⋅─────────────────────
        R₁⋅R₂ + R₁⋅R₃ + R₂⋅R₃      R₁⋅R₂ + R₁⋅R₃ + R₂⋅R₃

但到目前为止我能做的最好的是

     -R₃⋅V₂ + V₁⋅(R₂ + R₃)
i₁ = ─────────────────────
     R₁⋅R₂ + R₁⋅R₃ + R₂⋅R₃

使用equation.factor(V1,V2)。是否有其他选择因子或另一种方法来进一步分离变量?

2 个答案:

答案 0 :(得分:6)

如果可以从因子算法(在这种情况下是分母)中排除某些东西,那就很容易了。我不知道如何做到这一点,所以这是一个手动解决方案:

In [1]: a
Out[1]: 

r₁⋅v₁ + r₂⋅v₂ + r₃⋅v₂
─────────────────────
r₁⋅r₂ + r₁⋅r₃ + r₂⋅r₃

In [2]: b,c = factor(a,v2).as_numer_denom()

In [3]: b.args[0]/c + b.args[1]/c
Out[3]: 

        r₁⋅v₁                v₂⋅(r₂ + r₃)    
───────────────────── + ─────────────────────
r₁⋅r₂ + r₁⋅r₃ + r₂⋅r₃   r₁⋅r₂ + r₁⋅r₃ + r₂⋅r₃

您还可以查看Add和Mul中的evaluate = False选项,手动构建这些表达式。我不知道一个很好的通用解决方案。

如果你有很多术语,在[3]中可以是列表理解。

您还可以检查是否可以将其视为v1和v2中的多元多项式。它可能会提供更好的解决方案。

答案 1 :(得分:3)

我已安装sympy 0.7.2sympy.collect()可用于此目的:

import sympy
i1 = (r2*v1 + r3*v1 - r3*v2)/(r1*r2 + r1*r3 + r2*r3)

sympy.pretty_print(sympy.collect(i1, (v1, v2)))

# -r3*v2 + v1*(r2 + r3)
# ---------------------
# r1*r2 + r1*r3 + r2*r3