基于python的拉格朗日乘子BFGS优化

2024-04-29 05:52:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用scipy优化例程,以便在应用一些约束的同时最小化函数。我想应用拉格朗日乘数法,但我想我遗漏了一些东西。你知道吗

我的简单示例是:最小化f(x,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]
   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是在现场,优化分歧,严重。有人能给我解释一下如何正确地包含拉格朗日乘子,以及如何初始化乘子吗?你知道吗


Tags: importreturndefnpscipyarraytmpgy
1条回答
网友
1楼 · 发布于 2024-04-29 05:52:45

拉格朗日乘子的主要思想是构造一个新的目标函数,其中已经嵌入了约束。首先求解方程以找到乘数的值,然后优化新的目标函数(http://www.math.vt.edu/people/mcquain/1526_Lag_opt_2012.pdf)。但是在您的示例中,您试图通过优化找到乘数的值。通过遵循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)

希望有帮助

相关问题 更多 >