Main Content

拉格朗日乘数结构体

有约束的优化涉及一组拉格朗日乘数,如一阶最优性测度中所述。求解器在结构体中返回估计的拉格朗日乘数。该结构体称为 lambda,因为拉格朗日乘数的传统符号是希腊字母 lambda (λ)。该结构体将乘数分为以下各个类型,称为字段:

  • lower,与下界相关联

  • upper,与上界相关联

  • eqlin,与线性等式相关联

  • ineqlin,与线性不等式相关联

  • eqnonlin,与非线性等式相关联

  • ineqnonlin,与非线性不等式相关联

  • soc,与二阶锥约束相关联

例如,要访问拉格朗日乘数结构体的非线性不等式字段,请输入 lambda.inqnonlin。要访问与下界相关联的拉格朗日乘数的第三个元素,请输入 lambda.lower(3)

拉格朗日乘数结构体的内容取决于求解器。例如,线性规划不存在非线性,因此它没有 eqnonlinineqnonlin 字段。每个适用求解器的函数参考页都在标题“输出”下包含对其拉格朗日乘数结构体的说明。

检查拉格朗日乘数结构体,以解决具有线性和非线性不等式约束和边界的非线性问题。

lb = [-3 -3]; % lower bounds
ub = [3 3]; % upper bounds
A = [1 1]; % linear inequality x(1) + x(2) <= 1
b = 1;
Aeq = [];
beq = [];
x0 = [-1 1];
fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; % Rosenbrock function
nlcons = @(x)deal(x(1)^2 + x(2)^2 - 1,[]); % nonlinear inequality
options = optimoptions('fmincon','Display','off');
[x,fval,exitflag,output,lambda] = ...
    fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nlcons,options);

disp(lambda)
         eqlin: [0×1 double]
      eqnonlin: [0×1 double]
       ineqlin: 0.3407
         lower: [2×1 double]
         upper: [2×1 double]
    ineqnonlin: 1.7038e-07

以下是拉格朗日乘数结构体的解释。

  • lambda.eqlinlambda.eqnonlin 字段的大小为 0,因为没有线性等式约束和非线性等式约束。

  • lambda.ineqlin 字段的值为 0.3407,表明线性不等式约束处于活动状态。线性不等式约束为 x(1) + x(2) <= 1。检查该约束在解处是否处于活动状态,这意味着解导致不等式变为等式:

    x(1) + x(2)
    ans =
    
        1.0000
  • 检查 lambda.lowerlambda.upper 字段的值。

    lambda.lower
    ans =
    
       1.0e-07 *
    
        0.2210
        0.2365
    lambda.upper
    ans =
    
       1.0e-07 *
    
        0.3361
        0.3056

    这些值实际上为零,表明解不在边界附近。

  • lambda.ineqnonlin 字段的值为 1.7038e-07,表明此约束不处于活动状态。检查约束,即 x(1)^2 + x(2)^2 <= 1

    x(1)^2 + x(2)^2
    ans =
    
        0.5282

    非线性约束函数值不在其极限附近,因此拉格朗日乘数近似为 0。

相关主题