【数值优化与最优控制】(三):约束优化方法:原始对偶-内点法

本系列是我自学数值优化与最优控制的笔记和讲义,搬运到博客当中,一来是为我自己记忆和复习,二来也是为了方便一起学习的朋友。

本部分内容一共有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 与完整二阶差分出现差异,需要结合省略了哪些项来解释。

本讲已经串起完整链条:对数障碍构造子问题,松弛变量表达余量,乘子与原变量共同满足扰动最优性条件,牛顿方程计算修正量,步长和参数更新把迭代逐步引向原问题的解。下一讲将从约束误差的平方惩罚出发,建立另一条乘子更新路线。

相关推荐
北域码匠3 个月前
三分查找算法完整详解(C# 原生实现,无第三方库)
数值优化·分治算法·查找算法·编程基础·三分查找·c#算法·算法教程
幻风_huanfeng7 个月前
人工智能之数学基础:内点法和外点法的区别和缺点
人工智能·算法·机器学习·内点法·外点法
张彦峰ZYF9 个月前
数值计算算法系统性评估框架快速工程实践
数值计算·线性方程组·稳定性·数值优化·数值积分·工程实践·算法评估
点云SLAM10 个月前
凸优化(Convex Optimization) 理论(2)
机器人·slam·最小二乘法·数值优化·凸优化·拉格朗日-牛顿法·二次规划(qp)
点云SLAM10 个月前
Truncated Least Squares(TLS 截断最小二乘)算法原理
算法·slam·位姿估计·数值优化·点云配准·非凸全局优化·截断最小二乘法
点云SLAM1 年前
Boost库中Math 模块的根搜索 / 根求解和示例
数学·算法·数值优化·根搜索 / 根求解和示例·函数根求解·boost模块
点云SLAM1 年前
海森矩阵(Hessian Matrix)在SLAM图优化和点云配准中的应用介绍
算法·机器学习·矩阵·机器人·概率论·最小二乘法·数值优化
Mr.Winter`1 年前
轨迹优化 | 基于边界中间值问题(BIVP)的路径平滑求解器(附C++/Python仿真)
人工智能·机器人·自动驾驶·ros·路径规划·数值优化·轨迹优化
Mr.Winter`2 年前
优化求解 | 非线性最小二乘优化器Ceres安装教程与应用案例
人工智能·机器人·自动驾驶·ros·数值优化