第二章:零极点图的绘制
零极点图这东西,说白了就是系统特性的「身份证」。我当年刚学的时候,总觉得画几个叉叉圈圈有啥用?直到有一次调试一个音频滤波器,死活调不出想要的频响曲线——后来一看零极点图,好家伙,一个极点跑到了右半平面,系统都快不稳定了。从那以后,我再也不敢小看这张图了。
2.1 手动绘制零极点图
手动绘制,听起来有点老土对吧?但我告诉你,这是理解零极点最扎实的方法。你想想看,如果连手绘都搞不明白,用软件画出来也是一脸懵。
手绘的核心就三步:
- 写出传递函数,化成标准的零极点形式
- 找零点:让分子等于0,解出s的值
- 找极点:让分母等于0,解出s的值
举个例子,假设有个传递函数:
H(s) = (s + 2) / (s² + 3s + 2)
零点:s + 2 = 0 → s = -2
极点:s² + 3s + 2 = 0 → (s+1)(s+2) = 0 → s = -1, s = -2
嗯,这里要注意:零点和极点有重合!s = -2既是零点又是极点,这叫「零极点对消」。我在项目中遇到过这种情况,当时仿真结果一直不对,查了半天才发现是零极点对消导致系统阶数降低了。
手绘时,我们通常用「○」表示零点,用「×」表示极点。画在复平面上,横轴是实部σ,纵轴是虚部jω。
手绘小技巧:
- 实轴上的点:直接标在横轴上
- 共轭复极点:关于实轴对称出现
- 重极点/重零点:在旁边标个数字表示重数
2.2 使用Python/Matlab绘制零极点图
实际工程中,谁还手绘啊?我都是用Python或者Matlab一把梭。下面给出两种工具的代码,你直接拿去用。
Python实现(使用control库)
import control as ct
import matplotlib.pyplot as plt
# 定义传递函数
num = [1, 2] # 分子:s + 2
den = [1, 3, 2] # 分母:s² + 3s + 2
sys = ct.TransferFunction(num, den)
# 绘制零极点图
ct.pzmap(sys, plot=True)
plt.title('零极点图 - Python实现')
plt.grid(True)
plt.show()
Matlab实现
% 定义传递函数
num = [1 2]; % 分子:s + 2
den = [1 3 2]; % 分母:s² + 3s + 2
sys = tf(num, den);
% 绘制零极点图
pzmap(sys)
grid on
title('零极点图 - Matlab实现')
避坑指南:我曾经用Python画图时,发现零极点位置不对。后来检查发现是control库版本问题,0.8.x和0.9.x的pzmap函数参数有变化。建议用pip install control==0.9.2固定版本。
2.3 零极点图的解读
图画出来了,怎么看?这才是核心。我总结了一个「三步读图法」:
| 观察点 | 判断依据 | 工程含义 |
|---|---|---|
| 极点位置 | 左半平面 → 稳定 右半平面 → 不稳定 虚轴上 → 临界稳定 |
系统会不会炸? |
| 零点位置 | 靠近极点 → 抵消作用 远离极点 → 影响明显 |
频率响应怎么变? |
| 极点到原点的距离 | 距离越远 → 频率越高 距离越近 → 频率越低 |
响应快慢如何? |
说白了,零极点图就是系统的「体检报告」。极点决定稳定性,零点决定细节形状。
重要提醒:千万别以为零极点都在左半平面就万事大吉。我遇到过一种情况:所有极点都在左半平面,但有一个极点非常靠近虚轴(比如实部只有-0.01)。系统虽然稳定,但调节时间长得离谱,实际根本没法用。所以不仅要看「在哪」,还要看「多远」。
知识体系总览
下面这张图,是我自己整理的零极点图知识框架。你把它存下来,学完这章再回头看,思路会特别清晰。
这张图把零极点图的三个层面串起来了。手动绘制是基本功,软件绘制是生产力,图解读是最终目的。三者缺一不可。
我的个人习惯:每次拿到一个新系统,我都会先手算一下零极点的大致位置,再用Python验证。这样心里有数,不会出现「软件画出来啥就是啥」的被动局面。你想想看,如果软件有bug或者参数设错了,你连对错都判断不了,那多危险?
好了,零极点图的绘制就讲到这里。记住:画图不是目的,看懂图才是。下一节我们会深入探讨零极点对系统性能的具体影响,到时候你会更深刻地理解「为什么一个极点的位置能决定系统的生死」。
公众号:蓝海资料掘金营,微信deep3321