为了账号安全,请及时绑定邮箱和手机立即绑定

python scipy fsolve递归函数

python scipy fsolve递归函数

拉风的咖菲猫 2021-10-26 18:58:55
scipy.optimize.fsolve似乎不适用于调用自身的函数。这是一个 MWEfrom scipy.optimize import fsolvedef 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 + xf.n=2soln = fsolve(f, -1.5) # Expect [-2]print(soln) # [0.]相比def g(x):    return 1 + 1 + xsoln = fsolve(g, -1.5)print(soln) # [-2.]是否有将 fsolve 与此类功能一起使用的解决方法?我的用例是我有一个由递归公式定义的函数,手动输入 large 需要很长时间n。
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

问题不在于 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.]


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信