2015-09-16 61 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