2017-06-03 20 views
1

私は(PDF文書のページ29)機能Minimum of a function with BFGS methodのmimimumを見つけるためにBFGSと同じ結果がPythonでMATLABのものと同じにならないのはなぜですか?

をしようとしていると私はリンクで報告されたものと同じ結果を得ていないよ、私はすでにしてみてくださいとせず運がないジャコビア人。助けていただければ幸いです。

これまでのコードは:あなたは間違ってdf/dx1が正しくありません、あなたの場合には、ヤコビアンを計算しているので、

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

問題が発生します。

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) 

のIF出力:

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のデータ型の提案はありますか? –

関連する問題