收集较大部分中的分数表达式(sympy)

时间:2015-09-16 15:21:07

标签: python sympy algebra computer-algebra-systems

我正在使用带有sympy符号数学库的IPython(Anaconda发行版)。

我有以下表达式:

       t⋅(h + l)       
───────────────────────
l⋅(h + l⋅sin(θ))⋅cos(θ)

我想根据(h/l)(t/l)对其进行重新排列:

    (t/l)⋅((h/l)+1)
─────────────────────
((h/l)+sin(θ))⋅cos(θ)

这很容易手工完成;只需将分数的两边除以l并重新排列。

到目前为止,我对于sympy的内置函数没有运气。

我尝试使用expand后跟collect(expr,h/l),但它不会更改表达式。我怀疑这不起作用,因为 没有h/l条款,它首先要收集它。

如何表达同意?

第一个用于节省时间的表达式的Python代码: t*(h + l)/(l*(h + l*sin(theta))*cos(theta))

3 个答案:

答案 0 :(得分:1)

建立在strubbly的想法上:

In [2]: expr = t *(h +l )/(l *(h +l *sin (theta ))*cos (theta ))

In [3]: expr
Out[3]: 
           t*(h + l)           
-------------------------------
l*(h + l*sin(theta))*cos(theta)

In [4]: repl1 = [x-h/l, y-t/l]

In [7]: repl2 = solve(repl1, t, l)

In [8]: repl2
Out[8]: 
    h     h*y 
{l: -, t: ---}
    x      x  
In [9]: simplify(expr.subs(repl2)).subs({x: h/l, y: t/l})
Out[9]: 
            /h    \          
          t*|- + 1|          
            \l    /          
-----------------------------
  /h             \           
l*|- + sin(theta)|*cos(theta)
  \l             /   

即,引入两个变量 x y 来替换 h / l t / l (在[4]中,反转等式以获得替换字典(In [7])。替换,简化(摆脱 l ),然后替换 x y 的原始值。一个变量仍然被简化了。

应该告诉 .subs(...)不要在替换后评估表达式。我不知道目前是否支持。

答案 1 :(得分:0)

所以我使用了x = h/ly = t/l并替换了。然后简化。这给了我

       x*(y + 1)/((y + sin(theta))*cos(theta))

我认为你想要的是什么。我看不出如何简化“关于”h/l,但这有效...

答案 2 :(得分:-1)

我真的不知道你是否可以使用正则表达式,但如果可以的话,你可以使用re.subh的所有实例替换为(h/1)。或者如果表达式是一个字符串,您可以使用str.replace来做同样的事情。