信号系统实战:利用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] $$

求解步骤为:

  1. 对两边取Z变换,利用时移性质
  2. 整理得到Y(z)的表达式
  3. 对Y(z)进行部分分式展开
  4. 逐项求逆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. 工程应用中的注意事项

  1. 稳定性判断 :系统稳定的充要条件是所有极点位于单位圆内

    • 例3中极点半径0.9487<1,系统稳定
  2. 频率响应 :将$z=e^{j\omega}$代入H(z)可得

    w, H = signal.freqz(b, a)
    plt.plot(w, 20*np.log10(abs(H)))
    
  3. 实现考虑

    • 直接型、级联型等实现结构
    • 量化误差对极点位置的影响

通过这三个典型案例,我们展示了Z变换在解决离散时间系统问题中的强大能力。从简单的一阶系统到振荡特性分析,再到带输入的系统响应,Z变换提供了一套系统化的解决方案。Python的数值验证不仅确认了解析解的正确性,也为实际工程实现提供了参考。

在实际项目中,我曾遇到一个滤波器设计问题,通过Z变换分析发现极点在单位圆附近,这解释了为何系统对系数精度如此敏感。最终采用级联二阶节结构显著改善了数值稳定性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