4. 离散系统数学模型:差分方程、脉冲传递函数、零极点图
各位,咱们今天聊聊离散系统的数学模型。说实话,这部分内容是我当年学控制时觉得最「绕」的一块。但后来做项目多了才发现,搞懂了这三个东西——差分方程、脉冲传递函数、零极点图——你基本就能在数字控制的世界里横着走了。
为什么这么说?因为无论是设计数字滤波器,还是做电机伺服控制,底层都是这三样东西在撑腰。我习惯把它们看作「三位一体」:差分方程是时域的描述,脉冲传递函数是频域的工具,零极点图则是直观的「性格画像」。
4.1 差分方程:离散世界的「运动方程」
先说说差分方程。连续系统用微分方程描述,离散系统呢?用差分方程。说白了,就是把「导数」换成了「差值」。
一个典型的 n 阶差分方程长这样:
y(k) + a₁·y(k-1) + a₂·y(k-2) + ... + aₙ·y(k-n)
= b₀·u(k) + b₁·u(k-1) + ... + bₘ·u(k-m)
这里 y(k) 是当前输出,y(k-1) 是上一拍的输出,以此类推。u(k) 是当前输入。
核心理解:差分方程描述的是「当前输出与过去输入输出之间的关系」。你想想看,这不就是数字系统的「记忆」吗?
我在项目中遇到过一件事。有一次调试一个温控系统,采样周期设得太大,结果差分方程算出来的控制量总是滞后。后来把采样周期从 1 秒改成 0.2 秒,系统立马稳了。嗯,这里要注意:差分方程的系数跟采样周期是绑定的,换了采样率,系数必须重新算。
4.2 脉冲传递函数:z 域里的「黑箱」
差分方程在时域里挺好用,但分析稳定性、频率响应这些,还是得靠脉冲传递函数。
怎么得到它?对差分方程两边做 Z 变换,然后整理成输出/输入的形式:
G(z) = Y(z) / U(z)
= (b₀ + b₁·z⁻¹ + ... + bₘ·z⁻ᵐ) / (1 + a₁·z⁻¹ + ... + aₙ·z⁻ⁿ)
我个人习惯把 G(z) 看作一个「黑箱」——输入一串数字,输出另一串数字。这个黑箱的特性,完全由分子分母的系数决定。
实用技巧:在 MATLAB 里用 tf([b0 b1 ... bm], [1 a1 ... an], Ts) 就能直接得到脉冲传递函数。Ts 是采样周期,千万别忘了填。
我曾经犯过一个低级错误:把连续传递函数 G(s) 直接拿来当 G(z) 用。结果仿真跑出来完全不对。后来才意识到,离散化这一步不能省。常用的方法有零阶保持器法、双线性变换法,具体用哪个看你的应用场景。
4.3 零极点图:一眼看穿系统「性格」
零极点图,说白了就是把 G(z) 的分子根(零点)和分母根(极点)画在复平面上。别小看这张图,它能告诉你的事太多了:
- 稳定性:所有极点都在单位圆内 → 系统稳定。只要有一个极点在圆外 → 系统发散。
- 响应速度:极点越靠近原点,响应越快。极点靠近单位圆,响应就慢吞吞的。
- 振荡特性:极点在负实轴上,容易产生振荡。极点有虚部,就会有衰减振荡。
⚠️ 避坑指南:我曾经设计过一个数字滤波器,零极点图看着挺漂亮,所有极点都在单位圆内。但实际跑起来,输出一直在小幅振荡。查了半天才发现——有个极点虽然在内,但离单位圆太近了(0.98),导致衰减极慢。所以记住:不仅要看「在不在圆内」,还要看「离圆边有多远」。
4.4 三者之间的「互转」关系
这三个模型其实是等价的。你只要知道其中一个,就能推出另外两个。我习惯用一张表来记它们的关系:
| 已知模型 | 转换方法 | 得到模型 |
|---|---|---|
| 差分方程 | Z 变换 | 脉冲传递函数 |
| 脉冲传递函数 | 逆 Z 变换 | 差分方程 |
| 脉冲传递函数 | 分子分母因式分解 | 零极点图 |
| 零极点图 | 写出因式形式 | 脉冲传递函数 |
举个例子。假设你有一个差分方程:
y(k) - 1.5·y(k-1) + 0.7·y(k-2) = 0.2·u(k) + 0.1·u(k-1)
做 Z 变换得到:
G(z) = (0.2 + 0.1·z⁻¹) / (1 - 1.5·z⁻¹ + 0.7·z⁻²)
分子分母同乘 z²:
G(z) = (0.2·z² + 0.1·z) / (z² - 1.5·z + 0.7)
然后求根。分母的根是极点,分子的根是零点。画出来,你就能直观判断这个系统的稳定性了。
我的经验:实际项目中,我很少手动算这些。用 MATLAB 的 roots() 函数求根,用 pzmap() 画零极点图,几分钟搞定。但理解背后的原理很重要——不然你连图都看不懂,更别说调试了。
4.5 一个完整的例子
咱们走一遍完整的流程。假设你要设计一个数字低通滤波器,截止频率 100 Hz,采样频率 1000 Hz。
第一步,用双线性变换法得到脉冲传递函数:
G(z) = (0.0675 + 0.135·z⁻¹ + 0.0675·z⁻²) / (1 - 1.143·z⁻¹ + 0.4128·z⁻²)
第二步,写出对应的差分方程:
y(k) = 1.143·y(k-1) - 0.4128·y(k-2) + 0.0675·u(k) + 0.135·u(k-1) + 0.0675·u(k-2)
第三步,画零极点图。极点大概在 0.571 ± j0.293,都在单位圆内。零点在 -1(双重根),正好在单位圆上。
你看,从设计指标到实际可运行的代码,就是这么过来的。差分方程是最终写进单片机里的东西,脉冲传递函数是设计阶段的分析工具,零极点图则是验证手段。
小提示:写代码实现差分方程时,我习惯用「直接 II 型」结构。它用的存储单元最少,适合资源受限的嵌入式系统。具体实现可以查一下「数字滤波器结构」的相关资料。
好了,这一章的内容就到这儿。记住我说的:差分方程、脉冲传递函数、零极点图,三位一体,缺一不可。搞懂了它们,离散控制的大门就算正式打开了。
公众号:蓝海资料掘金营,微信deep3321