跳到主要内容

拉格朗日乘子法

一、直观理解:用「价格」把等式约束折进目标里​

拉格朗日乘子法处理带等式约束的优化:在 g(x)=0g(x)=0 上最小化 f(x)f(x)。几何图像是:目标等高面与约束曲面相切时,二者的法向平行,即

∇f(x)=λ∇g(x)\nabla f(x)=\lambda \nabla g(x)

(多个约束时,∇f\nabla f 落在约束梯度张成的空间里。)

λ\lambda 称为拉格朗日乘子,可理解为约束的影子价格:约束右端微扰时,最优值如何变化。把约束「卖」进目标,形成拉格朗日函数:

L(x,λ)=f(x)+λTg(x)\mathcal{L}(x,\lambda)=f(x)+\lambda^\mathsf{T}g(x)

通过 ∇x,λL=0\nabla_{x,\lambda}\mathcal{L}=0 把有约束问题转化为(通常更大的)非线性方程组。这是经典解析法,也是理解 KKT、对偶与 fmincon 输出的基础。

二、适用场景与优缺点​

类型说明
适用场景等式约束光滑优化;需要解析推导最优性条件;经济学/力学中的约束极值;低维可手算或符号计算;为数值算法提供理论起点。
核心优点几何意义清晰;乘子有解释;与对偶理论衔接;是 KKT 在「无不等式」时的特例。
局限与缺点不等式约束需 KKT/松弛;得到的是必要条件,需二阶判定;非线性方程组可能多解;高维手算不可行。

使用前确认:

  1. 约束是否全为等式、是否独立(约束规范);
  2. f,gf,g 是否连续可微;
  3. 需要解析解还是为数值方法服务;
  4. 有不等式时是否应直接用 KKT 专页方法。

三、核心原理:驻点条件与乘子含义​

1. 问题形式​

min⁡x f(x)s.t.gi(x)=0, i=1,…,m\min_x\ f(x)\quad\text{s.t.}\quad g_i(x)=0,\ i=1,\ldots,m

2. 拉格朗日函数​

L(x,λ)=f(x)+∑i=1mλigi(x)\mathcal{L}(x,\lambda)=f(x)+\sum_{i=1}^m\lambda_i g_i(x)

一阶必要条件(在约束规范下):存在 λ\lambda 使

∇xL(x∗,λ∗)=0,g(x∗)=0\nabla_x\mathcal{L}(x^*,\lambda^*)=0,\quad g(x^*)=0

即

∇f(x∗)+∑iλi∗∇gi(x∗)=0\nabla f(x^*)+\sum_i\lambda_i^*\nabla g_i(x^*)=0

3. 几何解释​

在可行曲面切空间内,目标不能再下降:∇f\nabla f 必须与所有可行切向正交,因而由约束法向线性表出。

4. 乘子的灵敏度​

在正则条件下,

∂f∗∂bi≈−λi∗\frac{\partial f^*}{\partial b_i}\approx -\lambda_i^*

若约束写成 gi(x)=big_i(x)=b_i 的形式(记号因教材而异,报告时写清符号约定)。直观上:λ\lambda 大表示该约束「很紧很值钱」。

5. 二阶条件(简述)​

在切空间 vT∇gi=0v^\mathsf{T}\nabla g_i=0 上,要求 vT∇xx2L v>0v^\mathsf{T}\nabla_{xx}^2\mathcal{L}\,v>0(严格局部极小的充分条件)。仅 ∇xL=0\nabla_x\mathcal{L}=0 可能是极大或鞍点。

6. 与不等式、KKT 的衔接​

不等式 h(x)≤0h(x)\le 0 引入乘子 μ≥0\mu\ge 0 与互补松弛 μihi=0\mu_i h_i=0,完整条件即 KKT。等式乘子 λ\lambda 无非负限制。

四、关键决策​

1. 约束是否冗余或相依​

∇gi\nabla g_i 线性相关时,乘子可能不唯一或条件失效,需检查 LICQ 等约束规范。

2. 解析还是数值​

二维一两个等式:可手算或 solve;一般情况:用 fmincon 并读取 lambda。

3. 符号约定​

有人写 L=f−λg\mathcal{L}=f-\lambda g,灵敏度符号会反。论文/报告中固定一种并前后一致。

4. 初值与多解​

非线性驻点方程可能多个解,需结合二阶条件或目标值比较。

