数值优化基础:无约束优化与约束优化
数值优化,说白了就是找最优解的那点事。我做了这么多年轨迹优化,最深的体会就是:没有好的优化基础,你连火箭的飞行路径都算不准。今天咱们就聊聊无约束优化和约束优化这两大块。
无约束优化:梯度下降法
梯度下降法,我习惯叫它「下山法」。你想想看,如果你站在山顶想最快下山,最直接的办法就是沿着最陡的方向往下走。梯度就是这个「最陡方向」。
数学上,梯度下降的迭代公式很简单:
x_{k+1} = x_k - α ∇f(x_k)
其中 α 是步长,∇f(x_k) 是梯度。嗯,这里要注意:步长选大了会震荡,选小了又太慢。我在项目中遇到过这种情况,有一次调步长调了一整天,最后发现用自适应步长就解决了。
梯度下降的优缺点很明显:
- 优点:实现简单,内存占用小,适合大规模问题
- 缺点:收敛慢,容易陷入局部最优,对初始点敏感
无约束优化:牛顿法
牛顿法比梯度下降聪明多了。它不光看梯度,还看曲率(海森矩阵)。说白了,梯度下降是一阶方法,牛顿法是二阶方法。
迭代公式:
x_{k+1} = x_k - [∇²f(x_k)]⁻¹ ∇f(x_k)
我曾经在某个飞行器轨迹优化项目中,用梯度下降跑了200步还没收敛,换成牛顿法20步就搞定了。但代价是什么?每次迭代都要计算海森矩阵的逆,计算量巨大。
两种方法的对比:
| 方法 | 收敛速度 | 计算量 | 适用场景 |
|---|---|---|---|
| 梯度下降 | 线性收敛 | 小 | 大规模问题、初始优化 |
| 牛顿法 | 二次收敛 | 大 | 中小规模、高精度需求 |
约束优化:拉格朗日乘子法
现实中的轨迹优化哪有那么简单?你总得考虑燃料限制、推力限制、结构强度限制吧?这时候就需要约束优化了。
拉格朗日乘子法的核心思想:把约束条件「吸收」到目标函数里。数学上就是构造拉格朗日函数:
L(x, λ) = f(x) + λ g(x)
其中 λ 是拉格朗日乘子,g(x) 是约束条件。然后对 x 和 λ 分别求导,令其为零。
我个人习惯用这个方法处理等式约束。为什么?因为它把约束优化问题转化成了无约束问题,思路清晰,实现也简单。
约束优化:KKT条件
KKT条件,全称Karush-Kuhn-Tucker条件,是约束优化的「金标准」。它给出了一个点是最优解的必要条件(在某些凸性条件下也是充分条件)。
KKT条件包含四部分:
- 稳定性条件:目标函数梯度与约束梯度的线性组合为零
- 原始可行性:所有约束必须满足
- 对偶可行性:不等式约束的乘子必须非负
- 互补松弛性:乘子与约束的乘积为零
你想想看,这四条条件其实很直观。稳定性条件保证了你站在「最优位置」,原始可行性保证你没越界,对偶可行性保证你「推的方向正确」,互补松弛性保证你只在边界上用力。
我曾经在火箭轨迹优化中遇到一个棘手问题:推力大小有上下界约束。用KKT条件一分析,发现最优解要么在最大推力上,要么在最小推力上,要么在某个中间值。这个「开关控制」特性,就是互补松弛性带来的。
知识体系总览
下面这张图总结了本章的核心逻辑:
这张图把本章的知识体系串起来了。左边是无约束优化的两种方法,右边是约束优化的两种方法。它们之间其实有联系——拉格朗日乘子法本质上就是把约束优化转化成了无约束优化。
好了,数值优化基础就聊到这儿。记住:梯度下降和牛顿法是你的左右手,拉格朗日乘子法和KKT条件是你的护身符。多练练,自然就熟了。