2017-08-08 101 views
1

沒用piecewised解決方案從如何避免sympy

from sympy import * 
t,r = symbols('t r', real=True, nonnegative=True) 
c_x,c_y,a1,a2 = symbols('c_x c_y a1 a2', real=True) 
integrate(-r*(a1 - a2)*(c_x*cos(-a1*t + a1 + a2*t) + c_y*sin(-a1*t + a1 + a2*t) + r)/2,(t,0,1)) 

我獲得分段解決方案

Piecewise((-a1*c_x*r*cos(a2)/2 - a1*c_y*r*sin(a2)/2 - a1*r**2/2 + a2*c_x*r*cos(a2)/2 + a2*c_y*r*sin(a2)/2 + a2*r**2/2, Eq(a1, a2)), (-a1*r**2/2 + a2*r**2/2 - c_x*r*sin(a1)/2 + c_x*r*sin(a2)/2 + c_y*r*cos(a1)/2 - c_y*r*cos(a2)/2, True)) 

enter image description here

它不需要被piecewised因爲如果a1 = a2兩個表達式是0,因此第二個表達式實際上是一個全局非分段解決方案。

所以我的第一個問題是:我可以讓sympy給我非分段解決方案嗎? (通過設置一些選項或其他任何東西)

不管上面提到的可能性,因爲我可以接受a1不等於a2(它是沒有興趣的極限情況下),有沒有辦法告訴sympy的這樣的假設? (再次爲了obatin非分段解決方案)

從sympy新手提前感謝。

P.S.對於同樣的問題,Maxima直接給出了非分段解決方案。

+1

有一個關鍵字'conds',其默認值是「分段」。它也可以設置爲「分離」或「無」。後者可能是正確的方向。然而,由於它是一個確定的積分,所以你可以嘗試使用關鍵字'manual = True'。 – Uvar

+0

@Uvar謝謝,在這種情況下,所有3個選項都起作用,儘管我不明白他們做了什麼,並且該文檔並沒有太大的幫助。例如'conds ='separate''選項應該將解決方案作爲一個元組而不是分段,但給出了一個獨特的(但是正確的)解決方案。 – mmj

+0

移動到答案,因爲它似乎已經成功了。儘管如此,我和你一樣困惑於'conds ='separate'' – Uvar

回答

2

有一個關鍵字conds,其默認值是「分段」。它也可以設置爲「分離」或「無」。但是,由於它是一個確定的積分,因此您可以嘗試使用關鍵字manual = True。

如果將關鍵字設置爲conds='separate',它應該返回一個具有收斂條件的獨特元組。我試過了,只給出了一個解決方案。我不知道爲什麼這種行爲不符合預期。 關鍵字conds='none'不應該返回收斂條件,只是解決方案。這是我想你在找什麼。

另一個選項,它只在定積分的情況下有效,是另一個關鍵字manual=True。這模仿手工整合,方便地「忘記」檢查收斂條件。