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。)