我正在尋找一種有效的方法來查找間隔[a,b]上函數f的所有根。 我遇到的問題是,scipy.optimize中的所有好方法都要求f(a)和f(b)有不同的符號,或者我提供了初始猜測x0,但在運行碼。函數f是光滑的(至少是C1),並且沒有病態行爲[沒有像sin(1/x)]。然而,它需要建立一個矩陣A(x)並找到它的特徵值,因此是耗時的。預計在[a,b]上有0到10個根,其位置完全是任意的。我承擔不起他們中的任何一個(例如,我不能接受100次初始猜測x0,只希望我能抓住所有的根源)。使用Python在間隔上查找多個根
我在考慮實施類似這樣的:
- 找到所有極值{M_1,M_2 ..,m_k} f控制scipy.optimize [也許FMIN,但我不知道哪些方法是最有效的]:
- 搜索從點開始梯度算法[初始猜測]
- 搜索一個最大M_2從點M_1開始的最小M_1 + DX〔迫使梯度算法前進]
- 搜索最小m_3 ...
- 如果兩個連續的極值m_i和m_(i + 1)有相反的符號,則應用間隔[m_i,m_(i + 1)]上的brentq來查找根。
是否有解決這個問題的一個更好的辦法?
如果不是,fmin和brentq是scipy.optimize庫中的最佳選擇,以便儘量減少對函數f的調用次數。
*「查找所有極值...」*這將用一個不同的難題替換一個難題。 –
只是爲了增加痛苦,任何根預期是複雜的共軛?但是對於手頭的問題,您需要深入挖掘功能,以便真正瞭解它。然後你有更多的信息來智能地攻擊問題,而不是盲目的。 –
既然你的函數是C1,一種方法可能是用足夠多項式的多項式(曲線擬合)在數值上逼近你的函數,並使用多項式的根(很容易找到)作爲原函數的近似根。如有必要,這些根可以通過根發現算法進行改進。 – Stelios