基于python的拉格朗日乘子BFGS优化
我想使用scipy优化例程,以便在应用一些约束的同时最小化函数。我想应用拉格朗日乘数法,但我认为我遗漏了一些东西 我的简单示例:最小化fx,y=x^2+y^2,同时保持约束:y=x+4.0基于python的拉格朗日乘子BFGS优化,python,scipy,Python,Scipy,我想使用scipy优化例程,以便在应用一些约束的同时最小化函数。我想应用拉格朗日乘数法,但我认为我遗漏了一些东西 我的简单示例:最小化fx,y=x^2+y^2,同时保持约束:y=x+4.0 import numpy as np from scipy.optimize import fmin_bfgs #X=[x,y,l] def f(X): x=X[0] y=X[1] return x**2+y**2 def g(X): x=X[0] y=X[1] ret
import numpy as np
from scipy.optimize import fmin_bfgs
#X=[x,y,l]
def f(X):
x=X[0]
y=X[1]
return x**2+y**2
def g(X):
x=X[0]
y=X[1]
return y-x-4.000
def L(X):
l=X[2]
return f(X)+l*g(X)
def dL(X):
x=X[0]
y=X[1]
l=X[2]
gx=2.0*x
gy=2.0*y
gl=g(X)
tmp=np.array([gx,gy,gl])
return tmp
x0=np.array([-2.0,2.0,0.0])
print "f(x0)\t\t g(x0) \t\t L(x0)"
print "%12.8f\t%12.8f\t%12.8f\t"%(f(x0),g(x0),L(x0))
print "dL(x0)"
print dL(x0)
xopt=fmin_bfgs(L,x0,fprime=dL,disp=True)
print xopt
即使我的x0在现场,优化也会严重偏离。有人能告诉我应该如何正确地包含拉格朗日乘子,以及应该如何初始化乘子吗?拉格朗日乘子背后的主要思想是构造一个新的目标函数,其中已经嵌入了约束。首先,您要求解方程以找到乘数的值,然后优化新的目标函数。然而,在您的示例中,您试图通过优化找到乘数的值。通过遵循lik中提供的说明,您可以发现问题的拉格朗日乘数为4
def f(X):
x=X[0]
y=X[1]
return x**2+y**2
def g(X):
x=X[0]
y=X[1]
return y-x-4.000
def L(X):
return f(X)-4*g(X)
x0=np.array([0,0])
xopt=fmin_bfgs(L,x0,disp=True)
希望能有帮助