4. 差分方程的Z变换解法
说实话,Z变换这东西,我刚接触时也觉得挺抽象的。但干了几十年信号处理,我越来越觉得它就是个好工具——把复杂的差分方程变成简单的代数问题。今天咱们就聊聊这个。
4.1 Z变换的定义
先说说Z变换是啥。说白了,它就是把离散时间信号映射到复频域的一种变换。你想想看,连续系统有拉普拉斯变换,离散系统就有Z变换,这俩是对应的。
对于一个离散序列 x[n],它的Z变换定义为:
X(z) = Σ x[n] z^(-n) (n从 -∞ 到 +∞)
这里 z 是个复变量。嗯,要注意,这个求和不一定收敛,只有在一定范围内才收敛,这个范围叫收敛域(ROC)。
重要概念:Z变换的收敛域决定了系统的稳定性和因果性。我在项目中遇到过好几次,明明Z变换表达式写对了,但收敛域搞错了,结果系统分析全翻车。
实际工程中,我们更常用的是单边Z变换(n从0开始),因为大多数系统都是因果的:
X(z) = Σ x[n] z^(-n) (n从 0 到 +∞)
4.2 Z变换的性质
Z变换之所以好用,就是因为它有一堆漂亮的性质。我个人习惯把这些性质记在脑子里,用起来特别顺手。
| 性质 | 时域 | Z域 |
|---|---|---|
| 线性 | a·x[n] + b·y[n] | a·X(z) + b·Y(z) |
| 移位(右移) | x[n-k] | z^(-k)·X(z) |
| 移位(左移) | x[n+k] | z^k·[X(z) - Σ x[i]·z^(-i)] |
| 卷积 | x[n] * h[n] | X(z)·H(z) |
| 初值定理 | x[0] | lim(z→∞) X(z) |
| 终值定理 | lim(n→∞) x[n] | lim(z→1) (z-1)·X(z) |
这里我最想强调的是移位性质。为什么?因为差分方程里到处都是移位项。你想想看,y[n+1] 和 y[n] 之间的关系,用Z变换一处理,就变成了 z·Y(z) - z·y[0]。简单吧?
我的小技巧:处理左移时,千万别忘了减去初始条件。我曾经在这个坑里摔过好几次——算到一半发现结果不对,回头一看,初始条件没处理。
4.3 利用Z变换求解差分方程
好了,重头戏来了。怎么用Z变换解差分方程?我一般分三步走:
- Z变换:对差分方程两边同时做Z变换
- 代数求解:在Z域解出 Y(z)
- 逆Z变换:把 Y(z) 变回 y[n]
举个例子,假设我们有差分方程:
y[n+2] - 3y[n+1] + 2y[n] = x[n]
初始条件:y[0] = 1, y[1] = 2
输入:x[n] = u[n](单位阶跃)
第一步,两边做Z变换:
z²Y(z) - z²y[0] - zy[1] - 3[zY(z) - zy[0]] + 2Y(z) = X(z)
代入初始条件:
z²Y(z) - z²·1 - z·2 - 3zY(z) + 3z·1 + 2Y(z) = z/(z-1)
第二步,整理出 Y(z):
(z² - 3z + 2)Y(z) = z/(z-1) + z² + 2z - 3z
Y(z) = [z/(z-1) + z² - z] / (z² - 3z + 2)
嗯,看着有点乱,但别怕。化简一下:
Y(z) = [z + (z² - z)(z-1)] / [(z-1)(z² - 3z + 2)]
= [z + z(z-1)²] / [(z-1)(z-1)(z-2)]
= z[1 + (z-1)²] / [(z-1)²(z-2)]
注意:这里分母因式分解要仔细。z² - 3z + 2 = (z-1)(z-2),别搞错了。我见过有人把 (z-1) 和 (z-2) 搞混,结果逆变换全错。
4.4 逆Z变换
最后一步,把 Y(z) 变回 y[n]。常用的方法有三种:
- 部分分式展开法:把 Y(z) 拆成简单项之和
- 幂级数展开法:直接做长除法
- 留数法:用围线积分(理论课常用,工程上少用)
我个人最常用的是部分分式展开法。为啥?因为简单、直观、不容易出错。
继续上面的例子,我们把 Y(z)/z 做部分分式展开(注意,这里除个z是为了方便查表):
Y(z)/z = [1 + (z-1)²] / [(z-1)²(z-2)]
设:Y(z)/z = A/(z-1) + B/(z-1)² + C/(z-2)
解出:A = -1, B = -1, C = 2
所以:Y(z) = -z/(z-1) - z/(z-1)² + 2z/(z-2)
查Z变换表:
z/(z-1) → u[n]
z/(z-1)² → n·u[n]
z/(z-2) → 2^n·u[n]
因此:
y[n] = -u[n] - n·u[n] + 2·2^n·u[n]
= (2^(n+1) - n - 1)·u[n]
验证一下:n=0时,y[0] = 2^1 - 0 - 1 = 1,符合初始条件。n=1时,y[1] = 2^2 - 1 - 1 = 2,也符合。完美!
下面这张图总结了整个流程:
说实话,Z变换解差分方程,说白了就是把时域的递推关系变成Z域的代数方程。你想想看,本来要一步一步迭代算半天,现在直接代数求解再查表,多省事。
我的经验:刚开始学的时候,建议多练几个例子。特别是初始条件不同的情况,多做几遍就熟了。我曾经带过一个实习生,他练了20道题后,闭着眼睛都能做。
好了,Z变换解差分方程就聊到这儿。记住三步走:Z变换、代数求解、逆Z变换。每一步都有坑,但踩过几次就记住了。
公众号:蓝海资料掘金营,微信deep3321