簡體   English   中英

python scipy fsolve遞歸函數

[英]python scipy fsolve recursive function

scipy.optimize.fsolve似乎不適用於調用自身的函數。 這是MWE

from scipy.optimize import fsolve
def f(x):
    if f.n==0:
        return x
    f.n -= 1
    return 1+f(x)
# Consider n=2 i.e. f(x) = 1 + 1 + x = 2 + x
f.n=2
soln = fsolve(f, -1.5) # Expect [-2]
print(soln) # [0.]

相比

def g(x):
    return 1 + 1 + x
soln = fsolve(g, -1.5)
print(soln) # [-2.]

是否有將fsolve與此類功能一起使用的解決方法? 我的用例是,我有一個由遞歸公式定義的函數,對於大的n ,需要花費很長時間才能手動輸入。

問題不在於fsolve無法處理遞歸函數,而是問題在於您的遞歸函數正在污染全局名稱空間以進行遞歸。 添加簡單的打印語句有助於使事情更清楚。

from scipy.optimize import fsolve
def f(x):
    print(f.n)
    if f.n==0:
        return x
    f.n -= 1
    return 1+f(x)
# Consider n=2 i.e. f(x) = 1 + 1 + x = 2 + x
f.n=2
soln = fsolve(f, -1.5) # Expect [-2]
print(soln) # [0.]

輸出:

2
1
0
0
0
0
0
0
[0.]

求解器本質上必須使用不同的輸入來運行函數,並猜測要迭代運行的下一個“最佳”值。 使用依賴於全局變量的函數,您的函數“狀態”本身就不穩定,並且第一次運行該函數時,全局變量會受到影響,並且您的函數不再具有正確的全局變量才能在下一次迭代時正確運行解算器。

您需要修改遞歸函數,並通過顯式參數傳遞使其獨立。

from scipy.optimize import fsolve
def f(x, state):
    print(state)
    if state==0:
        return x
    state -= 1
    return 1+f(x, state)
# Consider n=2 i.e. f(x) = 1 + 1 + x = 2 + x
state=2
soln = fsolve(lambda x: f(x, state), -1.5) #wrapping the 2 arg recursive function with a lambda to mimic a 1 argument function. You may also use functools.partial for this.
print(soln) 

輸出:

2
1
0
2
1
0
2
1
0
2
1
0
2
1
0
2
1
0
[-2.]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM