2017-07-27 59 views
0

Scipy optimize.newton的初始步长硬编码为1e-4。以不同步长使用此功能的最佳方式是什么(理想情况下,指定为参数)?Scipy优化牛顿割线方法

# 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 
+0

如果您确定这是一个有用的功能(非常非常确定),您可以打开功能请求并要求将初始步长添加到参数中。更好的是,你可以用'initial_step'(或其他)这样的变量代替'1e-4',并将它添加到你安装的scipy版本中,并告诉scipy你做的人,他们将'合并它在分布式版本中,如果他们认为合适(不是真正的github合并请求专家,对于不准确的错误) – gionni

回答

2

初始步长大小不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是原始功能。这将根据原始变量x返回根。