【问题标题】:Scipy optimize newton secant methodScipy优化牛顿割线法
【发布时间】:2018-01-03 14:25:04
【问题描述】:

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 替换为 initial_step (或其他东西)之类的变量来自己修复它,并将其添加到您安装的 scipy 版本中,并告诉 scipy 的人您做到了,他们会如果他们认为合适,将其合并到分布式版本中(不是真正的 github 合并请求专家,抱歉不准确)

标签: python optimization scipy newtons-method


【解决方案1】:

初始步长不是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 的根。

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多