信号与系统里,收敛域(Region of Convergence,ROC)是被低估的概念。无论拉普拉斯变换还是 Z 变换,ROC 都决定同一个代数表达式对应哪个时域信号,也决定系统是否因果、是否稳定、在工程上会不会出现发散和崩溃。课程作业里常常给一个 X(s) 或 X(z),不写 ROC,然后问能不能唯一确定原信号;保研面试里也常拿这个点考察对双边变换的理解。答案是明确的:不能。只知道代数表达式,不指定收敛域,一个式子可以对应右边信号、左边信号甚至双边信号。这篇文章先把这个问题讲透,再给出从 ROC 判断电子系统稳定性的完整方法,并用 Python 仿真验证结论。
1. 同一个表达式为什么对应多个信号:先回答题目里的核心问题
1.1 双边拉普拉斯变换把收敛问题带进来了
连续时间信号的拉普拉斯变换定义为:
X(s) = ∫_{-∞}^{+∞} x(t) e^{-st} dt
其中复数变量 s = σ + jω。注意积分区间是负无穷到正无穷,这是“双边”变换。问题就出在这个双边积分上:e^{-st} 在 σ 较大或较小时,可能让积分趋于无穷大。对同一个 x(t),只有当 s 落在合适的区域内,积分才收敛。这个收敛区域就是 ROC。
例如信号 e^{-t}u(t),u(t) 是单位阶跃。当 t 从 0 到正无穷时,e^{-t}e^{-σt} 要能衰减,必须有 σ > -1。所以它的 ROC 是 Re{s} > -1。再看信号 -e^{-t}u(-t),这个信号只在 t 小于等于 0 时有值。当 t 从负无穷到 0 时,要保证积分收敛,必须有 σ < -1,所以它的 ROC 是 Re{s} < -1。
关键在于:这两个完全不同的信号,做拉普拉斯变换后得到的代数表达式都是 1/(s+1)。一个表达式,两个 ROC,对应两个时域波形。这就是“只知表达式不知收敛域,不能确定信号”的直接原因。
1.2 反变换不是机械套公式,而是要选对积分围线
拉普拉斯反变换公式是:
x(t) = (1/2πj) ∫_{σ0-j∞}^{σ0+j∞} X(s) e^{st} ds
积分路径是一条垂直直线,这条直线必须完整落在 ROC 内部。σ0 取什么值,决定了这条线在复平面的位置,也就决定了它相对各极点的左右关系。
用留数定理计算这个积分时,t > 0 和 t < 0 需要分别补上不同的闭合围线。对于 t > 0,通常向左闭合,围线里包住的是位于积分路径左侧的极点;对于 t < 0,通常向右闭合,包住右侧的极点。ROC 在极点左边还是右边,直接决定哪些极点在围线里。以 X(s) = 1/(s+1) 为例,ROC 取 Re{s} > -1 时,极点 s = -1 在积分路径左侧,得到右边信号;ROC 取 Re{s} < -1 时,极点 s = -1 在积分路径右侧,得到左边信号。
1.3 最小例子:一个表达式真的对应三个时域信号
再用一个含两个极点的表达式说明问题会更直观。取 X(s) = 1/((s+1)(s+2)),它可以分解为:
X(s) = 1/(s+1) - 1/(s+2)
两个极点在 s = -1 和 s = -2。ROC 可以是三个不同区域,分别对应三个不同的时域信号:
| ROC | 时域信号 x(t) | 信号类型 |
|---|---|---|
| Re{s} > -1 | (e^{-t} - e^{-2t})u(t) | 右边信号,因果 |
| -2 < Re{s} < -1 | -e^{-t}u(-t) - e^{-2t}u(t) | 双边信号,非因果 |
| Re{s} < -2 | (e^{-2t} - e^{-t})u(-t) | 左边信号,非因果 |
这里最关键的是中间那一行。ROC 落在两个极点之间时,既有右边部分,也有左边部分,对应的是一个双边信号。这已经足够说明问题:同一个 X(s),在不同 ROC 下分别是因果信号、非因果双边信号和纯反因果信号。题目如果只给表达式不给 ROC,三个答案都不能认为哪个“唯一正确”。
注意:这里讨论的是双边拉普拉斯变换。实际工程中很多教材先讲单边变换,单边变换默认 t < 0 时信号为 0,所以不会出现多义性。但系统函数、反馈网络、滤波器设计里普遍使用双边变换,ROC 必须显式写出来。
2. 收敛域是怎么决定系统因果性和稳定性的
2.1 因果性:看 ROC 在极点群的哪一侧
对线性时不变系统,系统函数 H(s) 是单位冲激响应 h(t) 的拉普拉斯变换。因果系统的 h(t) 在 t < 0 时为 0,对应 ROC 一定是某个右半平面,也就是位于最右侧极点的右边:
ROC: Re{s} > max(Re{极点})
反过来,如果 ROC 是左半平面,即位于最左侧极点的左边,对应的是反因果信号;ROC 是一个竖直带,对应双边信号。判断因果性时,不要看表达式本身,要看 ROC 的位置。一个表达式可以同时有因果和非因果两种解释,物理上最终取哪种,取决于系统的实际构造和问题的边界条件。
2.2 稳定性:连续系统的虚轴判据
系统稳定性最常用的定义是 BIBO 稳定:有界输入一定产生有界输出。对连续时间 LTI 系统,BIBO 稳定等价于冲激响应绝对可积:
∫_{-∞}^{+∞} |h(t)| dt < ∞
在变换域里,这个条件等价于 ROC 包含虚轴 jω。虚轴是 e^{st} 既不衰减也不增长的边界。只要某个极点落在虚轴上,系统处于临界稳定;极点落在右半平面,冲激响应会指数增长;ROC 不包含虚轴,则必然存在某个有界输入让输出无界。
对因果系统,这个判据可以简化:ROC 是右半平面,如果它包含虚轴,等价于所有极点都在左半平面,也就是所有极点实部小于 0。这是工程中最常用的说法:“因果系统稳定的充要条件是全部极点位于左半平面。”但这句话的前提是系统因果。非因果系统允许极点在右半平面,只要 ROC 选在圆带或左半平面并包含虚轴,仍可能是稳定的。
2.3 离散系统的单位圆判据
离散时间 LTI 系统的系统函数 H(z) 是单位脉冲响应 h[n] 的 Z 变换。BIBO 稳定的条件变为:
Σ_{n=-∞}^{+∞} |h[n]| < ∞
对应到 Z 平面,ROC 必须包含单位圆 |z| = 1。因为单位圆上的 z = e^{jω} 对应频率响应,也对应既不增长也不衰减的边界。对因果离散系统,ROC 是最外层极点外部区域,所以稳定的因果离散系统要求所有极点都在单位圆内部。
工程上常见的一个误区是把连续系统和离散系统的边界搞混。连续系统看虚轴,离散系统看单位圆;极点 s = 0 对应连续积分器,是临界稳定,极点 z = 1 对应离散累加器,同样是临界稳定。两者逻辑一致,但判断平面完全不同。
2.4 “系统崩溃”在工程里到底指什么
电子系统会崩溃,直接原因通常是稳定性被破坏。反馈放大器相位裕度不足时,闭环极点会落入右半平面,阶跃响应先震荡然后发散,输出被电源轨限幅后表现为持续的振荡或饱和。开关电源补偿网络设计不当,环路不稳定,输出电压会出现低频振荡甚至失控。电机驱动电流环发散,电流快速超过保护阈值。锁相环若环路滤波器参数错误,相位误差会越追越大。
这些现象背后的共同数学本质只有一个:闭环系统函数存在位于稳定边界之外的极点,导致 ROC 不包含稳定边界,冲激响应不再绝对可积。所以工程师判断“系统会不会崩溃”,本质上就是在判断系统函数的 ROC 是否包含虚轴(连续)或单位圆(离散)。这就是收敛域从理论走向工程实践最重要的落点。
3. 连续系统:拉普拉斯 ROC 的完整分析流程
3.1 用部分分式加 ROC 确定每一项的时域形式
拿到一个有理系统函数后,完整流程是:先展成部分分式,再结合 ROC 逐项反变换。以 X(s) = 1/((s+1)(s+2)) 为例,部分分式展开得到 1/(s+1) - 1/(s+2),然后查表:
- 1/(s+1) 在 ROC Re{s} > -1 时对应 e^{-t}u(t),在 ROC Re{s} < -1 时对应 -e^{-t}u(-t)
- 1/(s+2) 在 ROC Re{s} > -2 时对应 e^{-2t}u(t),在 ROC Re{s} < -2 时对应 -e^{-2t}u(-t)
用 Python 的 scipy.signal.residue 可以快速得到留数和极点:
import scipy.signal as sig # X(s) = 1 / ((s + 1)(s + 2)) # 分子系数 [1],分母系数 [1, 3, 2] 对应 s^2 + 3s + 2 r, p, k = sig.residue([1], [1, 3, 2]) print("留数 r:", r) # 约为 [ 1. -1.] print("极点 p:", p) # 约为 [-1. -2.] print("直项 k:", k) # 分子次数低于分母,直项为空留数结果是 1 和 -1,极点分别是 -1 和 -2,正好对应 1/(s+1) - 1/(s+2)。这一步只完成了代数分解,没有完成时域反变换。下一步必须把 ROC 摆进来,才能决定每一项是右边形式还是左边形式。
3.2 常见信号的 ROC 速查表
以下表格覆盖了课程和面试里最常出现的连续时间变换对。注意同一行代数表达式可能有多行,区别只在 ROC。
| 时域信号 x(t) | 拉普拉斯变换 X(s) | 收敛域 ROC |
|---|---|---|
| δ(t) | 1 | 全部 s 平面 |
| u(t) | 1/s | Re{s} > 0 |
| -u(-t) | 1/s | Re{s} < 0 |
| e^{-at}u(t) | 1/(s+a) | Re{s} > -a |
| -e^{-at}u(-t) | 1/(s+a) | Re{s} < -a |
| t^n e^{-at}u(t)/n! | 1/(s+a)^{n+1} | Re{s} > -a |
| sin(ω0 t)u(t) | ω0/(s² + ω0²) | Re{s} > 0 |
| cos(ω0 t)u(t) | s/(s² + ω0²) | Re{s} > 0 |
这个表最重要的用途不是背公式,而是建立“一个代数表达式至少有两行 ROC 可能”的意识。u(t) 和 -u(-t) 的变换结果都是 1/s,只有 ROC 不同。凡是遇到双边拉普拉斯变换,第一反应都应该是:这个式子还有另一半解释。
3.3 用 Python 验证不同 ROC 得到的时域波形
画图对比是最直观的验证方式。下面代码把同一个 1/(s+1) 在两种 ROC 下的时域波形画出来:
import numpy as np import matplotlib.pyplot as plt def signal_right_side(t): # ROC: Re{s} > -1 -> e^{-t}u(t) return np.where(t >= 0, np.exp(-t), 0.0) def signal_left_side(t): # ROC: Re{s} < -1 -> -e^{-t}u(-t) return np.where(t < 0, -np.exp(-t), 0.0) t = np.linspace(-3, 3, 600) plt.figure(figsize=(10, 3.5)) plt.subplot(1, 2, 1) plt.plot(t, signal_right_side(t)) plt.title("ROC: Re{s} > -1 => e^(-t)u(t)") plt.subplot(1, 2, 2) plt.plot(t, signal_left_side(t)) plt.title("ROC: Re{s} < -1 => -e^(-t)u(-t)") plt.tight_layout() plt.show()两个子图的代数表达式完全一样,波形却完全相反:一个只在 t ≥ 0 有值,一个只在 t ≤ 0 有值。这就是 ROC 的分量。再看稳定性验证,用 scipy 的 TransferFunction 分别模拟因果极点 s = -1 和 s = +1 的阶跃响应:
from scipy import signal # 因果稳定系统:极点 s = -1,ROC Re{s} > -1 包含虚轴 stable = signal.TransferFunction([1], [1, 1]) t1, y1 = signal.step(stable, T=np.linspace(0, 5, 500)) print("稳定系统阶跃响应终值:", y1[-1]) # 收敛到 1 # 因果不稳定系统:极点 s = +1,ROC Re{s} > 1 不包含虚轴 unstable = signal.TransferFunction([1], [1, -1]) t2, y2 = signal.step(unstable, T=np.linspace(0, 5, 500)) print("不稳定系统阶跃响应最后三个值:", y2[-3:]) # 指数发散稳定系统输出收敛,不稳定系统输出迅速增长。仿真时如果步长太大,发散曲线可能在早期看起来像“在增长但还没爆掉”,所以要观察足够长的时间窗口和输出量级。
4. 离散系统:Z 变换 ROC 与序列判断
4.1 同一个 X(z) 对应三种序列
离散系统与连续系统完全平行。取 X(z) = 1/(1 - 0.5z^{-1}),这是最基本的单极点系统。ROC 有两种可能:
- |z| > 0.5:右边序列,因果,对应 x[n] = (0.5)^n u[n]
- |z| < 0.5:左边序列,反因果,对应 x[n] = -(0.5)^n u[-n-1]
如果是两个极点,例如 X(z) = 1/((1 - 0.5z^{-1})(1 - 0.8z^{-1})),ROC 有三种可能:|z| > 0.8 时是纯因果右边序列,0.5 < |z| < 0.8 时是双边序列,|z| < 0.5 时是纯反因果左边序列。这与第二节连续系统的三个 ROC 一一对应。
4.2 常见序列的 ROC 速查表
| 序列 x[n] | Z 变换 X(z) | 收敛域 ROC |
|---|---|---|
| δ[n] | 1 | 全部 z 平面 |
| u[n] | 1/(1 - z^{-1}) | |
| -u[-n-1] | 1/(1 - z^{-1}) | |
| a^n u[n] | 1/(1 - a z^{-1}) | |
| -a^n u[-n-1] | 1/(1 - a z^{-1}) | |
| n a^n u[n] | a z^{-1}/(1 - a z^{-1})² |
注意 u[n] 和 -u[-n-1] 的变换表达式完全相同,都是 1/(1 - z^{-1}),区别只有 ROC。面试题里如果只写 X(z) 不写 ROC,问“这是不是稳定系统”,答案是“无法判断,需要先确定因果性或 ROC”。
4.3 用 Python 对比因果稳定与因果不稳定的离散系统
离散系统的阶跃响应可以用 scipy.signal.dstep 模拟:
import numpy as np from scipy import signal # H(z) = 1 / (1 - 0.5 z^-1),等价于 z/(z - 0.5) # 因果系统 ROC |z| > 0.5,包含单位圆,稳定 stable_d = signal.TransferFunction([1, 0], [1, -0.5], dt=1.0) t_s, y_s = signal.dstep(stable_d, n=25) print("稳定离散系统阶跃响应:", y_s.ravel()) # 序列从 1 开始,逐步趋近稳态值 2 # H(z) = 1 / (1 - 1.2 z^-1),因果系统 ROC |z| > 1.2,不包含单位圆,不稳定 unstable_d = signal.TransferFunction([1, 0], [1, -1.2], dt=1.0) t_u, y_u = signal.dstep(unstable_d, n=25) print("不稳定离散系统阶跃响应最后三个值:", y_u.ravel()[-3:]) # 按 1.2^n 增长,序列快速发散第一个系统的阶跃响应是 y[n] = 1 - 0.5^{n+1} 形式的收敛序列,稳态为 2。第二个系统的响应按 1.2 的幂次增长,这就是数字滤波器、数字控制器里“崩溃”的离散形态。
注意:判断离散系统稳定不要只看零点,关键是极点相对单位圆的位置。因果系统要求所有极点都在单位圆内部;非因果系统允许极点在外面,但 ROC 必须包含单位圆。
5. 工程中判断系统会不会崩溃的完整方法
5.1 从系统函数到极点分布的五步判断
实际工程中,判断一个电子系统是否稳定,通常按下面的顺序执行:
- 写出系统闭环传递函数 H(s),可以从电路原理、控制框图或实测频率响应辨识得到。
- 对分母进行因式分解,找出全部极点。
- 根据问题描述确定系统是否为因果系统。物理可实现系统通常因果,但某些信号处理模型可能不因果。
- 画出 ROC。因果系统 ROC 在最右极点右侧,非因果系统可能是左半平面或双极点之间的带形。
- 检查 ROC 是否包含稳定边界。连续系统看虚轴 jω,离散系统看单位圆 |z| = 1。
以典型二阶系统 H(s) = ωn²/(s² + 2ζωn s + ωn²) 为例。极点为 s = -ζωn ± jωn√(1 - ζ²)。对因果系统,ζ > 0 时极点全部在左半平面,稳定;ζ < 0 时极点进入右半平面,系统发散。阻尼比 ζ 从正变负的过程,就是闭环极点穿越虚轴的过程,也是系统从“会衰减”到“会崩溃”的临界点。
5.2 反馈放大器和控制系统的稳定边界
反馈系统的闭环传递函数是 H(s) = G(s)/(1 + G(s)F(s))。稳定性由方程 1 + G(s)F(s) = 0 的根决定,这些根就是闭环极点。工程师熟悉的 Bode 图、奈奎斯特图和相位裕度,本质都是判断这些根是否可能越过虚轴。
实际项目中常见的情况是:理论模型里 G(s) 只建模到主极点和次极点,忽略了运放内部非主导极点、寄生电容和线路延迟。这些被忽略的相位滞后累加之后,开环增益曲线提前下降,相位裕度变负,闭环极点移到右半平面。结果是系统在某一频率附近不断振荡,输出不是崩溃到电源轨,就是被限幅后形成持续的极限环。ROC 判据在这里的统一说法是:闭环极点越过虚轴那一刻,ROC 不再包含虚轴,稳定性失效。
5.3 仿真验证阶段该看什么
仿真不能只验证系统“能跑”,要多角度验证稳定性。推荐最小验证组合包括:
- 阶跃响应:看输出是否收敛到有限值,是否有持续振荡。
- 冲激响应:看是否绝对可积。
- 极点图:在复平面上标出全部极点,并标注稳定边界。
- 扫频响应:如果模型可用,计算 Bode 图,看相位穿越 -180 度时增益是否小于 1。
import numpy as np from scipy import signal import matplotlib.pyplot as plt # 构造一个不稳定二阶系统,观察极点图和阶跃响应 sys_demo = signal.TransferFunction([1], [1, -0.2, 1.01]) # 存在右半平面极点 w, mag, phase = signal.bode(sys_demo) plt.figure(figsize=(10, 3.5)) plt.subplot(1, 2, 1) z, p, _ = signal.tf2zpk([1], [1, -0.2, 1.01]) plt.scatter(p.real, p.imag, marker='x', s=80) plt.axhline(0, color='gray', lw=0.8) plt.axvline(0, color='gray', lw=0.8) plt.title("Pole position: RHP pole exists") plt.subplot(1, 2, 2) t, y = signal.step(sys_demo, T=np.linspace(0, 10, 500)) plt.plot(t, y) plt.title("Step response: diverges") plt.tight_layout() plt.show()这个示例的极点包含右半平面分量,阶跃响应必然发散。仿真中一旦出现输出溢出 NaN 或 Inf,先检查极点图和 ROC,而不是直接怀疑求解器。
5.4 学习环境、测试环境和生产环境的判断差异
| 维度 | 学习实验环境 | 测试环境 | 生产环境 |
|---|---|---|---|
| 极点来源 | 手算或教材给定 | 仿真模型、实物辨识 | 实测频率响应、在线辨识 |
| 稳定性判据 | ROC 是否包含虚轴/单位圆 | 极点位置加相位裕度 | 相位裕度、增益裕度、时延、非线性 |
| 验证方法 | 阶跃/冲激响应仿真 | 闭环扫频、负载拉偏 | 宽温测试、老化测试、故障注入 |
| 崩溃保护 | 理论上记录发散即可 | 加输出限幅、看门狗 | 软启动、限流、过温保护、失效安全 |
生产和学习最大的区别是:理论学习假设系统是线性的,但真实系统有饱和、死区、时延和温度漂移。一个极点图看似稳定的系统,在大信号阶跃下可能因为运放压摆率受限进入非线性区,实际表现为振荡。这不是 ROC 理论错了,而是 ROC 判据建立在线性模型前提上,工程上必须叠加非线性验证。
6. 常见误区和排错路径
6.1 误区一:把代数表达式当成唯一的信号身份
最典型的错误说法是“X(s) = 1/(s-1) 不稳定”。这个判断隐含了系统因果的前提,但没有写出来。如果 ROC 是 Re{s} < 1,对应时域信号 -e^{t}u(-t),这个信号在 t 从负无穷到 0 之间按指数衰减,系统是稳定的。只有在 ROC Re{s} > 1 的因果解释下,系统才不稳定。所以正确表达是:“因果系统 X(s) = 1/(s-1) 不稳定,因为 ROC 不包含虚轴。”
6.2 误区二:不加判断就默认系统是因果的
很多教材把反变换表只写右边信号那一列,导致学生形成“表达式对应因果信号”的惯性。考试和面试常见陷阱是:给出 X(z) = 1/(1 - 0.5z^{-1}),不说明系统是否因果,直接问序列。此时必须分开回答:若 ROC |z| > 0.5,序列是 (0.5)^n u[n];若 ROC |z| < 0.5,序列是 -(0.5)^n u[-n-1]。没有 ROC 就没有唯一答案。
6.3 误区三:把连续系统判据套到离散系统
有同学把“所有极点实部小于 0”直接用到 Z 变换,结果看到 z = -0.9 就觉得系统不稳定。实际上 z = -0.9 在单位圆内,对应的因果系统是稳定序列 (-0.9)^n u[n],只是衰减过程会正负交替。反过来,z = 1.05 实部大于 0,位于单位圆外,因果系统才不稳定。连续系统看虚轴,离散系统看单位圆,两者不能混用。
6.4 排错路径表
| 问题现象 | 可能原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| 阶跃响应仿真发散 | 存在稳定边界外的极点 | 画极点图,标出虚轴或单位圆 | 修改系统参数或增加补偿 |
| 手算反变换与仿真不一致 | ROC 选错 | 检查题目是否说明因果性 | 重新确定 ROC 后逐项反变换 |
| 理论稳定但实测振荡 | 忽略时延、饱和、寄生参数 | Bode 实测相位裕度,做小信号扫频 | 增加相位补偿,降低环路增益 |
| 离散系统 z 平面极点都在单位圆内但输出振荡 | 可能 z 接近 -1,接近高频边界 | 看振荡频率是否接近奈奎斯特频率 | 检查采样率是否足够,考虑抗混叠 |
| 代码里参数全对但结果 NaN | 系统本身不稳定,而不是代码 bug | 先做极点分析 | 先验证开环极点,再处理闭环 |
7. 可复用清单与面试回答
7.1 拿到系统函数后的十步检查清单
- 把系统函数写成分子多项式除以分母多项式的标准形式。
- 调用 residue 或 tf2zpk 求出极点和零点。
- 标注全部极点在复平面上的位置。
- 确认系统是否因果:物理解释、边界条件或题目说明。
- 根据因果性画出 ROC:因果取最右极点右侧,反因果取最左极点左侧,双边取极点之间的带形。
- 检查 ROC 是否包含稳定边界:连续系统看虚轴,离散系统看单位圆。
- 进行部分分式分解。
- 结合 ROC 逐项反变换,写出时域信号并标注定义域。
- 用阶跃或冲激响应仿真验证收敛性。
- 对生产系统补充相位裕度、增益裕度、时延和非线性验证。
这个清单可以直接用于作业、笔试和系统稳定性审查。每次手算都按这个顺序走,基本不会漏掉 ROC。
7.2 面试里怎么回答才不丢分
“信号与系统保研面试”经常出现这类问题:给出 H(s),问能否确定系统稳定?标准回答分三步:
第一步,明确说明只给表达式不确定。因为双边拉普拉斯或 Z 变换的同一代数表达式,可以对应不同 ROC,继而对应不同时域信号,稳定性结论可能完全不同。
第二步,补充物理条件。如果题目说明系统是因果的,则 ROC 固定在最右极点右侧,此时可以执行稳定性判断。连续因果系统看极点是否全在左半平面,离散因果系统看极点是否全在单位圆内。
第三步,给一个反例。举 X(s) = 1/(s+1),ROC Re{s} > -1 是因果稳定,ROC Re{s} < -1 是反因果稳定;再举 X(s) = 1/(s-1),因果解释下不稳定,反因果解释下稳定。这样回答既有概念,又有量化例证,比只背结论更有说服力。
7.3 从 ROC 延伸出去的学习方向
ROC 不是孤立的应试概念,它连接了后续多个核心方向:
- 频率响应只在 ROC 包含虚轴或单位圆时存在。系统不稳定时,不能直接令 s = jω 求频率响应,必须先做稳定性补偿或使用带收敛因子的广义分析。
- 滤波器设计里,因果性、稳定