2015-09-16 21 views
2

我使用IPython(Anaconda分布式)与sympy符号数学库。在较大分数内收集分数表达式(sympy)

我有以下表现:

 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它首先收集的条款。

如何获得sympy来做到这一点?

为第一表达Python代码为您节省时间: t*(h + l)/(l*(h + l*sin(theta))*cos(theta))

回答

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ÿ到替换h/lt/l(In [4]),颠倒等式以获得替换字典(In [7])。替换,简化(以摆脱l),然后将原始值替换为xy。一个变量仍然被简化。

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

+0

确定这似乎工作,但我想确保我完全信任它之前了解发生了什么。如果我理解正确,你创建替代'x = h/l'和'y = t/l',(2)使用solve来重新排列这些变量,使得't'或'l'是主题,(3)替换为'expr'并使用'simplify'来取消任何非'x' /'y'变量,以及(4)替代'x = h/l'和'y = t/l'。我将在我正在使用的一些更复杂的表达式上尝试这一点,如果它有效,我会将这个答案标记为已接受。 – byntje

+0

顺便说一下,我不知道'solve'可能需要一整套方程,我不知道你可以用'subs'来使用字典。我一直在使用嵌套列表!头脑风暴! – byntje

+0

是的,这就是我的意思。尽管我手动解决了这个问题。 (顺便说一下)。 – strubbly

-1

我真的不知道,如果你可以使用正则表达式,但是如果可以的话,你可以使用re.sub(h/1)取代的h所有实例。或者如果表达式是字符串,则可以使用str.replace执行相同的操作。

+0

这不仅仅是一个字符串替换的例子;它也必须具有数学意义。我想我可以对它进行破解,以便在分数的两边都加上'/ l',但那不是我正在寻找的。在sympy中必须有一种方法来做到这一点。 – byntje

0

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

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

我认为是你想要的。我看不出如何简化“相对于” h/l但这个工程......

+0

你能否详细说明你是如何进行替换的?从你的答案看来,你用第二个表达式代替了“x = h/l”和“y = t/l”,但这不是我的意思。我想*得到*第二个表达式,我们必须假设我不知道它是什么样子。 – byntje