Python自动控制control库使用详解:传递函数与响应分析
本文详细解析Python自动控制控制库 control 的核心接口,涵盖传递函数的创建与零极点提取、典型输入响应计算、频域绘图方法,并针对库内缺失的拉普拉斯逆变换功能提供基于Sympy的可靠替代代码,帮助读者快速完成控制系统建模与仿真。
传递函数构建与基础参数解析
在控制系统的建模中,传递函数是核心数学描述。control 库提供了两种常用的创建方式,分别适用于符号推导与直接系数输入的场景:
import control as ctrl
# 方式 1:基于复频率变量 s 的符号表达式
s = ctrl.tf('s')
sys_sym = 100 / (s ** 2 + 10 * s + 100)
# 方式 2:直接传入分子与分母多项式系数列表
sys_coeff = ctrl.tf([100], [1, 10, 100])
创建实例后,可调用内置方法快速获取系统的动态特性参数:
sys.zero():求解系统零点。sys.pole():求解系统极点。sys.damp():返回阻尼比(Damping Ratio)、固有频率(Natural Frequency)与特征根(Eigenvalues)。
系统响应计算与时域指标提取
control 库支持对常见标准输入信号进行时域响应分析。时间参数 T 可传入浮点数(作为响应时长上限)或一维数组(指定采样时间点)。各类响应函数均返回时间轴数组 t 与对应的响应数据数组 response:
# 阶跃响应及动态性能指标
t_step, y_step = ctrl.step_response(sys, T=5)
step_info_dict = ctrl.step_info(sys)
# 脉冲响应、初始状态响应与强制响应
t_imp, y_imp = ctrl.impulse_response(sys, T=5)
t_init, y_init = ctrl.initial_response(sys, T=5)
# 注:forced_response 需额外传入输入信号 U 和时间数组 t
# t_forced, y_forced = ctrl.forced_response(sys, U, t)
当调用 step_info(sys) 时,会返回包含以下关键指标的字典:'RiseTime'(上升时间)、'SettlingTime'(调节时间)、'Overshoot'(超调量)、'PeakTime'(峰值时间)、'SteadyStateValue'(稳态值)等,可直接用于控制器性能评估。
频域绘图与可视化配置
该库底层依赖 matplotlib 进行图形渲染。绘制奈奎斯特图、伯德图与根轨迹图时,调用对应绘图函数后必须执行 plt.show() 才能弹出窗口显示图像:
import matplotlib.pyplot as plt
import control as ctrl
# 传入系统对象或对象列表
ctrl.nyquist_plot(sys)
ctrl.bode_plot(sys)
ctrl.root_locus(sys)
plt.show()
建议在脚本开头添加中文字体配置与负号显示设置,避免坐标轴标签乱码:
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False
拉普拉斯逆变换的 Sympy 替代方案
由于原生 control 库暂未封装直接的拉普拉斯逆变换算子,可通过引入 sympy 符号计算包自行构建时域响应类。该类接收一个关于复频率 s 的函数,利用积分变换求出时域表达式 f(t),并重载 __call__ 方法以便直接传入 numpy 时间数组求值:
import sympy
import numpy as np
class Time_Response:
'''时域响应计算器'''
s, t = sympy.symbols('s, t')
def __init__(self, fun, doprint=False):
sys_s = fun(self.s)
# 现代 Sympy 推荐使用顶层函数
self.f_t = sympy.inverse_laplace_transform(sys_s, self.s, self.t)
if doprint:
sympy.pprint(self.f_t)
def __call__(self, time_array):
return np.array([float(self.f_t.subs({self.t: i})) for i in time_array])
使用示例如下。此处以单位阶跃输入为例(传递函数除以 s),对比 sympy 解析解与 control 数值解的曲线重合度:
from mod.math_model import Time_Response
import control as ctrl
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
f_t_solver = Time_Response(lambda s: 100 / (s**2 + 10*s + 100) / s, doprint=True)
t_vals = np.linspace(0, 1, 100)
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].plot(t_vals, f_t_solver(t_vals), color='orange', label='Sympy 逆变换')
axes[0].set_title('Sympy 解析计算')
s = ctrl.tf('s')
sys = 100 / (s**2 + 10*s + 100)
t_ctrl, y_ctrl = ctrl.step_response(sys, T=1)
axes[1].plot(t_ctrl, y_ctrl, color='deepskyblue', label='Control 数值解')
axes[1].set_title('Control 标准求解')
plt.legend()
plt.tight_layout()
plt.show()
需要注意的是,该方法基于经典控制理论中“所有初始条件为零”的假设进行符号运算。若实际系统存在非零初始状态,需手动调整初值或在差分方程层面进行补偿。
总结
掌握 control 库的传递函数定义、动态指标提取与频时域绘图接口,可大幅降低控制系统仿真的编码门槛。对于特殊变换需求,结合 sympy 的符号运算能力能有效补全功能缺口。
以上就是 Python 自动控制 control 库的详细教程内容,更多关于 Python 控制算法仿真的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









