Python自动控制control库使用详解:传递函数与响应分析

远山来客
远山来客
发布时间:2026-10-12| 3人浏览过
原创

本文详细解析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()
Sympy逆变换与控制库阶跃响应对比曲线
Sympy 解析结果与 Control 数值仿真曲线完全重合,验证了替换方案的准确性

需要注意的是,该方法基于经典控制理论中“所有初始条件为零”的假设进行符号运算。若实际系统存在非零初始状态,需手动调整初值或在差分方程层面进行补偿。

总结

掌握 control 库的传递函数定义、动态指标提取与频时域绘图接口,可大幅降低控制系统仿真的编码门槛。对于特殊变换需求,结合 sympy 的符号运算能力能有效补全功能缺口。

以上就是 Python 自动控制 control 库的详细教程内容,更多关于 Python 控制算法仿真的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。