
控制系统的设计与校正是指根据给定的性能指标,对系统进行分析并添加适当的校正装置,以改善系统性能的过程。系统的性能指标通常包括稳态性能指标(如稳态误差)和动态性能指标(如超调量、调节时间等)。
Python 实现示例
下面我们使用 Python 分析一个系统的性能,并确定需要校正的方面:
import control
import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
# 定义原系统开环传递函数
# G(s) = 10 / (s(s+1)(s+5))
num = [10]
den = [1, 6, 5, 0]
sys_open = control.TransferFunction(num, den)
# 计算原系统闭环传递函数
sys_closed = control.feedback(sys_open, 1)
# 分析原系统性能
# 1. 稳态性能分析
# 计算静态误差系数
Kp = control.dcgain(sys_open) # 位置误差系数
Kv = control.dcgain(sys_open * control.TransferFunction([1, 0], [1])) # 速度误差系数
Ka = control.dcgain(sys_open * control.TransferFunction([1, 0, 0], [1])) # 加速度误差系数
print("原系统稳态性能分析:")
print(f"位置误差系数 Kp = {Kp:.4f}")
print(f"速度误差系数 Kv = {Kv:.4f}")
print(f"加速度误差系数 Ka = {Ka:.4f}")
# 2. 动态性能分析
# 计算阶跃响应
t, y = control.step_response(sys_closed)
# 计算超调量
def calculate_overshoot(y):
max_value = np.max(y)
steady_state = y[-1]
return (max_value - steady_state) / steady_state * 100
# 计算调节时间(2%误差带)
def calculate_settling_time(t, y):
steady_state = y[-1]
for i in range(len(y)):
if np.all(np.abs(y[i:] - steady_state) <= 0.02 * steady_state):
return t[i]
return t[-1]
overshoot = calculate_overshoot(y)
settling_time = calculate_settling_time(t, y)
print("\n原系统动态性能分析:")
print(f"超调量: {overshoot:.2f}%")
print(f"调节时间: {settling_time:.2f}s")
# 3. 稳定性分析
gm, pm, wg, wc = control.margin(sys_open)
print("\n原系统稳定性分析:")
print(f"相位裕度: {pm:.2f}°")
print(f"增益裕度: {20*np.log10(gm):.2f} dB")
# 绘制原系统阶跃响应
plt.figure(figsize=(10, 6))
plt.plot(t, y)
plt.title('原系统阶跃响应')
plt.xlabel('时间 (s)')
plt.ylabel('输出')
plt.grid(True)
plt.show()
# 绘制原系统Bode图
plt.figure(figsize=(10, 8))
control.bode(sys_open, dB=True, deg=True, plot=True)
plt.title('原系统Bode图')
plt.tight_layout()
plt.show()

这个示例展示了如何使用 Python 分析系统的性能。我们定义了一个三阶系统,计算了其稳态性能指标(静态误差系数)、动态性能指标(超调量、调节时间)和稳定性指标(相位裕度、增益裕度),并绘制了阶跃响应和 Bode 图。通过这些分析,我们可以确定系统需要校正的方面。
常用的校正装置包括超前校正装置、滞后校正装置和滞后 - 超前校正装置。这些校正装置可以通过改变系统的频率特性来改善系统的性能。

Python 实现示例
下面我们使用 Python 绘制这些校正装置的 Bode 图,分析其频率特性:
import control
import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题
# 定义频率范围
omega = np.logspace(-2, 2, 1000) # 频率范围从0.01到100 rad/s
# 超前校正装置参数
T_lead = 1 # 时间常数
alpha = 0.2 # 小于1的常数
num_lead = [T_lead, 1]
den_lead = [alpha * T_lead, 1]
sys_lead = control.TransferFunction(num_lead, den_lead)
# 滞后校正装置参数
T_lag = 10 # 时间常数
beta = 10 # 大于1的常数
num_lag = [T_lag, 1]
den_lag = [beta * T_lag, 1]
sys_lag = control.TransferFunction(num_lag, den_lag)
# 滞后-超前校正装置参数
T1 = 1 # 超前部分时间常数
T2 = 10 # 滞后部分时间常数
beta_lag_lead = 10 # 大于1的常数
num_lag_lead = [(T1 * T2), (T1 + T2), 1]
den_lag_lead = [(beta_lag_lead * T1 * T2 / beta_lag_lead), (beta_lag_lead * T1 + T2 / beta_lag_lead), 1]
sys_lag_lead = control.TransferFunction(num_lag_lead, den_lag_lead)
# 绘制Bode图
plt.figure(figsize=(15, 10))
# 超前校正装置Bode图
plt.subplot(3, 2, 1)
mag_lead, phase_lead, _ = control.bode(sys_lead, omega, dB=True, deg=True, plot=False)
plt.semilogx(omega, 20 * np.log10(mag_lead))
plt.title('超前校正装置 幅频