2017-07-27 58 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返回根。