数值优化基础:无约束优化与约束优化

数值优化,说白了就是找最优解的那点事。我做了这么多年轨迹优化,最深的体会就是:没有好的优化基础,你连火箭的飞行路径都算不准。今天咱们就聊聊无约束优化和约束优化这两大块。

无约束优化:梯度下降法

梯度下降法,我习惯叫它「下山法」。你想想看,如果你站在山顶想最快下山,最直接的办法就是沿着最陡的方向往下走。梯度就是这个「最陡方向」。

数学上,梯度下降的迭代公式很简单:

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条件

KKT条件,全称Karush-Kuhn-Tucker条件,是约束优化的「金标准」。它给出了一个点是最优解的必要条件(在某些凸性条件下也是充分条件)。

KKT条件包含四部分:

  1. 稳定性条件:目标函数梯度与约束梯度的线性组合为零
  2. 原始可行性:所有约束必须满足
  3. 对偶可行性:不等式约束的乘子必须非负
  4. 互补松弛性:乘子与约束的乘积为零

你想想看,这四条条件其实很直观。稳定性条件保证了你站在「最优位置」,原始可行性保证你没越界,对偶可行性保证你「推的方向正确」,互补松弛性保证你只在边界上用力。

我曾经在火箭轨迹优化中遇到一个棘手问题:推力大小有上下界约束。用KKT条件一分析,发现最优解要么在最大推力上,要么在最小推力上,要么在某个中间值。这个「开关控制」特性,就是互补松弛性带来的。

实用建议:检查KKT条件时,先看互补松弛性。它告诉你哪些约束是「激活」的,哪些是「休眠」的。这能大大简化问题。

知识体系总览

下面这张图总结了本章的核心逻辑:

数值优化基础 无约束优化 约束优化 梯度下降法 一阶方法 线性收敛 牛顿法 二阶方法 二次收敛 拉格朗日乘子法 等式约束 转化为无约束 KKT条件 不等式约束 最优性条件 核心思想 无约束:沿梯度方向搜索 → 约束:将约束融入目标函数

这张图把本章的知识体系串起来了。左边是无约束优化的两种方法,右边是约束优化的两种方法。它们之间其实有联系——拉格朗日乘子法本质上就是把约束优化转化成了无约束优化。

我的经验之谈:在实际的轨迹优化中,你很少只用一种方法。我通常先用梯度下降快速找到一个差不多的解,再用牛顿法精调。遇到约束时,先判断是等式还是不等式,再选择对应的工具。别想着一个方法打天下。

好了,数值优化基础就聊到这儿。记住:梯度下降和牛顿法是你的左右手,拉格朗日乘子法和KKT条件是你的护身符。多练练,自然就熟了。

专注资料整理