本系列是我自学数值优化与最优控制的笔记和讲义,搬运到博客当中,一来是为我自己记忆和复习,二来也是为了方便一起学习的朋友。
本部分内容一共有8节,专栏地址:微鉴道长数值优化与最优控制
分节标题:
导读:从实际任务建立优化模型 点击这里
第一讲:从梯度与曲率构造局部优化方法 点击这里
第二讲:可行域、凸性与约束最优性 点击这里
第三讲:二次规划与边界的选择 点击这里
第四讲:用局部二次规划推进非线性问题 点击这里
第五讲:从边界余量到原始---对偶内点法 点击这里
第六讲:从平方罚函数到增广拉格朗日法 点击这里
第七讲:从 LQR 到 iLQR、DDP 与 MPC LQR部分、iLQR部分、DDP与MPC部分
第八讲:求解器背景、算法选型与工程诊断 点击这里
由于csdn的文本字数限制,我把它拆为了不同的章节。目前的章节包含
- 第五讲:从边界余量到原始---对偶内点法
另外,如果对这节内容感兴趣,希望讲的更详细,我还有两节内容在其他专栏里,可以按需阅读:
【机器人感知运控笔记三】约束优化基础:从简单问题到拉格朗日乘子与 KKT 条件
【机器人感知运控笔记四】理解 IPOPT:原始---对偶内点法与二阶信息
下面开始正文:
第五讲:从边界余量到原始---对偶内点法
5.1 在靠近边界时逐渐增加代价
活跃集法通过选择边界参与求解。另一条路线是在可行域内部构造一个随靠近边界而增大的代价,让变量逐步接近约束最优点。
先看一维问题:
min x f ( x ) = ( x − 2 ) 2 , x ≤ 1. \min_x f(x)=(x-2)^2,\qquad x\leq1. xminf(x)=(x−2)2,x≤1.
目标希望变量接近 2,约束要求变量不超过 1,因此最优点在边界 x = 1 x=1 x=1。在严格内部 x < 1 x<1 x<1,到边界的余量是 1 − x > 0 1-x>0 1−x>0。把它放入对数函数,可以构造:
F μ ( x ) = ( x − 2 ) 2 − μ log ( 1 − x ) , μ > 0. F_\mu(x)=(x-2)^2-\mu\log(1-x),\qquad \mu>0. Fμ(x)=(x−2)2−μlog(1−x),μ>0.
当 x x x 从左侧靠近 1, log ( 1 − x ) \log(1-x) log(1−x) 趋于负无穷,所以障碍项趋于正无穷。固定 μ \mu μ 后,最小点会留在边界内部。参数 μ \mu μ 决定障碍的强度;逐渐减小它,可以让子问题解逐渐接近原问题的边界最优点。