五、MATLAB 示例​

例 1:经典问题 min⁡x2+y2\min x^2+y^2 s.t. x+y=1x+y=1​

解析最优为 (0.5,0.5)(0.5,0.5),λ\lambda 相应可求。

% 数值:fmincon
fun = @(z) z(1)^2 + z(2)^2;
x0 = [0; 0];
Aeq = [1, 1];
beq = 1;
opts = optimoptions("fmincon", "Display", "iter");
[x, fval, ef, out, lambda] = fmincon(fun, x0, [], [], Aeq, beq, [], [], [], opts);
fprintf("x=(%.4f,%.4f), f=%.4f\n", x(1), x(2), fval);
disp("等式约束乘子 lambda.eqlin:");
disp(lambda.eqlin);

例 2:手写拉格朗日驻点(符号)​

min⁡ x2+y2s.t.x2+y=1\min\ x^2+y^2\quad\text{s.t.}\quad x^2+y=1
syms x y lam
f = x^2 + y^2;
g = x^2 + y - 1;
L = f + lam * g;
eqs = [diff(L, x); diff(L, y); g];
sols = solve(eqs, [x, y, lam], "Real", true);
X = double(sols.x);
Y = double(sols.y);
Lam = double(sols.lam);
F = X.^2 + Y.^2;
T = table(X, Y, Lam, F);
disp(T);

% 选目标最小者
[~, idx] = min(F);
fprintf("候选最优: (%.4f,%.4f), lam=%.4f, f=%.4f\n", ...
X(idx), Y(idx), Lam(idx), F(idx));

例 3:用 KKT/拉格朗日理解资源分配​

max⁡ ln⁡(x1+1)+ln⁡(x2+1)s.t. x1+x2=10, x≥0\max\ \ln(x_1+1)+\ln(x_2+1)\quad\text{s.t.}\ x_1+x_2=10,\ x\ge 0

(先忽略不等式,看等式乘子;若解在内部则自洽。)

fun = @(x) -(log(x(1)+1) + log(x(2)+1)); % 最小化负效用
x0 = [5; 5];
[x, fval, ef, out, lambda] = fmincon(fun, x0, [], [], [1 1], 10, [0;0], []);
fprintf("分配=(%.4f,%.4f), 效用=%.4f, 乘子=%.4f\n", ...
x(1), x(2), -fval, lambda.eqlin);

六、如何解释结果​

应报告:

  1. 原问题目标与等式约束;
  2. 拉格朗日函数写法与符号约定;
  3. 驻点 (x∗,λ∗)(x^*,\lambda^*) 与目标值;
  4. 乘子的灵敏度解释(结合业务单位);
  5. 二阶/边界检查:是否真为极小,是否需考虑不等式激活;
  6. 数值求解时的 exitflag 与约束违反量 ∥g(x)∥\|g(x)\|。

示例表述:「最优在资源恰好分尽时取得;等式乘子约 0.09,表示总预算再增加 1 个单位,最优效用大约提高 0.09。」

七、常见误区​

1. 有不等式仍只用等式拉格朗日​

边界最优时必须引入不等式乘子(KKT),否则会漏解。

2. 把 ∇xL=0\nabla_x\mathcal{L}=0 的每个解都当最小​

可能是最大或鞍点,要比较目标或查二阶条件。

3. 约束梯度为零导致方法失效​

如 g(x)=x12g(x)=x_1^2 在原点,规范条件不成立,需单独分析。

4. 乘子符号解释反了​

先确认 L=f+λg\mathcal{L}=f+\lambda g 还是 f−λgf-\lambda g,再谈「资源变贵」。

5. 高维硬符号求解​

应数值优化 + 报告 lambda 结构体。

6. 忽略可行性​

只满足 ∇xL=0\nabla_x\mathcal{L}=0 但不满足 g=0g=0 的点无意义。

八、小结​

拉格朗日乘子法的核心思想可以概括为:

构造 L=f+λTg\mathcal{L}=f+\lambda^\mathsf{T}g,通过 ∇xL=0\nabla_x\mathcal{L}=0 与 g=0g=0 刻画等式约束下的驻点;乘子给出约束的边际价值。

它是有约束非线性优化的理论入口,适合解析推导与解释灵敏度。实际大规模或含不等式问题时,应扩展到 KKT,并使用 fmincon 等数值方法,同时保留乘子的经济学/管理学解释。