2012-03-10 33 views
11

我有一个像等式:因子/收集表达Sympy

 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₃ 

但我能得到迄今最佳的使用equation.factor(V1,V2)

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

。还有其他一些选择来进一步分解变量吗?

回答

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₃ 

您也可以看看添加和穆尔的评估=假选项,手动建立这些表达式。我不知道一个很好的通用解决方案。

如果您有很多条款,[3]可以是列表理解。

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

3

这里我有sympy 0.7.2安装和sympy.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