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 建模中的实用技巧

做了这么多年运动控制,我总结了几条建模心得:

  1. 状态变量选可测量的——这样后续做状态反馈时,可以减少观测器的设计工作量
  2. 矩阵维度要匹配——A是n×n,B是n×m,C是p×n,D是p×m。这个搞错了,仿真跑起来全是NaN
  3. 注意单位换算——我见过有人把N·m和N·cm搞混,结果控制器参数差了100倍
  4. 先仿真再实验——用MATLAB的ss()函数建好模型,跑个阶跃响应看看,基本能发现大部分问题

一句话总结:状态空间建模就是把物理系统的能量流动关系,用一阶微分方程组的形式表达出来。选好状态变量,列好方程,剩下的就是矩阵运算了。

嗯,说到这儿,我想起一个项目。当时做精密定位平台,用了压电陶瓷执行器。那个系统的迟滞非线性特别严重,传统的线性状态空间模型根本不够用。后来我引入了扩展状态变量,把迟滞效应也建模进去,效果才好了起来。

所以,状态空间模型不是死板的。你可以根据实际需要,灵活地增加状态变量来描述更复杂的物理现象。这才是状态空间方法的真正魅力所在。

下一章,咱们聊聊状态空间模型的解——也就是怎么从状态方程算出系统的时间响应。到时候我会分享一个我做伺服驱动器时用的数值积分技巧,挺实用的。