【问题标题】:Lagrange multipler BFGS optimization with python使用python进行拉格朗日乘数BFGS优化
【发布时间】:2021-07-14 18:48:31
【问题描述】:

我想使用 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 在现场,优化也会严重偏离。有人可以解释一下如何正确包含拉格朗日乘数以及如何初始化乘数吗?

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    拉格朗日乘数背后的主要思想是构建一个已嵌入约束的新目标函数。首先求解方程以找到乘数的值,然后优化新的目标函数 (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)
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      相关资源
      最近更新 更多