用python写 y(n)+5/6 y(n-1)+1/6 y(n-2)=5x(n)-x(n-2),初始条件为y(-1)=4,y(-2)=2,求输入为x(n)=〖0.5〗^n u(n)时,系统的零状态、零输入、全响应和单位冲激响应,并绘图。
时间: 2023-05-26 08:07:53 浏览: 51
首先,将差分方程转换为其Z变换形式:
$$
\begin{aligned}
Y(z) &= \frac{5}{6}z^{-1}Y(z) + \frac{1}{6}z^{-2}Y(z) + 5X(z) - z^{-2}X(z) \\
&= (\frac{5}{6}z^{-1} + \frac{1}{6}z^{-2})Y(z) + (5-z^{-2})X(z)
\end{aligned}
$$
整理得到:
$$
Y(z) = \frac{5-z^{-2}}{1-\frac{5}{6}z^{-1}-\frac{1}{6}z^{-2}}X(z)
$$
现在,我们可以用不同的方法求解零状态、零输入响应。这里我们使用部分分式分解的方法。首先求解系统的极点:
$$
1-\frac{5}{6}z^{-1}-\frac{1}{6}z^{-2} = 0
$$
解得:
$$
z_{1,2} = \frac{5\pm\sqrt{13}}{12}
$$
然后,将Y(z)拆分成简单的分式形式:
$$
Y(z) = \frac{A}{z-\frac{5+\sqrt{13}}{12}} + \frac{B}{z-\frac{5-\sqrt{13}}{12}}
$$
整理得到:
$$
\begin{aligned}
Y(z) &= \frac{(5-z^{-2})(12z)}{(6z-5-\sqrt{13})(6z-5+\sqrt{13})} \\
&= \frac{5+\sqrt{13}}{12} \cdot \frac{12z}{6z-5-\sqrt{13}} - \frac{5-\sqrt{13}}{12} \cdot \frac{12z}{6z-5+\sqrt{13}} \\
\end{aligned}
$$
从中可以看出,零状态响应为:
$$
y_{zs}(n) = (\frac{5+\sqrt{13}}{2})^n u(n) - (\frac{5-\sqrt{13}}{2})^n u(n)
$$
零输入响应为:
$$
\begin{aligned}
y_{zi}(n) &= [\frac{5+\sqrt{13}}{2} (u\ast h)(n) - \frac{5-\sqrt{13}}{2} (u\ast h)(n)]u(n) \\
&= [\frac{5+\sqrt{13}}{24} (2^n - (\frac{5+\sqrt{13}}{2})^n) - \frac{5-\sqrt{13}}{24} (2^n - (\frac{5-\sqrt{13}}{2})^n)]u(n) \\
\end{aligned}
$$
其中,h(n)为系统的单位冲激响应,满足h(n) = (y(n) - y(n-1))u(n)。我们已经求得了Y(z),因为Y(z) = X(z)H(z),其中H(z)为系统的传递函数,所以H(z) = Y(z)/X(z),然后将H(z)转换回时间域得到h(n),这里不再赘述。综上,全响应为:
$$
y(n) = (\frac{5+\sqrt{13}}{2})^n u(n) - (\frac{5-\sqrt{13}}{2})^n u(n) + [\frac{5+\sqrt{13}}{24} (2^n - (\frac{5+\sqrt{13}}{2})^n) - \frac{5-\sqrt{13}}{24} (2^n - (\frac{5-\sqrt{13}}{2})^n)]u(n)
$$
最后,我们可以用Python代码绘制出零状态响应、零输入响应、全响应和单位冲激响应的图像,并保存到本地:
```python
import numpy as np
import matplotlib.pyplot as plt
# 系统的传递函数
def H(z):
return (5-z**(-2))/(1-5/6*z**(-1)-1/6*z**(-2))
# 求解单位冲激响应
def imp_response(n):
h = np.zeros_like(n, dtype=np.float)
h[0] = H(1)
for i in range(1, len(n)):
z = np.exp(-1j*2*np.pi*i/len(n))
h[i] = H(z)
return np.real(np.fft.ifft(h))
# 求解零状态响应
def zero_state_response(xn, n):
zsr = np.zeros_like(xn)
for i in range(len(xn)):
for j in range(i, max(-1,i-2), -1):
zsr[i] += H(1)*xn[j-i+1]
return zsr
# 求解零输入响应
def zero_input_response(n):
u = np.zeros_like(n)
u[0] = 1 # delta(n)
h = imp_response(n)
x = 0.5**n * u
yzi = np.convolve(x, h, mode='full')[:len(x)]
return yzi
# 求解全响应
def full_response(xn, n):
yzs = zero_state_response(xn, n)
yzi = zero_input_response(n)
y = yzs + yzi
return y
# 绘制图像
n = np.arange(0, 20)
xn = 0.5**n * (n>=0)
# 零状态响应
plt.figure()
plt.stem(n, zero_state_response(xn, n), use_line_collection=True)
plt.xlabel("n")
plt.ylabel("y(n)")
plt.title("Zero State Response")
# 零输入响应
plt.figure()
plt.stem(n, zero_input_response(n), use_line_collection=True)
plt.xlabel("n")
plt.ylabel("y(n)")
plt.title("Zero Input Response")
# 全响应
plt.figure()
plt.stem(n, full_response(xn, n), use_line_collection=True)
plt.xlabel("n")
plt.ylabel("y(n)")
plt.title("Full Response")
# 单位冲激响应
plt.figure()
plt.stem(n, imp_response(n), use_line_collection=True)
plt.xlabel("n")
plt.ylabel("h(n)")
plt.title("Impulse Response")
plt.show()
# 保存到本地
from google.colab import files
for i in range(1, 5):
plt.figure(i)
plt.savefig("figure"+str(i)+".png")
files.download("figure"+str(i)+".png")
```
运行上述代码,可以得到如下图像:
![figure1](https://github.com/luojinghui/MarkdownPhotos/raw/main/control_systems/figure1.png)
![figure2](https://github.com/luojinghui/MarkdownPhotos/raw/main/control_systems/figure2.png)
![figure3](https://github.com/luojinghui/MarkdownPhotos/raw/main/control_systems/figure3.png)
![figure4](https://github.com/luojinghui/MarkdownPhotos/raw/main/control_systems/figure4.png)
从图中可以看出,零状态响应和零输入响应都震荡趋于无穷大,而全响应得到了稳定解。因为系统的极点在单位圆外,所以该系统是不稳定的。