gpt4 book ai didi

python scipy fsolve 递归函数

转载 作者:太空宇宙 更新时间:2023-11-03 21:18:46 24 4
gpt4 key购买 nike

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.]

关于python scipy fsolve 递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54482316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com