【问题标题】:python scipy fsolve recursive functionpython scipy fsolve递归函数
【发布时间】:2019-02-01 23:39:23
【问题描述】:

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

【问题讨论】:

    标签: python recursion scipy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多