图中每条曲线对应一个固定的 μ \mu μ,圆点表示该子问题的最小点。比较时应关注最小点的位置:随着 μ \mu μ 减小,它向 x = 1 x=1 x=1 靠近。
障碍项用对数定义,因此直接采用这个表达式时,试探点必须保持 x < 1 x<1 x<1。它在边界外无法计算,这会影响初值和步长的安排。
5.2 用独立变量记录约束余量
一般不等式写成 g i ( x ) ≤ 0 g_i(x)\leq0 gi(x)≤0。在可行点, − g i ( x ) -g_i(x) −gi(x) 是非负余量。引入新变量 t i t_i ti,可以把不等式等价写成:
g i ( x ) + t i = 0 , t i ≥ 0. g_i(x)+t_i=0,\qquad t_i\geq0. gi(x)+ti=0,ti≥0.
例如 x − 1 ≤ 0 x-1\leq0 x−1≤0 对应 x − 1 + t = 0 , t ≥ 0 x-1+t=0,t\geq0 x−1+t=0,t≥0。当关联等式成立时, t = 1 − x t=1-x t=1−x,正好等于到边界的距离。这里的 t t t 称为松弛变量,表示不等式允许保留的余量。
这个变换增加了变量,也带来了计算上的便利:复杂的边界都被分解成一个光滑等式和一个简单的非负要求。对一般问题:
min x f ( x ) , h ( x ) = 0 , g ( x ) ≤ 0 , \min_x f(x),\qquad h(x)=0,\quad g(x)\leq0, xminf(x),h(x)=0,g(x)≤0,
加入标准对数障碍后得到:
min x , t f ( x ) − μ ∑ i log t i , s.t. h ( x ) = 0 , g ( x ) + t = 0 , t > 0. \begin{aligned} \min_{x,t}\quad &f(x)-\mu\sum_i\log t_i,\\ \text{s.t.}\quad &h(x)=0,\qquad g(x)+t=0,\quad t>0. \end{aligned} x,tmins.t.f(x)−μi∑logti,h(x)=0,g(x)+t=0,t>0.
不等式的非负边界通过障碍和正值步长处理,等式仍留在子问题中。求解这个子问题还需要处理等式可行性。
引入独立 t t t 后,迭代点可以暂时不满足关联等式。例如 x = 1.2 x=1.2 x=1.2 时直接计算 log ( 1 − x ) \log(1-x) log(1−x) 无定义;若初始化为 t = 0.1 > 0 t=0.1>0 t=0.1>0, log t \log t logt 可以计算,而关联等式留下残差:
x − 1 + t = 0.3. x-1+t=0.3. x−1+t=0.3.
之后同时更新 x x x 和 t t t,逐步消除这个误差。 0.1 0.1 0.1 只是一项方便展示的正初值;实际求解器通常按确定的初始化规则将余量和边界距离调整到正值。
独立余量保证的是对数项可以计算。目标和约束本身仍需在当前 x x x 处有定义,例如模型若包含 x \sqrt{x} x ,还要单独处理它对 x x x 的定义域要求。
5.3 从余量的驻点条件得到正乘子
固定 μ \mu μ,给等式 h ( x ) = 0 h(x)=0 h(x)=0 配乘子 ν \nu ν,给新等式 g ( x ) + t = 0 g(x)+t=0 g(x)+t=0 暂时配乘子 y y y,得到:
L μ ( x , t , ν , y ) = f ( x ) − μ ∑ i log t i + ν T h ( x ) + y T ( g ( x ) + t ) . \mathcal L_\mu(x,t,\nu,y) =f(x)-\mu\sum_i\log t_i+\nu^Th(x)+y^T(g(x)+t). Lμ(x,t,ν,y)=f(x)−μi∑logti+νTh(x)+yT(g(x)+t).
由于这两类约束都是等式,刚引入的乘子都允许取任意实数。接下来对 t i t_i ti 求导并令其为零:
− μ t i + y i = 0 ⟹ y i = μ t i > 0. -\frac\mu{t_i}+y_i=0 \quad\Longrightarrow\quad y_i=\frac\mu{t_i}>0. −tiμ+yi=0⟹yi=tiμ>0.
正号由 μ > 0 , t i > 0 \mu>0,t_i>0 μ>0,ti>0 和驻点条件共同给出。再对 x x x 求导:
∇ f + J h T ν + J g T y = 0. \nabla f+J_h^T\nu+J_g^Ty=0. ∇f+JhTν+JgTy=0.
其中 y y y 乘在原不等式梯度 J g T J_g^T JgT 前,与原问题的 λ \lambda λ 承担相同的平衡作用。因此后文统一写成 λ = y \lambda=y λ=y。连同可行性,可以得到:
∇ f + J h T ν + J g T λ = 0 , h ( x ) = 0 , g ( x ) + t = 0 , t i λ i = μ , t i > 0 , λ i > 0. \begin{aligned} \nabla f+J_h^T\nu+J_g^T\lambda&=0,\\ h(x)&=0,\\ g(x)+t&=0,\\ t_i\lambda_i&=\mu,\qquad t_i>0,\ \lambda_i>0. \end{aligned} ∇f+JhTν+JgTλh(x)g(x)+ttiλi=0,=0,=0,=μ,ti>0, λi>0.
乘积关系称为扰动互补条件 。原问题要求 λ i g i ( x ) = 0 \lambda_i g_i(x)=0 λigi(x)=0;关联等式成立时, g i = − t i g_i=-t_i gi=−ti,所以原要求等价于 t i λ i = 0 t_i\lambda_i=0 tiλi=0。标准对数障碍把这个零替换成当前的正数 μ \mu μ。
这一推导逐条适用于上述标准障碍下的所有不等式。当前 μ > 0 \mu>0 μ>0 时允许一个小的非零乘积;随着 μ \mu μ 降低,求解过程逐步接近原问题的互补要求。
5.4 中心路径描述理想子问题解的变化
一维问题的扰动最优性方程为:
2 ( x − 2 ) + λ = 0 , x − 1 + t = 0 , t λ = μ . 2(x-2)+\lambda=0,\qquad x-1+t=0,\qquad t\lambda=\mu. 2(x−2)+λ=0,x−1+t=0,tλ=μ.
由第二式得到 x = 1 − t x=1-t x=1−t,代入第一式得到 λ = 2 ( 1 + t ) \lambda=2(1+t) λ=2(1+t)。再放入乘积关系:
2 t ( 1 + t ) = μ . 2t(1+t)=\mu. 2t(1+t)=μ.
取正根并将其有理化:
t = 1 + 2 μ − 1 2 = μ 1 + 2 μ + 1 . t=\frac{\sqrt{1+2\mu}-1}{2} =\frac{\mu}{\sqrt{1+2\mu}+1}. t=21+2μ −1=1+2μ +1μ.
这样每给定一个 μ \mu μ,就能算出一组理想解:
| μ \mu μ | x x x | t t t | λ \lambda λ |
|---|---|---|---|
| 0.1 0.1 0.1 | 0.952277 0.952277 0.952277 | 0.047723 0.047723 0.047723 | 2.095445 2.095445 2.095445 |
| 0.01 0.01 0.01 | 0.995025 0.995025 0.995025 | 0.004975 0.004975 0.004975 | 2.009950 2.009950 2.009950 |
| 0.001 0.001 0.001 | 0.999500 0.999500 0.999500 | 0.000500 0.000500 0.000500 | 2.001000 2.001000 2.001000 |
这些理想子问题解随 μ \mu μ 连续变化形成的曲线,称为中心路径 。在本例中, μ → 0 \mu\to0 μ→0 时, x → 1 , t → 0 , λ → 2 x\to1,t\to0,\lambda\to2 x→1,t→0,λ→2,正好接近原问题的 KKT 解。

