gpt4 book ai didi

python - 为什么scipy.optimize.root 会四次调用初始值的回调函数?

转载 作者:行者123 更新时间:2023-11-28 21:00:12 34 4
gpt4 key购买 nike

我正在玩弄 scipy.optimize.root,我试图了解它的作用和工作原理。

我的示例代码如下:

import numpy as np
from scipy.optimize import root

def func(x):
""" test function x + 2 * np.cos(x) = 0 """
f = x + 2 * np.cos(x)
print x,f
return f

def main():
sol = root(func, 0.3)

if __name__ == "__main__":
main()

使用 func 中的 print 语句,我得到以下输出:

[ 0.3] [ 2.21067298]
[ 0.3] [ 2.21067298]
[ 0.3] [ 2.21067298]
[ 0.3] [ 2.21067298]
[-5.10560121] [-4.33928627]
[-1.52444136] [-1.43176461]
[-0.80729233] [ 0.57562174]
[-1.01293614] [ 0.0458079]
[-1.03071618] [-0.0023067]
[-1.02986377] [ 7.49624786e-06]
[-1.02986653] [ 1.20746968e-09]
[-1.02986653] [ -6.66133815e-16]

到目前为止一切顺利。我现在想知道为什么它用初始值调用四次?非常感谢。

最佳答案

寻根例程首先会调用 input sanitizer它将调用以初始值传入的函数。 (第一次评估)

那么默认Powell root-finder (这是您正在使用的)将调用其内部 MINPACK 例程 hybrd ,它将在开始时评估一次(在初始值处进行第二次评估)。然后 hybrd 调用 fdjac1在这个位置找到近似的雅可比行列式。这需要两次评估,一次评估值本身(第 3 次!),另一个评估前一步,这是第四次调用,参数略有不同,如 Kanak 的回答中所述。

编辑:当调用函数的成本很高时,重复的回调评估可能是非常不受欢迎的。如果是这种情况,则可以 memoize该功能可以避免使用相同的输入进行重复评估,而无需打开数值例程的黑匣子。记忆化适用于纯函数(即没有副作用的函数),这通常是将数值函数传递给求根或最小化例程的情况。

关于python - 为什么scipy.optimize.root 会四次调用初始值的回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48789531/

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