2017-06-03 84 views
1

我試圖找到一個函數Minimum of a function with BFGS method(第29頁的PDF文檔)爲什麼我沒有從BFGS中得到與在MATLAB中最小化的結果相同的結果?

的mimimum而且我沒有得到相同的結果中的鏈接報道的那些,我已經有和沒有嘗試雅各布人沒有運氣。任何幫助將不勝感激。

至今代碼:

import numpy as np 
from scipy.optimize import minimize 
def objective(x): 
    x1=x[0] 
    x2=x[1] 
    print ("x1: ",x1," ","x2: ",x2) 
    return pow(x1,4.0)-2*x2*pow(x1,2.0)+pow(x2,2.0)+pow(x1,2.0)-2.0*x1+5.0 

def jacobiano(x): 
    x1=x[0] 
    x2=x[1] 
    jaco=np.zeros(2) 
    jaco[0]=4.0*x1-4.0*x2*x1+2.0*x1-2.0 
    jaco[1]=-2.0*pow(x1,2.0)+2.0*x2 
    print ("dx1: ",jaco[0]," ","dx2: ",jaco[1]) 
    return jaco 
x0=np.array([1.0,2.0], dtype=np.double) 
print(objective(x0)) 
sol=minimize(objective,x0,method='BFGS',jac=jacobiano, options={'disp': True}) 
print(sol) 

回答

1

問題就出現了,因爲你沒有正確計算雅克比,你的情況df/dx1不正確。

如果f = x1**4 -2*x2*x1**2 +x2**2+ x1**2 -2.0*x1+5.0

然後df/dx1 = 4.0*x1**3 -4.0*x2*x1 + 2.0*x1-2.0


import numpy as np 
from scipy.optimize import minimize 

def objective(x): 
    x1, x2 = x 
    print ("x1: ",x1," ","x2: ",x2) 

    return x1**4 -2*x2*x1**2 +x2**2+ x1**2 -2.0*x1+5.0 


def jacobiano(x): 
    x1, x2 = x 
    jaco=np.zeros(2) 
    jaco[0]=4.0*x1**3 -4.0*x2*x1 + 2.0*x1-2.0 
    jaco[1]=-2.0*x1**2.+2.0*x2 

    print("dx1: ",jaco[0]," ","dx2: ",jaco[1]) 
    return jaco 

x0=np.array([1.0,2.0], dtype=np.double) 

sol=minimize(objective, 
x0,method='BFGS',jac=jacobiano, options={'disp': True}) 
print(sol) 

輸出:

Optimization terminated successfully. 
     Current function value: 4.000000 
     Iterations: 7 
     Function evaluations: 9 
     Gradient evaluations: 9 
     fun: 4.000000000002963 
hess_inv: array([[ 0.50324351, 1.0154575 ], 
     [ 1.0154575 , 2.55695728]]) 
     jac: array([ 7.65547714e-06, -2.90129716e-06]) 
    message: 'Optimization terminated successfully.' 
    nfev: 9 
     nit: 7 
    njev: 9 
    status: 0 
    success: True 
     x: array([ 1.00000093, 1.0000004 ]) 

Matlab的:

x1=1.00863, x2=1.01932, f=4.00008 

的Python:

x1=1.00000093, x2=1.0000004, f=4.000000000002963 

最優解

x1=1.0, x2=1.0, f=4.0 
+0

非常感謝您!當我不包括雅可比時,我期待着同樣的結果,爲什麼小數中有這樣的差異? –

+0

準確度的差異可能是由於算法在每種語言中的實現方式,也可能是由於每種語言使用的數據類型。 – eyllanesc

+0

謝謝!對於這個例子,你對Python中的數據類型有什麼建議嗎? –

相關問題