实际求解器只计算有限步,每轮的方程也有误差,因此实际轨迹通常在中心路径附近移动。对非凸问题,扰动方程可能具有多个局部分支,中心路径的图景需要结合所处的解分支理解。
第二讲通过最优值下界引入了"对偶变量"这个名称。在这里, x , t x,t x,t 属于原始变量, ν , λ \nu,\lambda ν,λ 属于对偶变量。原始---对偶内点法 同时更新这两组量,并在迭代中保持 t , λ t,\lambda t,λ 为正。它利用两类变量共同逼近可行性、梯度平衡与互补性。
5.5 把尚未满足的条件写成残差
求解器需要知道当前点距离这些方程成立还有多远。将每条方程左侧集中起来,得到残差向量:
R μ ( x , ν , λ , t ) = r d r h r i r c = ∇ f + J h T ν + J g T λ h ( x ) g ( x ) + t T λ − μ 1 . R_\mu(x,\nu,\lambda,t)= \begin{bmatrix} r_d\\r_h\\r_i\\r_c \end{bmatrix}= \begin{bmatrix} \nabla f+J_h^T\nu+J_g^T\lambda\\ h(x)\\ g(x)+t\\ T\lambda-\mu\mathbf1 \end{bmatrix}. Rμ(x,ν,λ,t)= rdrhrirc = ∇f+JhTν+JgTλh(x)g(x)+tTλ−μ1 .
T = diag ( t ) T=\operatorname{diag}(t) T=diag(t) 表示以 t i t_i ti 为对角元素的矩阵,所以 T λ T\lambda Tλ 的第 i i i 项就是 t i λ i t_i\lambda_i tiλi。 1 \mathbf1 1 是全为 1 的向量。四部分的含义是:
| 残差 | 衡量的误差 | 为零时表示 |
|---|---|---|
| r d r_d rd | 梯度平衡误差,也称对偶残差 | 当前目标梯度与约束梯度相互平衡 |
| r h r_h rh | 原始等式误差 | h ( x ) = 0 h(x)=0 h(x)=0 |
| r i r_i ri | 不等式与余量的关联误差 | g ( x ) + t = 0 g(x)+t=0 g(x)+t=0 |
| r c r_c rc | 当前参数下的互补误差,也称中心性残差 | 每个 t i λ i t_i\lambda_i tiλi 等于 μ \mu μ |
例如只让 r c r_c rc 为零,并不能说明已经求解成功。可能仍然存在 r h ≠ 0 r_h\ne0 rh=0,或者目标与约束的梯度还没有平衡。求解器需要协调这些误差。
5.6 用联合牛顿步骤修正残差
把全部未知量记为 z = ( x , ν , λ , t ) z=(x,\nu,\lambda,t) z=(x,ν,λ,t)。希望新的真实残差 R μ ( z + Δ z ) R_\mu(z+\Delta z) Rμ(z+Δz) 为零,但它通常是非线性的。牛顿法用一阶模型近似它:
R μ ( z + Δ z ) ≈ R μ ( z ) + J R ( z ) Δ z . R_\mu(z+\Delta z)\approx R_\mu(z)+J_R(z)\Delta z. Rμ(z+Δz)≈Rμ(z)+JR(z)Δz.
让右侧预测为零,就得到线性方程 J R Δ z = − R μ J_R\Delta z=-R_\mu JRΔz=−Rμ。求出位移后,仍要重新计算真实残差。
先逐行观察一般问题。记 A = J h , G = J g A=J_h,G=J_g A=Jh,G=Jg,以及:
W = ∇ 2 f + ∑ j ν j ∇ 2 h j + ∑ i λ i ∇ 2 g i , Λ = diag ( λ ) . W=\nabla^2 f+\sum_j\nu_j\nabla^2h_j+\sum_i\lambda_i\nabla^2g_i, \qquad \Lambda=\operatorname{diag}(\lambda). W=∇2f+j∑νj∇2hj+i∑λi∇2gi,Λ=diag(λ).
梯度平衡的变化包含位置和两类乘子的贡献:
W Δ x + A T Δ ν + G T Δ λ = − r d . W\Delta x+A^T\Delta\nu+G^T\Delta\lambda=-r_d. WΔx+ATΔν+GTΔλ=−rd.
原始等式与关联等式的变化分别是:
A Δ x = − r h , G Δ x + Δ t = − r i . A\Delta x=-r_h,\qquad G\Delta x+\Delta t=-r_i. AΔx=−rh,GΔx+Δt=−ri.
最后,乘积的一阶展开为:
( t i + Δ t i ) ( λ i + Δ λ i ) ≈ t i λ i + t i Δ λ i + λ i Δ t i . (t_i+\Delta t_i)(\lambda_i+\Delta\lambda_i) \approx t_i\lambda_i+t_i\Delta\lambda_i+\lambda_i\Delta t_i. (ti+Δti)(λi+Δλi)≈tiλi+tiΔλi+λiΔti.
舍去增量的乘积,就得到 T Δ λ + Λ Δ t = − r c T\Delta\lambda+\Lambda\Delta t=-r_c TΔλ+ΛΔt=−rc。按四行关系组合:
W A T G T 0 A 0 0 0 G 0 0 I 0 0 T Λ Δ x Δ ν Δ λ Δ t = − r d r h r i r c . \begin{bmatrix} W&A^T&G^T&0\\ A&0&0&0\\ G&0&0&I\\ 0&0&T&\Lambda \end{bmatrix} \begin{bmatrix}\Delta x\\\Delta\nu\\\Delta\lambda\\\Delta t\end{bmatrix} =-\begin{bmatrix}r_d\\r_h\\r_i\\r_c\end{bmatrix}. WAG0AT000GT00T00IΛ ΔxΔνΔλΔt =− rdrhrirc .
左上块 W W W 与 SQP 中的拉格朗日 Hessian 具有相同含义。其余各块来自可行性、乘子变化和乘积变化。算法在每个新点重新计算这些量。
5.7 一个牛顿方向与正值步长的算例
对一维问题,没有原始等式 h h h。取未知量顺序 ( x , λ , t ) (x,\lambda,t) (x,λ,t),得到:
R = 2 ( x − 2 ) + λ x − 1 + t t λ − μ , 2 1 0 1 0 1 0 t λ Δ x Δ λ Δ t = − R . R=\begin{bmatrix}2(x-2)+\lambda\\x-1+t\\t\lambda-\mu\end{bmatrix}, \qquad \begin{bmatrix}2&1&0\\1&0&1\\0&t&\lambda\end{bmatrix} \begin{bmatrix}\Delta x\\\Delta\lambda\\\Delta t\end{bmatrix}=-R. R= 2(x−2)+λx−1+ttλ−μ , 21010t01λ ΔxΔλΔt =−R.
设 μ = 0.1 , x = 0.8 , t = 0.2 , λ = 0.4 \mu=0.1,x=0.8,t=0.2,\lambda=0.4 μ=0.1,x=0.8,t=0.2,λ=0.4,残差为 ( − 2 , 0 , − 0.02 ) T (-2,0,-0.02)^T (−2,0,−0.02)T。三行方程为:
2 Δ x + Δ λ = 2 , Δ x + Δ t = 0 , 0.2 Δ λ + 0.4 Δ t = 0.02. \begin{aligned} 2\Delta x+\Delta\lambda&=2,\\ \Delta x+\Delta t&=0,\\ 0.2\Delta\lambda+0.4\Delta t&=0.02. \end{aligned} 2Δx+ΔλΔx+Δt0.2Δλ+0.4Δt=2,=0,=0.02.
第二式给出 Δ t = − Δ x \Delta t=-\Delta x Δt=−Δx,第一式给出 Δ λ = 2 − 2 Δ x \Delta\lambda=2-2\Delta x Δλ=2−2Δx。代入第三式后有 0.4 − 0.8 Δ x = 0.02 0.4-0.8\Delta x=0.02 0.4−0.8Δx=0.02,因此:
Δ x = 0.475 , Δ λ = 1.05 , Δ t = − 0.475. \Delta x=0.475,\qquad\Delta\lambda=1.05,\qquad\Delta t=-0.475. Δx=0.475,Δλ=1.05,Δt=−0.475.
这些数值是牛顿方程给出的建议增量。当前余量 t = 0.2 t=0.2 t=0.2,建议的变化量却是 Δ t = − 0.475 \Delta t=-0.475 Δt=−0.475。若完整采用,余量会变成 t n e w = 0.2 − 0.475 = − 0.275 t_{\mathrm{new}}=0.2-0.475=-0.275 tnew=0.2−0.475=−0.275,位置也会变成 x n e w = 0.8 + 0.475 = 1.275 x_{\mathrm{new}}=0.8+0.475=1.275 xnew=0.8+0.475=1.275,越过原约束 x ≤ 1 x\leq1 x≤1 的边界。本例当前满足 x − 1 + t = 0 x-1+t=0 x−1+t=0,因此 t = 0.2 t=0.2 t=0.2 恰好就是当前位置到边界的距离。
为了保留正值,可以只采用这组增量的一部分。"各分量共用步长 α \alpha α"表示用同一个比例缩放全部增量:
x n e w = x + α Δ x = 0.8 + 0.475 α , λ n e w = λ + α Δ λ = 0.4 + 1.05 α , t n e w = t + α Δ t = 0.2 − 0.475 α . \begin{aligned} x_{\mathrm{new}}&=x+\alpha\Delta x=0.8+0.475\alpha,\\ \lambda_{\mathrm{new}}&=\lambda+\alpha\Delta\lambda=0.4+1.05\alpha,\\ t_{\mathrm{new}}&=t+\alpha\Delta t=0.2-0.475\alpha. \end{aligned} xnewλnewtnew=x+αΔx=0.8+0.475α,=λ+αΔλ=0.4+1.05α,=t+αΔt=0.2−0.475α.
α = 1 \alpha=1 α=1 表示完整采用, α = 0.4 \alpha=0.4 α=0.4 表示采用所算增量的 40 % 40\% 40%。当 α > 0 \alpha>0 α>0 时,本例的 λ n e w \lambda_{\mathrm{new}} λnew 始终为正;余量的正值要求则给出:
0.2 − 0.475 α > 0 ⟹ α < 0.2 0.475 ≈ 0.42105. 0.2-0.475\alpha>0 \quad\Longrightarrow\quad \alpha<\frac{0.2}{0.475}\approx0.42105. 0.2−0.475α>0⟹α<0.4750.2≈0.42105.
这个比值表示,沿当前方向走完约 42.1 % 42.1\% 42.1%,就会把已有余量全部耗尽。在上限处 t n e w = 0 t_{\mathrm{new}}=0 tnew=0,无法继续计算 log t \log t logt;当前内点迭代要求余量严格为正,所以要取更小的步长。
例如试取 α = 0.4 \alpha=0.4 α=0.4,得到 x n e w = 0.99 , t n e w = 0.01 , λ n e w = 0.82 x_{\mathrm{new}}=0.99,t_{\mathrm{new}}=0.01,\lambda_{\mathrm{new}}=0.82 xnew=0.99,tnew=0.01,λnew=0.82,保持了正值。新的梯度平衡残差为 − 1.2 -1.2 −1.2,关联误差为零,互补残差为 − 0.0918 -0.0918 −0.0918。最后一项的绝对值反而增大,说明线性预测与真实乘积之间存在差异。
牛顿线性方程给出更新方向,正值检查限制沿这个方向能够走多远。实际算法通常只走到边界距离的一定比例,保留正余量,再结合整体进展判断是否接受;需要时通过线搜索进一步缩短步长。因此,满足正值条件只说明可以继续试探,还需要检查这一步是否取得足够进展。
5.8 消去余量后出现的额外曲率
回到 5.6 节的一般联合方程,本轮原本需要同时求 Δ x , Δ ν , Δ λ , Δ t \Delta x,\Delta\nu,\Delta\lambda,\Delta t Δx,Δν,Δλ,Δt。下面先将 Δ t , Δ λ \Delta t,\Delta\lambda Δt,Δλ 写成关于 Δ x \Delta x Δx 的表达式,再代回梯度平衡方程,这样可以先求一个未知量更少的系统。
这里仍用 G = J g G=J_g G=Jg 表示不等式的 Jacobian, T = diag ( t ) T=\operatorname{diag}(t) T=diag(t)、 Λ = diag ( λ ) \Lambda=\operatorname{diag}(\lambda) Λ=diag(λ), W W W 表示原拉格朗日函数关于 x x x 的 Hessian。本轮的矩阵与残差都已经由当前点确定。
先利用关联等式消去余量增量。 对应方程为 G Δ x + Δ t = − r i G\Delta x+\Delta t=-r_i GΔx+Δt=−ri,移项得到:
Δ t = − r i − G Δ x . \Delta t=-r_i-G\Delta x. Δt=−ri−GΔx.
互补方程为 T Δ λ + Λ Δ t = − r c T\Delta\lambda+\Lambda\Delta t=-r_c TΔλ+ΛΔt=−rc。将刚才的 Δ t \Delta t Δt 代入,再把不含 Δ λ \Delta\lambda Δλ 的项移到右边:
T Δ λ + Λ ( − r i − G Δ x ) = − r c , T Δ λ = Λ G Δ x + Λ r i − r c . \begin{aligned} T\Delta\lambda+\Lambda(-r_i-G\Delta x)&=-r_c,\\ T\Delta\lambda&=\Lambda G\Delta x+\Lambda r_i-r_c. \end{aligned} TΔλ+Λ(−ri−GΔx)TΔλ=−rc,=ΛGΔx+Λri−rc.
因为每个 t i > 0 t_i>0 ti>0,对角矩阵 T T T 可逆,左乘 T − 1 T^{-1} T−1 得到:
Δ λ = T − 1 Λ G Δ x + T − 1 ( Λ r i − r c ) . \Delta\lambda=T^{-1}\Lambda G\Delta x +T^{-1}(\Lambda r_i-r_c). Δλ=T−1ΛGΔx+T−1(Λri−rc).
右边第一项随 Δ x \Delta x Δx 变化,第二项由当前残差确定。至此,给定 Δ x \Delta x Δx,就能由这两条表达式算出相应的 Δ t \Delta t Δt 和 Δ λ \Delta\lambda Δλ。
再将乘子增量代回梯度平衡方程。 原来的这一行是:
W Δ x + A T Δ ν + G T Δ λ = − r d . W\Delta x+A^T\Delta\nu+G^T\Delta\lambda=-r_d. WΔx+ATΔν+GTΔλ=−rd.
其中 G T Δ λ G^T\Delta\lambda GTΔλ 表示乘子变化带来的影响。用上面的表达式替换 Δ λ \Delta\lambda Δλ,这部分变成:
G T Δ λ = G T T − 1 Λ G Δ x + G T T − 1 ( Λ r i − r c ) . G^T\Delta\lambda =G^TT^{-1}\Lambda G\Delta x +G^TT^{-1}(\Lambda r_i-r_c). GTΔλ=GTT−1ΛGΔx+GTT−1(Λri−rc).
第一项与 W Δ x W\Delta x WΔx 都乘在同一个未知量 Δ x \Delta x Δx 上,可以合并系数:
W Δ x + G T T − 1 Λ G Δ x = ( W + G T T − 1 Λ G ) Δ x . W\Delta x+G^TT^{-1}\Lambda G\Delta x =\left(W+G^TT^{-1}\Lambda G\right)\Delta x. WΔx+GTT−1ΛGΔx=(W+GTT−1ΛG)Δx.
将已知的残差项移到右边,就得到:
( W + G T T − 1 Λ G ) Δ x + A T Δ ν = − r d − G T T − 1 ( Λ r i − r c ) . \left(W+G^TT^{-1}\Lambda G\right)\Delta x+A^T\Delta\nu =-r_d-G^TT^{-1}(\Lambda r_i-r_c). (W+GTT−1ΛG)Δx+ATΔν=−rd−GTT−1(Λri−rc).
再保留原始等式的方程 A Δ x = − r h A\Delta x=-r_h AΔx=−rh,就可以联合求 Δ x , Δ ν \Delta x,\Delta\nu Δx,Δν,然后回代求出另外两组增量。
这说明 G T T − 1 Λ G G^TT^{-1}\Lambda G GTT−1ΛG 的来源:位置变化会通过关联等式影响余量,再通过互补方程影响乘子;把这些影响代回梯度平衡方程后,就在 Δ x \Delta x Δx 的系数中增加了这一项。整个过程只对同一组线性方程进行了消元,原拉格朗日 Hessian W W W 的定义保持不变。
可以用 5.7 节的数值核对。该例没有原始等式,且 W = 2 , G = 1 , t = 0.2 , λ = 0.4 W=2,G=1,t=0.2,\lambda=0.4 W=2,G=1,t=0.2,λ=0.4,残差为 r d = − 2 , r i = 0 , r c = − 0.02 r_d=-2,r_i=0,r_c=-0.02 rd=−2,ri=0,rc=−0.02。消元后的位置方程为:
( 2 + 0.4 0.2 ) Δ x = 2 − 0.02 0.2 = 1.9. \left(2+\frac{0.4}{0.2}\right)\Delta x =2-\frac{0.02}{0.2}=1.9. (2+0.20.4)Δx=2−0.20.02=1.9.
左边的系数为 4,因此仍得到 Δ x = 1.9 / 4 = 0.475 \Delta x=1.9/4=0.475 Δx=1.9/4=0.475,与直接求联合方程的结果一致。
这个新增系数也可以从曲率角度理解。 T − 1 Λ T^{-1}\Lambda T−1Λ 的对角元素为 λ i / t i > 0 \lambda_i/t_i>0 λi/ti>0。若 G i G_i Gi 表示 G G G 的第 i i i 行,则 G i v G_iv Giv 是沿方向 v v v 移动时,第 i i i 条约束的一阶变化率。因此:
v T G T T − 1 Λ G v = ∑ i λ i t i ( G i v ) 2 ≥ 0. v^TG^TT^{-1}\Lambda Gv =\sum_i\frac{\lambda_i}{t_i}(G_iv)^2\geq0. vTGTT−1ΛGv=i∑tiλi(Giv)2≥0.
每一项都是非负权重乘以变化率的平方,所以这个矩阵半正定。方向 v v v 对约束值的影响越明显,相应的贡献越大;若 G v = 0 Gv=0 Gv=0,沿这个方向的贡献就是零。
在消元后的方向方程中,这一项与曲率矩阵 W W W 相加,因此称为额外曲率。沿理想中心路径有 t i λ i = μ t_i\lambda_i=\mu tiλi=μ,从而 λ i / t i = μ / t i 2 \lambda_i/t_i=\mu/t_i^2 λi/ti=μ/ti2,这与对数障碍的二阶导相呼应。
继续看这一维问题,消元后的位置系数为 2 + λ / t 2+\lambda/t 2+λ/t。沿 5.4 节的理想中心路径,有 t = μ / ( 1 + 2 μ + 1 ) t=\mu/(\sqrt{1+2\mu}+1) t=μ/(1+2μ +1);小 μ \mu μ 下 t ≈ μ / 2 , λ ≈ 2 t\approx\mu/2,\lambda\approx2 t≈μ/2,λ≈2,于是:
2 + λ t ≈ 2 + 4 μ . 2+\frac\lambda t\approx2+\frac4\mu. 2+tλ≈2+μ4.
障碍参数降低时,余量也在缩小;余量平方比 μ \mu μ 缩小得更快,所以 μ / t 2 \mu/t^2 μ/t2 会增大。这使边界附近的方向计算更敏感,也解释了内点法需要认真处理尺度、步长和线性方程的数值性质。
5.9 障碍参数怎样更新,算法怎样结束
如果把某个固定正数 μ \mu μ 的残差求到很小,只说明当前障碍子问题求得很好。此时仍有 t i λ i ≈ μ t_i\lambda_i\approx\mu tiλi≈μ;原问题要求的乘积是零,因此还需要降低障碍参数,并修正下一轮方程。
IPOPT 提供不同的 mu_strategy:
monotone采用分阶段降低参数的方式。当前子问题达到相应精度后,再减小 μ \mu μ,继续求解。adaptive根据当前互补程度和迭代进展更灵活地选择 μ \mu μ。它带有进展检查,也可能切换到更受约束的更新模式。
两者会改变经过的试探点、线搜索次数与线性方程状况。适合某一模型的策略,要通过相同初值、尺度、容差和预算下的结果比较确定。障碍参数降低过快可能使方向计算困难,降低过慢又可能在离原问题解较远的位置花费较多工作。
收敛判断要回到原问题,检查约束误差、梯度平衡误差和接近零的互补乘积,并考虑变量边界对应的条件。求解器还可能因时间或迭代预算耗尽、步长过小、数值失败而结束;这些退出原因与达到收敛容差需要分别记录。
IPOPT 采用过滤器线搜索处理试探点进展。过滤器比较目标与约束违反,配合其他接受条件选择步骤。普通步骤难以推进时,求解器可能进入恢复阶段,重点降低约束违反,再尝试返回主迭代。辅助阶段可以使用罚项,主方向计算仍围绕障碍参数和原始---对偶方程展开。
5.10 模型导数与 IPOPT 接口的分工
从使用者角度,可以把一次迭代理解成以下分工:模型提供函数和导数;IPOPT 维护当前变量、乘子及障碍参数,组装方程,求方向、选步长并判断退出。
CasADi 常把约束写成 l c ≤ c ( x ) ≤ u c l_c\leq c(x)\leq u_c lc≤c(x)≤uc。上下界通过 lbg/ubg 传入,lam_g 表示对应的带符号乘子。对双边约束,它合并了上界与下界的乘子贡献,具体关系为 λ U − λ L \lambda_U-\lambda_L λU−λL。
在采用二阶导数时,模型接口提供的拉格朗日 Hessian 为:
H l a g = σ ∇ 2 f ( x ) + ∑ i λ i ∇ 2 c i ( x ) . H_{\mathrm{lag}}= \sigma\nabla^2 f(x)+\sum_i\lambda_i\nabla^2c_i(x). Hlag=σ∇2f(x)+i∑λi∇2ci(x).
σ \sigma σ 是求解器传入的目标系数,用于目标缩放等接口安排。自定义 hess_lag 时,CasADi 约定输入顺序为变量、模型参数、目标系数、约束乘子。适配层按接口顺序传值,符号名称用于组织表达式。
障碍和余量消元带来的曲率由求解器继续组装,因此提供 hess_lag 时应遵循接口定义,避免重复加入障碍项。Hessian 对称,接口可以只要求上三角元素。
IPOPT 的 hessian_approximation 默认值为 exact,表示请求 Hessian 回调提供二阶信息;取 limited-memory 时,求解器使用有限记忆拟牛顿近似。若自行注册了省略某些二阶项的回调,实际提供的是自定义近似,exact 这个选项名称不会补齐被省略的项。
导数检查可用 derivative_test=first-order 或 second-order。前者比较一阶导,后者进一步检查二阶导与有限差分是否一致。检查应选在函数光滑、定义域合法且尺度合理的位置;近似 Hessian 与完整二阶差分出现差异,需要结合省略了哪些项来解释。
本讲已经串起完整链条:对数障碍构造子问题,松弛变量表达余量,乘子与原变量共同满足扰动最优性条件,牛顿方程计算修正量,步长和参数更新把迭代逐步引向原问题的解。下一讲将从约束误差的平方惩罚出发,建立另一条乘子更新路线。