📅  最后修改于: 2023-12-03 15:39:50.586000             🧑  作者: Mango
波特图是一个用于描述控制系统因果关系的图形工具。通常我们可以通过波特图来分析控制系统的稳定性、响应速度等特性。
波特图的构建可分为以下几个步骤:
将控制系统的传递函数表示为分母多项式$D(s)$和分子多项式$N(s)$的形式。
寻找控制系统的极点和零点,并绘制这些点在$s$平面中的位置。
将$s$平面划分成许多小区域,并判断每个小区域内的相位角和幅值之和是否是$180^\circ$。如果是,则在该小区域内绘制一个点。
将所有在步骤3中确定的点连接起来,即为波特图。
通过分析波特图,我们可以了解到以下一些控制系统的特性:
稳定性:如果波特图通过$-1$点,则系统是不稳定的。如果波特图没有通过$-1$点,则系统是稳定的。
相位裕量:如果波特图与$-1$点的距离越大,则系统的相位裕量越大,稳定性越强。
响应速度:如果波特图越接近原点,则系统的响应速度越快。
import matplotlib.pyplot as plt
import numpy as np
# 传递函数的分母多项式和分子多项式
D = np.poly1d([1, 10, 24, 0])
N = np.poly1d([1])
# 求解极点和零点
p = np.roots(D)
z = np.roots(N)
# 绘制极点和零点
plt.plot(np.real(p), np.imag(p), 'bx', markersize=10)
plt.plot(np.real(z), np.imag(z), 'ro', markersize=10)
# 将s平面划分成10000个小区域
s_re = np.linspace(-5, 1, 10000)
s_im = np.linspace(-4, 4, 10000)
S = np.array([s_re + 1j*s_im[i] for i in range(len(s_im))])
# 计算相位角和幅值之和
M = np.angle(np.polyval(D, S)) + np.angle(np.polyval(N, S[::-1]))
amp = np.abs(np.polyval(D, S)) * np.abs(np.polyval(N, S[::-1]))
# 找到相位角和幅值之和为180度的点
cond = np.isclose(M, -np.pi, rtol=1e-3)
idx = np.nonzero(cond)
# 绘制波特图
plt.plot(S[idx].real, S[idx].imag, 'k-', linewidth=2)
# 显示结果
plt.xlabel('Real Axis')
plt.ylabel('Imaginary Axis')
plt.grid(True, which='both')
plt.show()
以上代码可以直接在Python环境中运行,生成的波特图将出现在一个新的窗口中。