信号系统实战:利用Z变换求解3类典型差分方程(附Python代码验证)
信号系统实战:利用Z变换求解3类典型差分方程(附Python代码验证)
在数字信号处理、自动控制等领域,差分方程是描述离散时间系统动态特性的重要工具。而Z变换作为离散时间系统的"拉普拉斯变换",为解决这类问题提供了强有力的数学武器。本文将带您从工程应用角度,掌握Z变换求解差分方程的标准流程,并通过三个典型实例演示具体应用,最后用Python代码进行数值验证。
1. Z变换基础与差分方程求解框架
1.1 Z变换的核心概念
Z变换将离散时间序列x[n]转换为复变量z的函数X(z),其定义为:
$$ X(z) = \mathcal{Z}{x[n]} = \sum_{n=-\infty}^{\infty} x[n]z^{-n} $$
**收敛域(ROC)**是使该级数收敛的所有z值集合,它决定了变换的唯一性。对于因果系统,ROC通常是某个圆的外部区域。
常用性质:
- 线性性 :$\mathcal{Z}{ax_1[n]+bx_2[n]} = aX_1(z)+bX_2(z)$
- 时移性 :$\mathcal{Z}{x[n-k]} = z^{-k}X(z)$
- 卷积定理 :时域卷积对应z域乘积
1.2 差分方程求解的标准流程
对于线性常系数差分方程:
$$ \sum_{k=0}^{N} a_k y[n-k] = \sum_{m=0}^{M} b_m x[n-m] $$
求解步骤为:
- 对两边取Z变换,利用时移性质
- 整理得到Y(z)的表达式
- 对Y(z)进行部分分式展开
- 逐项求逆Z变换得到时域解y[n]
注意:实际应用中,我们通常关注零状态响应(初始条件为零)的情况。若考虑非零初始条件,需使用单边Z变换。
2. 一阶系统响应求解实例
考虑简单的一阶差分方程:
$$ y[n] - 0.5y[n-1] = x[n] $$
步骤1:取Z变换
假设零初始条件,得到:
$$ Y(z) - 0.5z^{-1}Y(z) = X(z) $$
步骤2:求系统函数
整理得:
$$ H(z) = \frac{Y(z)}{X(z)} = \frac{1}{1-0.5z^{-1}} = \frac{z}{z-0.5} $$
步骤3:求单位脉冲响应
令$x[n]=\delta[n]$,则$X(z)=1$:
$$ Y(z) = \frac{z}{z-0.5} \Rightarrow y[n] = (0.5)^n u[n] $$
Python验证代码 :
import numpy as np
import matplotlib.pyplot as plt
n = np.arange(0, 10)
h = (0.5)**n # 理论解
# 数值计算
y = np.zeros_like(n, dtype=float)
x = np.zeros_like(n)
x[0] = 1 # 单位脉冲输入
for k in range(1, len(n)):
y[k] = 0.5*y[k-1] + x[k]
plt.stem(n, h, 'b', label='Analytical')
plt.stem(n, y, 'r--', label='Numerical')
plt.legend(); plt.title('1st Order System Response'); plt.show()
3. 二阶振荡系统分析
考察具有振荡特性的二阶系统:
$$ y[n] - 1.5y[n-1] + 0.9y[n-2] = x[n] $$
步骤1:Z变换
$$ (1 - 1.5z^{-1} + 0.9z^{-2})Y(z) = X(z) $$
步骤2:求极点
解特征方程$z^2 - 1.5z + 0.9 = 0$,得到共轭极点:
$$ p_{1,2} = 0.75 \pm j0.58 = 0.9487e^{\pm j0.661} $$
步骤3:脉冲响应
系统函数:
$$ H(z) = \frac{z^2}{z^2-1.5z+0.9} $$
逆变换后得到衰减振荡响应:
$$ h[n] = \frac{1.053}{(0.9487)^n} \cos(0.661n - 0.704)u[n] $$
Python仿真 :
from scipy import signal
# 系统定义
b = [1]
a = [1, -1.5, 0.9]
# 脉冲响应
n = np.arange(0, 30)
_, h = signal.dimpulse((b, a, 1), n=n)
plt.stem(n, h[0].squeeze())
plt.title('2nd Order Oscillatory System'); plt.show()
4. 带输入激励的系统求解
考虑有外部输入的差分方程:
$$ y[n] - 0.7y[n-1] = x[n] + 0.5x[n-1] $$
步骤1:Z变换
$$ (1-0.7z^{-1})Y(z) = (1+0.5z^{-1})X(z) $$
步骤2:系统函数
$$ H(z) = \frac{1+0.5z^{-1}}{1-0.7z^{-1}} = \frac{z+0.5}{z-0.7} $$
步骤3:阶跃响应
对于$x[n]=u[n]$,$X(z)=\frac{z}{z-1}$:
$$ Y(z) = \frac{z(z+0.5)}{(z-1)(z-0.7)} = \frac{5z}{z-1} - \frac{4.5z}{z-0.7} $$
逆变换得:
$$ y[n] = [5 - 4.5(0.7)^n]u[n] $$
数值验证 :
# 阶跃响应
x = np.ones(20)
y_num = signal.lfilter([1, 0.5], [1, -0.7], x)
n = np.arange(20)
y_ana = 5 - 4.5*(0.7)**n
plt.stem(n, y_num, 'b', label='Numerical')
plt.plot(n, y_ana, 'r--', label='Analytical')
plt.legend(); plt.title('Step Response'); plt.show()
5. 工程应用中的注意事项
-
稳定性判断 :系统稳定的充要条件是所有极点位于单位圆内
- 例3中极点半径0.9487<1,系统稳定
-
频率响应 :将$z=e^{j\omega}$代入H(z)可得
w, H = signal.freqz(b, a) plt.plot(w, 20*np.log10(abs(H))) -
实现考虑 :
- 直接型、级联型等实现结构
- 量化误差对极点位置的影响
通过这三个典型案例,我们展示了Z变换在解决离散时间系统问题中的强大能力。从简单的一阶系统到振荡特性分析,再到带输入的系统响应,Z变换提供了一套系统化的解决方案。Python的数值验证不仅确认了解析解的正确性,也为实际工程实现提供了参考。
在实际项目中,我曾遇到一个滤波器设计问题,通过Z变换分析发现极点在单位圆附近,这解释了为何系统对系数精度如此敏感。最终采用级联二阶节结构显著改善了数值稳定性。
更多推荐



所有评论(0)