当前位置: 首页 > news >正文

零碎的知识点(二十一):序列二次规划(Sequential Quadratic Programming, SQP)

序列二次规划(Sequential Quadratic Programming, SQP)

    • 0. 先造一个超简单的一维问题
    • 1. 第 0 步:选一个初始点(就像选一个“初始机器人姿态”)
    • 2. 第 1 步:在当前点附近做“局部小问题”(SQP 的精髓)
      • 2.1 目标函数:二次近似
      • 2.2 约束:线性化(真正的重点!)
    • 3. 第 2 步:解这一轮的“小问题”(一个 QP)
    • 4. 第 3 步:更新 & 进入下一轮迭代

0. 先造一个超简单的一维问题

我们造一个“玩具问题”:

目标:
x xx尽量靠近 2(也就是最小化( x − 2 ) 2 (x-2)^2(x2)2
约束:
x xx不能太大,必须满足一个弯弯的非线性约束
g ( x ) = 1 − x 2 ≥ 0 g(x)=1-x^2\ge0g(x)=1x20

这个约束g ( x ) ≥ 0 g(x)\ge0g(x)0等价于:
1 − x 2 ≥ 0 ⟺ x 2 ≤ 1 ⟺ − 1 ≤ x ≤ 1 1-x^2\ge0\iff x^2\le1\iff -1\le x\le11x20x211x1

所以原问题其实是:

min ⁡ x F ( x ) = ( x − 2 ) 2 s.t. 1 − x 2 ≥ 0 \begin{aligned} \min_x\quad &F(x)=(x-2)^2\ \text{s.t.}\quad &1-x^2\ge0 \end{aligned}xminF(x)=(x2)2s.t.1x20

  • 没有约束的话,F ( x ) F(x)F(x)的最小值在x = 2 x=2x=2
  • x xx必须在区间[ − 1 , 1 ] [-1,1][1,1]里,所以真正的最优解是x ⋆ = 1 x^\star=1x=1(离 2 最近)。

我们现在要用“SQP 思想”一步一步往这个x ⋆ x^\starx靠近。


1. 第 0 步:选一个初始点(就像选一个“初始机器人姿态”)

假设我们一开始什么都不知道,随便给一个可行点,比如:

x ( 0 ) = 0.5 x^{(0)}=0.5x(0)=0.5

检查一下约束:

g ( x ( 0 ) ) = 1 − ( 0.5 ) 2 = 1 − 0.25 = 0.75 > 0 g(x^{(0)})=1-(0.5)^2=1-0.25=0.75>0g(x(0))=1(0.5)2=10.25=0.75>0

OK,说明x ( 0 ) x^{(0)}x(0)在可行域里面(就像机器人这一帧姿态安全、不穿模)。


2. 第 1 步:在当前点附近做“局部小问题”(SQP 的精髓)

现在来到SQP 的关键思想

x ( 0 ) x^{(0)}x(0)附近,

  • 把目标函数F ( x ) F(x)F(x)用一个二次函数近似(这里它本来就是二次,所以刚好“近似=原函数”);
  • 把约束g ( x ) ≥ 0 g(x)\ge0g(x)0用一条直线近似。

然后解这个“目标二次 + 约束线性”的小问题(QP),作为当前迭代的更新。

2.1 目标函数:二次近似

我们的目标是:

F ( x ) = ( x − 2 ) 2 F(x)=(x-2)^2F(x)=(x2)2

它本来就是二次函数,所以在x ( 0 ) x^{(0)}x(0)附近做“二次近似”,其实就是它自己——不用改:

F ~ ( 0 ) ( x ) = F ( x ) = ( x − 2 ) 2 \tilde{F}^{(0)}(x)=F(x)=(x-2)^2F~(0)(x)=F(x)=(x2)2

对应论文原话:
“对匹配目标(1a)在上一次迭代的解附近做二次近似。”
在这个玩具例子里,“二次近似”刚好就是原函数本身。


2.2 约束:线性化(真正的重点!)

约束是:

g ( x ) = 1 − x 2 ≥ 0 g(x)=1-x^2\ge0g(x)=1x20

这是一条弯弯的抛物线,我们在x ( 0 ) = 0.5 x^{(0)}=0.5x(0)=0.5附近,用它的切线来逼近它:

一维函数的线性化 = 在x ( 0 ) x^{(0)}x(0)点做一阶泰勒展开:

g ( x ) ≈ g ( x ( 0 ) ) + g ′ ( x ( 0 ) ) ( x − x ( 0 ) ) g(x)\approx g(x^{(0)}) + g'(x^{(0)})(x-x^{(0)})g(x)g(x(0))+g(x(0))(xx(0))

先算这些量:

  • g ( x ) = 1 − x 2 g(x)=1-x^2g(x)=1x2

  • 导数g ′ ( x ) = − 2 x g'(x)=-2xg(x)=2x

  • x ( 0 ) = 0.5 x^{(0)}=0.5x(0)=0.5处:

    • g ( x ( 0 ) ) = 1 − ( 0.5 ) 2 = 0.75 g(x^{(0)})=1-(0.5)^2=0.75g(x(0))=1(0.5)2=0.75
    • g ′ ( x ( 0 ) ) = − 2 ⋅ 0.5 = − 1 g'(x^{(0)})=-2\cdot0.5=-1g(x(0))=20.5=1

所以线性化得到:

g ~ ( 0 ) ( x ) = g ( x ( 0 ) ) + g ′ ( x ( 0 ) ) ( x − x ( 0 ) ) = 0.75 + ( − 1 ) ( x − 0.5 ) \tilde{g}^{(0)}(x) = g(x^{(0)})+g'(x^{(0)})(x-x^{(0)}) = 0.75 + (-1)(x-0.5)g~(0)(x)=g(x(0))+g(x(0))(xx(0))=0.75+(1)(x0.5)

展开一下:

g ~ ( 0 ) ( x ) = 0.75 − x + 0.5 = 1.25 − x \tilde{g}^{(0)}(x) = 0.75 - x + 0.5 = 1.25 - xg~(0)(x)=0.75x+0.5=1.25x

于是原来的非线性约束:

g ( x ) ≥ 0 g(x)\ge0g(x)0

在这一轮迭代里,被近似成线性的

g ~ ( 0 ) ( x ) = 1.25 − x ≥ 0 ⇒ x ≤ 1.25 \tilde{g}^{(0)}(x)=1.25-x\ge0\quad\Rightarrow\quad x\le1.25g~(0)(x)=1.25x0x1.25

这就是论文那句:
“对非穿透约束(1b)进行线性化处理。”
——原本弯的“不能穿透曲线”,在这一轮里变成一条直线约束。

注意:

  • 真约束− 1 ≤ x ≤ 1 -1\le x\le11x1
  • 线性近似约束x ≤ 1.25 x\le1.25x1.25
  • x ( 0 ) = 0.5 x^{(0)}=0.5x(0)=0.5附近,这个线性近似是“差不太多”的(至少方向对)。

真正的 SQP 还会加“信任域/步长控制”确保你不要一步走太远,我们待会简单提一下。


3. 第 2 步:解这一轮的“小问题”(一个 QP)

现在,本轮的“局部近似问题”变成:

min ⁡ x F ~ ( 0 ) ( x ) = ( x − 2 ) 2 s.t. g ~ ( 0 ) ( x ) = 1.25 − x ≥ 0 ⇒ x ≤ 1.25 \begin{aligned} \min_x\quad &\tilde{F}^{(0)}(x)=(x-2)^2\ \text{s.t.}\quad &\tilde{g}^{(0)}(x)=1.25-x\ge0\quad\Rightarrow\quad x\le1.25 \end{aligned}xminF~(0)(x)=(x2)2s.t.g~(0)(x)=1.25x0x1.25

这是一个非常简单的二次规划问题:

  • 目标( x − 2 ) 2 (x-2)^2(x2)2是碗形向上的曲线,最小值在x = 2 x=2x=2
  • 但加了约束x ≤ 1.25 x\le1.25x1.25,所以“能选的最小点”就是
    x ( 1 ) = 1.25 x^{(1)}=1.25x(1)=1.25

直观:

  • 碗的最低点在 2;
  • 但你被限制只能站在“2 左边不超过 1.25”的地方;
  • 那你能到的最低的点自然是“最靠近 2 的 1.25”。

于是:

x ( 1 ) = 1.25 x^{(1)}=1.25x(1)=1.25

这就是 SQP 第 1 轮迭代算出来的“新姿态”(对应机器人那边的一帧q t ( 1 ) q_t^{(1)}qt(1))。


4. 第 3 步:更新 & 进入下一轮迭代

在真正的 SQP 里,这时候还会做两件事:

  1. 检查原始约束是不是被破坏太多?
    比如我们看一下真约束g ( x ) = 1 − x 2 ≥ 0 g(x)=1-x^2\ge0g(x)=1x20x ( 1 ) = 1.25 x^{(1)}=1.25x(1)=1.25处:

g ( 1.25 ) = 1 − ( 1.25 ) 2 = 1 − 1.5625 = − 0.5625 < 0 g(1.25)=1-(1.25)^2=1-1.5625=-0.5625<0g(1.25)=1(1.25)2=11.5625=0.5625<0

说明:

  • 在线性近似约束里x = 1.25 x=1.25x=1.25还算“合法”;
  • 但对原始非线性约束来说,1.25 1.251.25已经跑到可行域外了。

所以真正的 SQP 会用“步长缩放 / 信任域”,不会一下子从 0.5 跳到 1.25,
而是走一小步,比如从 0.5 走到 0.8、0.9 之类的,以保持可行性或至少不离太远。

  1. x ( 1 ) x^{(1)}x(1)当成下一轮的“当前点”x ( 1 ) x^{(1)}x(1),再线性化/二次近似一次,重复刚才的步骤。

如果继续迭代几次,你会发现解会慢慢靠近真正的可行最优点x ⋆ = 1 x^\star=1x=1

你此时需要记住的核心点只有:

  • 每一轮:

    • 目标 → 在当前点附近用二次函数近似;
    • 非线性约束 → 在当前点附近用直线近似;
  • 得到一个“二次目标 + 线性约束”的小问题 → 很好解;

  • 解完 → 更新当前点 → 再近似 → 再解。

这就是“序列二次规划”名字的由来:

不断解一串(二次规划)问题,来逼近原来的非线性规划。


http://www.cnnetsun.cn/news/4510.html

相关文章:

  • Python-Wechaty构建高可用微信机器人的分布式架构实践
  • DataGear完整指南:5分钟快速上手开源数据可视化平台
  • Blender Python API终极指南:从零开始掌握3D自动化编程
  • ZEMAX激光成像设计:5个实战案例快速上手指南
  • EverythingToolbar与Everything搜索引擎深度集成:Windows文件搜索的技术革命
  • 为什么你的MinerU本地部署总是失败?5个关键检查点帮你彻底解决
  • 积木报表JimuReport终极部署指南:从零到精通的完整教程
  • GPT-5.2:会改变创意产业的格局,还是仅仅是昙花一现?
  • 基于扩散架构的高效T2V模型:Wan2.2-T2V-5B原理剖析
  • 终极Altium设计文件查看解决方案:零门槛访问PCB与原理图
  • 终极指南:5分钟打造你的个人信息指挥中心
  • 教你3步防止浏览器指纹泄露,隐私安全不再是难题
  • 如何快速掌握Play Integrity Fix:新手完整教程
  • 昇腾 CANN 与 Ascend C 协同创新:算子开发的效率提升与技术演进
  • 鸿蒙 + Electron:跨端开发新范式,从环境搭建到实战开发
  • Wan2.2-T2V-5B能否生成法律情景剧视频?合规性审查
  • Gittyup终极指南:快速掌握图形化Git客户端
  • PowerShell 7.5启动失败的终极诊断与修复指南
  • Altium Designer Viewer - 免费电路设计查看终极方案
  • VCR终极贡献指南:快速掌握HTTP测试录制工具的开源参与技巧
  • LLM之Agent(四十)|AI Agents(九):Agentic Memory介绍
  • 终极免费图片查看器PicView完整使用指南:快速掌握高效浏览技巧
  • (LU)小动物自身给药系统 自身给药系统 静脉自身给药系统
  • MFC Custom Control控件完全指南:从入门到精通
  • 计算机毕设java的饮品店销售管理系统的设计与实现 基于 Java 技术的饮品店销售与管理信息化系统开发 Java 环境下饮品店销售管理系统的设计与应用实现
  • xmltodict数据转换机制深度解析
  • Flux.1 Kontext Dev:120亿参数AI绘画神器,新手也能轻松上手的完全指南
  • 【Spring MVC引擎篇】DispatcherServlet初始化全流程:九大核心策略接口的加载与初始化源码解析
  • 解锁中文输入新境界:智能配置管理工具深度体验
  • Spring Boot自动配置魔法揭秘:手把手解析`@EnableAutoConfiguration`与`spring.factories`的加载全过程 (深度解析版)