4、建立状态空间模型:从微分方程到状态空间,从传递函数到状态空间,机电系统的建模实例
各位工程师朋友,咱们今天聊聊状态空间建模。说实话,我刚入行那会儿,总觉得状态空间是个很玄乎的东西。直到有一次调试一个柔性机械臂,传统的传递函数方法怎么都搞不定,我才真正体会到状态空间的威力。
说白了,状态空间模型就是把系统的内部状态全部摊开给你看。不像传递函数只关心输入输出,状态空间让你能看到系统内部每个变量的变化。嗯,这就好比看病——传递函数是只看体温和血压,状态空间是把血液、神经、骨骼全给你检查一遍。
4.1 从微分方程到状态空间
先从一个简单的例子说起。假设你有一个弹簧-质量-阻尼系统,微分方程是:
m·ẍ + b·ẋ + k·x = F(t)
这里x是位移,F是外力。怎么变成状态空间?我个人习惯这样做:
第一步:选择状态变量
我一般选那些能完全描述系统能量的变量。对于这个系统,就是位移和速度:
x₁ = x (位移)
x₂ = ẋ (速度)
第二步:写出状态方程
把微分方程拆成一阶方程组:
ẋ₁ = x₂
ẋ₂ = -(k/m)·x₁ - (b/m)·x₂ + (1/m)·F(t)
第三步:写成矩阵形式
[ẋ₁] [0 1 ] [x₁] [0 ]
[ẋ₂] = [-k/m -b/m] [x₂] + [1/m]·F(t)
y = [1 0] [x₁]
[x₂]
关键点:状态变量的选择不是唯一的。你可以选位移和动量,也可以选其他组合。但记住,状态变量必须线性无关,且能完全描述系统动态。
4.2 从传递函数到状态空间
传递函数转状态空间,我遇到过不少坑。最常见的传递函数形式是:
G(s) = (b₁sⁿ⁻¹ + b₂sⁿ⁻² + ... + bₙ) / (sⁿ + a₁sⁿ⁻¹ + ... + aₙ)
可控标准型是我最常用的方法。为什么?因为控制器设计特别方便。
假设一个二阶系统:
G(s) = (s + 2) / (s² + 3s + 2)
可控标准型的状态空间是:
A = [0 1] B = [0] C = [2 1] D = [0]
[-2 -3] [1]
我的经验:做电机控制时,我习惯用可控标准型。因为极点配置时,反馈矩阵K的计算特别直观。但如果你要做观测器设计,可观测标准型会更顺手。
4.3 机电系统的建模实例
好了,咱们来个实战。直流电机,这是运动控制里最常见的执行器。
系统描述:
- 电枢电压Vₐ输入
- 电机转速ω输出
- 考虑电枢电感L、电阻R、反电动势常数Kₑ、转矩常数Kₜ、转动惯量J、阻尼系数B
微分方程:
电枢回路:L·di/dt + R·i = Vₐ - Kₑ·ω
机械方程:J·dω/dt + B·ω = Kₜ·i
选择状态变量:
我选电枢电流i和转速ω。为什么?因为这两个变量物理意义明确,而且可以直接测量。
x₁ = i (电枢电流)
x₂ = ω (转速)
状态空间模型:
[di/dt] [-R/L -Kₑ/L] [i] [1/L]
[dω/dt] = [Kₜ/J -B/J ] [ω] + [0 ]·Vₐ
y = [0 1] [i]
[ω]
我曾经踩过的坑:有一次做高速电机控制,忽略了电枢电感L。结果模型在低频时很准,一到高频就完全对不上。后来才意识到,L在高频时的影响不能忽略。所以,建模时一定要考虑你的工作频率范围。
4.4 建模中的实用技巧
做了这么多年运动控制,我总结了几条建模心得:
- 状态变量选可测量的——这样后续做状态反馈时,可以减少观测器的设计工作量
- 矩阵维度要匹配——A是n×n,B是n×m,C是p×n,D是p×m。这个搞错了,仿真跑起来全是NaN
- 注意单位换算——我见过有人把N·m和N·cm搞混,结果控制器参数差了100倍
- 先仿真再实验——用MATLAB的ss()函数建好模型,跑个阶跃响应看看,基本能发现大部分问题
一句话总结:状态空间建模就是把物理系统的能量流动关系,用一阶微分方程组的形式表达出来。选好状态变量,列好方程,剩下的就是矩阵运算了。
嗯,说到这儿,我想起一个项目。当时做精密定位平台,用了压电陶瓷执行器。那个系统的迟滞非线性特别严重,传统的线性状态空间模型根本不够用。后来我引入了扩展状态变量,把迟滞效应也建模进去,效果才好了起来。
所以,状态空间模型不是死板的。你可以根据实际需要,灵活地增加状态变量来描述更复杂的物理现象。这才是状态空间方法的真正魅力所在。
下一章,咱们聊聊状态空间模型的解——也就是怎么从状态方程算出系统的时间响应。到时候我会分享一个我做伺服驱动器时用的数值积分技巧,挺实用的。