2012-11-12 181 views
4

我在python中做了這個小測試程序,看看solvensolve是如何工作的。Sympy nsolve函數和多種解決方案

from sympy import * 

theta = Symbol('theta') 
phi = Symbol('phi') 

def F(theta,phi): 
    return sin(theta)*cos(phi)+cos(phi)**2 
def G(phi): 
    return ((1 + sqrt(3))*sin(phi) - 4*pi*sin(2*phi)*cos(2*phi)) 
solution1 = solve(F(pi/2,phi),phi) 
solution2 = solve(G(phi),phi) 
solution3 = nsolve(G(phi),0) 
solution4 = nsolve(G(phi),1) 
solution5 = nsolve(G(phi),2) 
solution6 = nsolve(G(phi),3) 
print solution1, solution2, solution3, solution4, solution5, solution6 

而且我得到這樣的輸出:

[pi/2, pi] [] 0.0 -0.713274788952698 2.27148961717279 3.14159265358979 

解決的第一個電話給我相應的功能的兩種解決方案。但不是第二個。我想知道爲什麼? nsolve似乎與初始測試值一起工作,但取決於該值,它會給出不同的數值解。有沒有一種方法可以用nsolve或其他函數列出所有數字解決方案,只需一行?

回答

6

解決方案的第一個調用給了我相應函數的兩​​個解決方案。但不是第二個。我想知道爲什麼?

一般情況下,你不能求解方程象徵顯然solve正是這麼做的。換句話說:如果solve可以解決你的等式,那麼考慮你自己是幸運的,典型的技術應用沒有分析解決方案,也就是說,不能象徵性地解決。

所以回退選項是數值求解方程,它從一個初始點開始。在一般情況下,即使存在解決方案,也不能保證nsolve將找到解決方案。

有沒有一種方法可以用nsolve或其他函數獲取所有數值解,只需一行?

一般來說,沒有。儘管如此,你可以從一些最初的猜測開始nsolve並跟蹤找到的解決方案。您可能希望在感興趣的時間間隔內均勻分配您的初始猜測。這稱爲多啓動方法

+0

謝謝!我把'nsolve'放在for循環中,以跟蹤不同初始猜測中找到的解,均勻分佈在[0,pi]中。 – aymenbh

+1

@ user1816760是的,這可以工作。多表面方法通常是適用的正確方法。請記住,很可能多次發現相同的解決方案,並且解決方案只是近似的。例如,假設確切的解決方案是0.5,那麼您會發現0.4999997和0.5000002等等。儘管它們有所不同,但只能保存其中的一個。我希望你明白我的意思。 – Ali

+0

是的,我明白了。我嘗試過使用其他函數,並且我有時會多次使用完全相同的解決方案,或者您提到的某些值彼此接近。爲了存儲數據,我會考慮這一點。 – aymenbh