非线性约束的分类
说实话,非线性约束这个词,刚入行的时候听着挺唬人的。但干久了你会发现,它就是把现实世界中那些「不是直线」的关系,用数学语言描述出来而已。
我这些年做项目,碰到的非线性约束五花八门。但归纳起来,无非就四大类:多项式、三角函数、指数对数、分段线性。今天咱们就一个一个掰扯清楚。
1. 多项式约束
多项式约束是最常见的一类。说白了,就是变量之间是幂次关系。
一般形式长这样:
a₁x₁ⁿ¹ + a₂x₂ⁿ² + ... + aₖxₖⁿᵏ ≤ b
其中 n₁, n₂, ..., nₖ 是正整数。当 n=1 时就是线性,n≥2 就是非线性。
我在项目中遇到过一个典型的例子:某化工产品的产量与成本关系。产量翻倍,成本不是翻倍,而是呈二次增长。因为设备磨损、能耗增加这些因素,都是非线性的。
重点记忆:
- 二次约束(n=2):最常见,比如面积、功率计算
- 三次约束(n=3):体积、力矩相关场景
- 高次约束(n≥4):一般出现在物理模型或经济模型中
我的小技巧:处理多项式约束时,我习惯先判断次数。二次的可以用SOCP(二阶锥规划)转化,高次的就得考虑分段线性化了。别一上来就上SQP(序列二次规划),那玩意儿收敛性不一定好。
2. 三角函数约束
三角函数约束,说白了就是角度、旋转、周期这些场景。
常见形式:
sin(θ) + cos(φ) ≤ 1
tan(α) ≥ 0.5
你想想看,机器人关节的角度限制、卫星的姿态控制、天线的覆盖范围……这些全是三角函数约束的天下。
我曾经踩过一个坑:做机械臂路径规划时,直接用了 sin(θ) 作为约束。结果求解器报错说非凸。后来才意识到,sin(θ) 在 [0, 2π] 上既有凸区又有凹区。嗯,这里要注意——三角函数天然是非凸的,除非你限定在单调区间。
避坑指南:
- sin/cos 在 [0, π/2] 区间是单调的,可以近似处理
- tan 在接近 π/2 时会爆炸,数值稳定性差
- 我建议用泰勒展开或分段线性化来近似
3. 指数与对数约束
指数和对数约束,说白了就是增长或衰减不是线性的。
指数形式:
e^(ax) + e^(by) ≤ c
对数形式:
ln(x) + ln(y) ≥ d
这类约束在金融、通信、生物领域特别多。比如信号衰减模型、种群增长模型、复利计算……
我个人习惯是把指数约束转成对数形式来处理。为什么呢?因为对数函数是凹函数,在某些情况下可以保持凸性。举个例子:
原约束:e^(x) + e^(y) ≤ 10
等价于:ln(e^(x) + e^(y)) ≤ ln(10)
但注意,这个转化并不总是让问题变简单。有时候反而会引入更复杂的非线性。
实用建议:
- 指数约束:优先考虑取对数,看能否变成线性
- 对数约束:注意定义域,x 必须大于 0
- 实在不行就用指数锥(exponential cone)建模
4. 分段线性约束
分段线性约束,说白了就是用多段直线去逼近一条曲线。
形式:
f(x) = max(a₁x + b₁, a₂x + b₂, ..., aₖx + bₖ)
或者:
f(x) = min(a₁x + b₁, a₂x + b₂, ..., aₖx + bₖ)
为什么会有分段线性?因为很多实际问题中,关系不是一条直线能描述的。比如阶梯电价、批量折扣、税率计算……
我记得有一次做供应链优化,运输成本是阶梯式的:0-100吨一个价,100-500吨另一个价,500吨以上再一个价。这就是典型的分段线性约束。
处理技巧:
- 引入二进制变量,用大M法建模
- 或者用SOS2(特殊有序集)约束
- 我更喜欢SOS2,因为数值稳定性更好
知识体系总览
下面这张图,是我自己总结的分类体系。你看一眼就能记住:
各类约束的对比
| 类型 | 凸性 | 求解难度 | 常见场景 | 我的建议 |
|---|---|---|---|---|
| 多项式 | 取决于次数和系数 | 中等 | 物理模型、经济模型 | 二次优先用SOCP |
| 三角函数 | 非凸(全局) | 高 | 机器人、卫星、天线 | 分段线性化 |
| 指数/对数 | 指数凸,对数凹 | 中等 | 金融、通信、生物 | 尝试指数锥建模 |
| 分段线性 | 可凸可凹 | 低(但变量多) | 阶梯定价、批量折扣 | 优先用SOS2 |
最后提醒一句:别被「非线性」三个字吓到。实际项目中,80%的非线性约束都可以通过某种方式转化成线性或凸问题。关键是你要识别出它属于哪一类,然后对症下药。
我见过太多人一上来就上遗传算法、粒子群这些启发式方法。其实很多时候,换个角度建模,问题就简单了。