1 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
問(wèn)題不在于 fsolve 無(wú)法處理遞歸函數(shù),而是您的遞歸函數(shù)正在污染全局命名空間以進(jìn)行遞歸。添加一個(gè)簡(jiǎn)單的打印語(yǔ)句有助于更清楚地了解正在發(fā)生的事情。
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.]
求解器本質(zhì)上必須使用不同的輸入運(yùn)行函數(shù),并猜測(cè)下一個(gè)“最佳”值以迭代運(yùn)行。對(duì)于依賴全局變量的函數(shù),您的函數(shù)“狀態(tài)”本身是不穩(wěn)定的,并且第一次運(yùn)行函數(shù)時(shí),全局變量會(huì)受到影響,并且您的函數(shù)不再具有正確的全局變量以在下一次迭代中正確運(yùn)行求解器。
您需要修改遞歸函數(shù),并通過(guò)顯式參數(shù)傳遞使其獨(dú)立。
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.]
添加回答
舉報(bào)