Scipy 提供了强大的控制系统分析与设计工具,可以用于设计和分析线性时不变系统。本篇博客将深入介绍 Scipy 中的控制系统工具,并通过实例演示如何应用这些工具。
在控制系统中,我们通常使用传递函数或状态空间模型来描述系统。Scipy 提供了 scipy.signal 模块,其中包含了创建传递函数和状态空间模型的函数。
import matplotlib.pyplot as plt
from scipy.signal import TransferFunction, step
# 定义传递函数的分子和分母多项式系数
numerator = [1]
denominator = [1, 2, 1]
# 创建传递函数模型
sys_tf = TransferFunction(numerator, denominator)
# 绘制阶跃响应
t, y = step(sys_tf)
plt.plot(t, y)
plt.xlabel('时间')
plt.ylabel('响应')
plt.title('传递函数阶跃响应')
plt.show()
from scipy.signal import StateSpace
# 定义状态空间矩阵
A = [[-1, -2], [3, -4]]
B = [[1], [0]]
C = [[0, 1]]
D = [[0]]
# 创建状态空间模型
sys_ss = StateSpace(A, B, C, D)
# 绘制阶跃响应
t, y = step(sys_ss)
plt.plot(t, y)
plt.xlabel('时间')
plt.ylabel('响应')
plt.title('状态空间模型阶跃响应')
plt.show()
Scipy 提供了多种工具用于系统分析,如频域分析、稳定性分析等。
from scipy.signal import bode
# 绘制传递函数的频率响应曲线
w, mag, phase = bode(sys_tf)
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.semilogx(w, mag)
plt.title('传递函数频率响应曲线 - 幅值')
plt.subplot(2, 1, 2)
plt.semilogx(w, phase)
plt.title('传递函数频率响应曲线 - 相位')
plt.show()
from scipy.signal import TransferFunction, ss2tf, cont2discrete
from scipy.linalg import eig
# 将传递函数转换为状态空间模型
A, B, C, D = ss2tf(sys_tf.num, sys_tf.den)
sys_ss_stable = StateSpace(A, B, C, D)
# 检查系统的稳定性
eigenvalues, _ = eig(sys_ss_stable.A)
print("系统的特征值:", eigenvalues)
Scipy 中也包含了常见的控制器设计工具,如 PID 控制器、根轨迹设计等。
from scipy.signal import TransferFunction, pid2ss
# 定义系统的传递函数
numerator_sys = [1]
denominator_sys = [1, 2, 1]
sys_tf = TransferFunction(numerator_sys, denominator_sys)
# 设计 PID 控制器
Kp = 2
Ki = 1
Kd = 0.5
numerator_pid = [Kd, Kp, Ki]
denominator_pid = [1, 0]
pid_tf = TransferFunction(numerator_pid, denominator_pid)
# 将系统和控制器连接
sys_pid = sys_tf * pid_tf
# 绘制阶跃响应
t, y = step(sys_pid)
plt.plot(t, y)
plt.xlabel('时间')
plt.ylabel('响应')
plt.title('PID 控制器阶跃响应')
plt.show()
from scipy.signal import tf2ss, place, root_locus
# 将传递函数转换为状态空间模型
A, B, C, D = tf2ss(sys_tf.num, sys_tf.den)
sys_ss = StateSpace(A, B, C, D)
# 设计控制器使闭环系统的极点沿指定轨迹移动
desired_poles = [-1, -1.5]
K = place(sys_ss.A, sys_ss.B, desired_poles)
# 计算闭环系统的传递函数
A_closed = sys_ss.A - sys_ss.B @ K
sys_tf_closed = ss2tf(A_closed, sys_ss.B, sys_ss.C, sys_ss.D)
# 绘制根轨迹
t, s, _ = root_locus(sys_tf_closed)
plt.plot(t, s, marker='o')
plt.xlabel('实部')
plt.ylabel('虚部')
plt.title('根轨迹设计')
plt.grid(True)
plt.show()
通过本篇博客的介绍,你可以更好地理解和使用 Scipy 中的控制系统工具。这些工具对于分析和设计线性时不变系统以及设计控制器非常有用。在实际应用中,结合系统的建模、分析和设计工具,可以更有效地实现对控制系统的理解和优化。希望这篇博客对你有所帮助!