optimize.newton如果不提供fprime,必须用割线法,如何选择x1?
How does optimize.newton choose x1 if fprime is not provided and it must use the secant method?
scipy.optimize.newton
文档中写道:“如果提供了 func 的导数 fprime,则使用 Newton-Raphson 方法,否则使用正割法。”正割法需要 func 的零值 x0 和 x1 的两个估计值。但是提供的示例表明 optimize.newton
在仅输入 x0 时使用正割法。所以我假设 optimize.newton
以某种方式根据我们输入的 x0 分配 x1,但我不确定并且很想知道发生了什么。任何澄清将不胜感激!
简短回答:使用了 x0
的扰动版本。
看起来应该更好地记录实际行为。该函数的源代码从 this line in the file zeros.py
开始;与您的问题相关的代码是:
# Secant method
if x1 is not None:
if x1 == x0:
raise ValueError("x1 and x0 must be different")
p1 = x1
else:
eps = 1e-4
p1 = x0 * (1 + eps)
p1 += (eps if p1 >= 0 else -eps)
p1
是实际的值,会在后面的代码中作为第二个点使用。因此,如果 x1
为 None,则 p1
设置为 x0
.
的略微修改版本
(有关该计算的讨论,请参阅 this github issue。)
scipy.optimize.newton
文档中写道:“如果提供了 func 的导数 fprime,则使用 Newton-Raphson 方法,否则使用正割法。”正割法需要 func 的零值 x0 和 x1 的两个估计值。但是提供的示例表明 optimize.newton
在仅输入 x0 时使用正割法。所以我假设 optimize.newton
以某种方式根据我们输入的 x0 分配 x1,但我不确定并且很想知道发生了什么。任何澄清将不胜感激!
简短回答:使用了 x0
的扰动版本。
看起来应该更好地记录实际行为。该函数的源代码从 this line in the file zeros.py
开始;与您的问题相关的代码是:
# Secant method
if x1 is not None:
if x1 == x0:
raise ValueError("x1 and x0 must be different")
p1 = x1
else:
eps = 1e-4
p1 = x0 * (1 + eps)
p1 += (eps if p1 >= 0 else -eps)
p1
是实际的值,会在后面的代码中作为第二个点使用。因此,如果 x1
为 None,则 p1
设置为 x0
.
(有关该计算的讨论,请参阅 this github issue。)