2017-06-03 59 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中的数据类型有什么建议吗? –

相关问题