2、MPC数学基础:线性系统理论回顾、状态空间模型、离散化方法、约束处理的基本概念
各位同学,欢迎来到第二章。
说实话,很多做MPC的朋友,最后调不通控制器,问题往往不是出在优化求解器上,而是出在模型上。模型不对,后面全白费。这一章,我们就来把MPC的数学地基夯实一下。
2.1 线性系统理论:为什么MPC偏爱线性模型?
MPC的核心思想,是用模型去预测未来。模型越准,预测越靠谱。但为什么工业界用得最多的还是线性模型?
原因很简单:线性模型好算。非线性模型虽然更精确,但求解一个非线性优化问题,计算量是指数级增长的。对于嵌入式控制器,几毫秒的采样周期,根本算不过来。
我个人习惯,在项目初期先用线性模型把框架跑通。等系统稳定了,再考虑要不要加入非线性补偿。这叫「先求稳,再求优」。
核心概念回顾:
- 线性系统:满足叠加性和齐次性。说白了,就是输入加倍,输出也加倍。
- 时不变系统:系统的参数不随时间变化。今天和明天的动态特性是一样的。
- 稳定性:系统受到扰动后,能否回到平衡点。这是MPC设计的前提。
你想想看,如果模型本身不稳定,MPC再怎么优化,也只是在「悬崖边跳舞」。我曾经在一个电机控制项目里,忽略了模型的高频未建模动态,结果MPC算出来的控制量,实际执行时电机直接抖起来了。嗯,那次的教训很深刻。
2.2 状态空间模型:MPC的「标准语言」
MPC几乎清一色使用状态空间模型。为什么不用传递函数?因为状态空间模型能处理多输入多输出(MIMO)系统,而且能直接表达系统的内部状态。
一个标准的离散状态空间模型长这样:
x(k+1) = A * x(k) + B * u(k)
y(k) = C * x(k) + D * u(k)
这里:
- x(k):状态向量。代表系统在k时刻的内部状态,比如电机的位置、速度。
- u(k):输入向量。就是我们MPC要算的控制量,比如电压、阀门开度。
- y(k):输出向量。我们能测量到的量,比如编码器读数。
- A, B, C, D:系统矩阵。它们描述了系统的动态特性。
我的小技巧: 在搭建MPC模型时,我建议把D矩阵设为零矩阵。为什么?因为D矩阵代表输入直接前馈到输出,这会让MPC的预测变得「过于乐观」。实际系统中,控制量几乎不可能瞬间影响输出。去掉D矩阵,模型更保守,但更鲁棒。
举个例子,一个简单的直流电机模型:
状态:x = [角度; 角速度]
输入:u = [电压]
输出:y = [角度]
A = [1, dt; 0, 1] // 运动学关系
B = [0; Kt*dt/J] // 电压产生力矩
C = [1, 0] // 只测量角度
你看,物理意义非常清晰。这就是状态空间模型的魅力。
2.3 离散化方法:从连续到离散的「翻译」
现实世界是连续的,但控制器是离散的。我们需要把连续模型「翻译」成离散模型。翻译得不好,MPC的预测就会失真。
常用的方法有三种,我分别说说我的使用心得。
2.3.1 零阶保持法(ZOH)
这是工业界最常用的方法。它假设:在采样周期内,控制量保持不变。说白了,就是DAC输出一个电压,然后保持到下一个采样时刻。
数学上,离散化公式为:
A_d = exp(A_c * Ts)
B_d = integral(exp(A_c * tau) * B_c, tau=0 to Ts)
其中,exp()是矩阵指数。这个计算在MATLAB里直接用c2d(sys, Ts, 'zoh')就行。
注意: 当采样频率接近系统带宽时,ZOH的近似误差会变大。我曾经在一个高频振动控制项目里,采样频率只比系统谐振频率高5倍,结果ZOH离散化后的模型,相位误差直接导致MPC发散。后来我把采样频率提高了10倍,问题才解决。
2.3.2 双线性变换(Tustin法)
双线性变换的精度比ZOH高,尤其适合频率响应要求高的场景。它的思想是用梯形积分近似连续积分。
公式很简单:
s = (2/Ts) * (z-1)/(z+1)
把连续传递函数中的s替换掉,就得到了离散传递函数。
我个人习惯:如果系统是低通特性,用ZOH;如果是带通或高通特性,用双线性变换。为什么?因为双线性变换不会产生频率混叠,而ZOH在高频段会有误差。
2.3.3 前向欧拉法
这个方法最简单,但精度最低。公式是:
x(k+1) = x(k) + Ts * (A_c * x(k) + B_c * u(k))
说白了,就是用当前时刻的斜率,去预测下一时刻的状态。
我几乎不用这个方法做MPC。为什么?因为它不稳定。当采样周期较大时,前向欧拉法可能把稳定的连续系统离散成不稳定的离散系统。你想想看,模型都不稳定了,MPC还怎么优化?
选型建议总结:
| 方法 | 精度 | 稳定性 | 推荐场景 |
|---|---|---|---|
| 零阶保持法 | 中等 | 高 | 通用场景,工业首选 |
| 双线性变换 | 高 | 高 | 高频系统、滤波器设计 |
| 前向欧拉法 | 低 | 低 | 不推荐用于MPC |
2.4 约束处理的基本概念:MPC的「灵魂」
MPC和传统PID最大的区别是什么?就是MPC能处理约束。没有约束的MPC,本质上就是一个线性二次型调节器(LQR)。
约束通常分为三类:
- 输入约束:比如电机最大电压、阀门最大开度。这是硬约束,绝对不能违反。
- 输出约束:比如机械臂不能撞到限位开关。这可以是软约束,允许轻微违反。
- 状态约束:比如电池不能过放。这通常也是硬约束。
在MPC中,约束被写成线性不等式:
u_min ≤ u(k) ≤ u_max
y_min ≤ y(k) ≤ y_max
然后,这些不等式被嵌入到优化问题中。求解器会在满足约束的前提下,寻找最优控制量。
避坑指南: 我曾经在一个项目中,把输出约束设得太紧。结果MPC为了满足约束,算出来的控制量来回震荡,系统反而更不稳定。后来我引入了「软约束」,允许输出在极端情况下轻微超限,但代价函数里加上惩罚项。这样一来,求解器有了「妥协」的空间,系统反而更平滑了。
嗯,这里要注意:约束越多,优化问题越难解。如果约束过多,可能导致无解。所以,实际项目中,我通常只对最关键的量加约束,比如电流、位置。次要的量,比如温度,用软约束或者干脆不加。
2.5 本章知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图。它展示了从连续系统到MPC优化问题的完整链路。
从这张图你可以看到,整个MPC的数学基础,就是从连续系统出发,经过离散化,得到离散状态空间模型,然后构建预测模型,最后加上约束,形成优化问题。每一步都环环相扣。
好了,这一章的内容就到这里。记住,模型是MPC的「眼睛」,约束是MPC的「手脚」。眼睛看不清,手脚再灵活也没用。下一章,我们会正式进入优化求解器的世界,看看这些数学公式是怎么变成实际代码的。