Scipy 优化牛顿正割法

Scipy optimize newton secant method

Scipy optimize.newton 的初始步长硬编码为 1e-4。使用具有不同步长(理想情况下,指定为参数)的此函数的最佳方法是什么?

# https://github.com/scipy/scipy/blob/v0.19.0/scipy/optimize/zeros.py#L160

else:
    # Secant method
    p0 = x0
    if x0 >= 0:
        p1 = x0*(1 + 1e-4) + 1e-4

初始步长不是1e-4,而是abs(x0)*1e-4 + 1e-4。例如,x0 = 1000 将导致初始步长为 0.1001。

如果目标是具有一定的初始步长 h,可以通过变量的线性变化来实现,x = x0 + 1e4*h*t 其中 t 是新变量。根据 t,起点是 0。因此牛顿法将进行大小为 1e-4 的步长,根据 x 转换为 h

示例:

root = newton(lambda t: func(x0 + 1e4*h*t), 0) * 1e4 * h  + x0

其中 func 是原始函数。这 returns 原始变量 x 的根。