别再死记硬背了!用Python+Matlab复现卢京潮《自动控制原理》经典案例(附源码)
用Python和Matlab实战复现自动控制原理经典案例在工科领域自动控制原理是一门既抽象又实用的核心课程。卢京潮教授的《自动控制原理》以其系统性和深度著称但很多学生在理论学习后常遇到公式都懂代码不会写的困境。本文将带您通过Python和Matlab两种工具从传递函数构建到时域响应分析完整复现课程中的经典案例。1. 环境准备与工具选择工欲善其事必先利其器。在开始控制系统仿真前需要准备好合适的编程环境和工具链。对于Python环境推荐使用Anaconda发行版它集成了科学计算所需的常用库。关键库包括Control Systems Library专门用于控制系统分析和设计的Python库NumPy数值计算基础库Matplotlib绘图和可视化库SciPy科学计算工具集安装命令如下pip install control numpy matplotlib scipyMatlab方面控制系统工具箱(Control System Toolbox)是核心依赖它提供了tf()传递函数创建step()阶跃响应分析bode()频域分析rlocus()根轨迹绘制提示对于学生用户Matlab提供校园版授权Python方案则完全免费适合预算有限的场景两种工具各有优势特性PythonMatlab成本免费商业授权扩展性极强中等控制专业函数较少但够用非常丰富社区支持活跃专业学习曲线较平缓较陡峭2. 从理论到代码传递函数实现传递函数是自动控制系统的核心数学模型描述系统输入输出关系的拉普拉斯变换比。2.1 传递函数的标准形式考虑二阶系统传递函数 $$G(s) \frac{\omega_n^2}{s^2 2\zeta\omega_n s \omega_n^2}$$在Python中实现import control as ct import numpy as np # 定义系统参数 zeta 0.5 # 阻尼比 omega_n 1.0 # 自然频率 # 创建传递函数 num [omega_n**2] # 分子多项式系数 den [1, 2*zeta*omega_n, omega_n**2] # 分母多项式系数 sys ct.TransferFunction(num, den) # 打印传递函数 print(sys)Matlab等效实现zeta 0.5; omega_n 1.0; num omega_n^2; den [1 2*zeta*omega_n omega_n^2]; sys tf(num, den) % 显示传递函数 disp(sys)2.2 传递函数的互转换实际工程中常需要在不同形式间转换传递函数零极点增益形式# Python转换为零极点形式 sys_zpk ct.tf2zpk(sys) print(f零点: {sys_zpk.zeros}) print(f极点: {sys_zpk.poles}) print(f增益: {sys_zpk.gain})状态空间形式% Matlab转换为状态空间 [A, B, C, D] tf2ss(num, den); disp(状态矩阵A:); disp(A) disp(输入矩阵B:); disp(B) disp(输出矩阵C:); disp(C) disp(直接传输矩阵D:); disp(D)3. 时域响应分析实战时域分析是理解系统动态特性的直观方法主要包括阶跃响应和脉冲响应。3.1 阶跃响应仿真Python实现阶跃响应并绘制曲线import matplotlib.pyplot as plt # 计算阶跃响应 t, y ct.step_response(sys) # 绘制响应曲线 plt.figure(figsize(10, 6)) plt.plot(t, y) plt.title(二阶系统阶跃响应 (ζ0.5)) plt.xlabel(时间 (s)) plt.ylabel(幅值) plt.grid(True) plt.show()Matlab实现% 计算并绘制阶跃响应 step(sys); title(二阶系统阶跃响应 (ζ0.5)); grid on;关键性能指标计算上升时间(Rise Time)峰值时间(Peak Time)超调量(Overshoot)调节时间(Settling Time)Python计算指标# 获取阶跃响应指标 info ct.step_info(sys) print(f上升时间: {info[RiseTime]:.3f}秒) print(f超调量: {info[Overshoot]:.2f}%) print(f调节时间: {info[SettlingTime]:.3f}秒)3.2 脉冲响应与初始条件响应脉冲响应反映系统固有特性# Python脉冲响应 t, y ct.impulse_response(sys) # 带初始条件的响应 t, y ct.initial_response(sys, X0[0, 1], Tnp.linspace(0, 10, 1000))4. 频域分析与稳定性判据频域分析通过Bode图、Nyquist图等工具评估系统频率特性。4.1 Bode图绘制Python实现# 计算频率响应 mag, phase, omega ct.bode(sys, dBTrue, HzFalse) # 自定义绘制 plt.figure(figsize(12, 6)) plt.subplot(2, 1, 1) plt.semilogx(omega, 20*np.log10(mag)) plt.title(Bode图) plt.ylabel(幅值(dB)) plt.grid(True) plt.subplot(2, 1, 2) plt.semilogx(omega, phase*180/np.pi) plt.ylabel(相位(度)) plt.xlabel(频率(rad/s)) plt.grid(True) plt.show()Matlab简写bode(sys); grid on;4.2 稳定性分析Nyquist判据和根轨迹是分析稳定性的有力工具。Python根轨迹绘制# 定义开环系统 ol_sys ct.TransferFunction([1], [1, 3, 2, 0]) # 绘制根轨迹 plt.figure(figsize(8, 6)) ct.root_locus(ol_sys) plt.title(根轨迹图) plt.grid(True) plt.show()Nyquist稳定性判据应用% Matlab Nyquist图 nyquist(ol_sys); title(Nyquist图); grid on;5. 典型控制系统案例复现通过具体案例展示完整分析流程。5.1 直流电机速度控制系统系统传递函数 $$G(s) \frac{K}{(Jsb)(LsR)K^2}$$Python实现# 电机参数 J 0.01 # 转动惯量 b 0.1 # 阻尼系数 K 0.01 # 电机常数 R 1 # 电阻 L 0.5 # 电感 # 创建传递函数 num [K] den [J*L, J*R b*L, b*R K**2] motor_sys ct.TransferFunction(num, den) # 分析阶跃响应 plt.figure(figsize(10, 6)) t, y ct.step_response(motor_sys, Tnp.linspace(0, 3, 1000)) plt.plot(t, y) plt.title(直流电机阶跃响应) plt.xlabel(时间(s)) plt.ylabel(速度(rad/s)) plt.grid(True) plt.show()5.2 PID控制器设计与实现Python实现PID控制# 定义被控对象 plant ct.TransferFunction([1], [1, 3, 3, 1]) # PID参数 Kp 1.2 Ki 0.5 Kd 0.1 # 创建PID控制器 pid ct.TransferFunction([Kd, Kp, Ki], [1, 0]) # 构建闭环系统 closed_loop ct.feedback(pid * plant, 1) # 比较控制效果 t, y1 ct.step_response(plant, Tnp.linspace(0, 20, 1000)) t, y2 ct.step_response(closed_loop, Tnp.linspace(0, 20, 1000)) plt.figure(figsize(10, 6)) plt.plot(t, y1, --, label开环响应) plt.plot(t, y2, labelPID控制) plt.legend() plt.title(PID控制效果对比) plt.xlabel(时间(s)) plt.ylabel(幅值) plt.grid(True) plt.show()6. 常见问题与调试技巧实际编程中常遇到的典型问题及解决方案数值不稳定问题现象高频振荡或发散解决检查时间步长尝试减小仿真步长t np.linspace(0, 10, 5000) # 增加点数单位不匹配错误确保所有物理量单位一致特别检查时间常数和频率单位奇异矩阵警告常见于状态空间实现检查系统是否可控可观Bode图异常确认频率范围设置合理omega np.logspace(-2, 2, 500) # 自定义频率范围PID参数整定技巧先调P使系统快速但不稳定再调D增加阻尼最后调I消除稳态误差7. 扩展应用与进阶技巧掌握基础后可进一步探索以下高级主题多输入多输出(MIMO)系统% 定义2x2 MIMO系统 A [-1 0.5; 0.2 -0.8]; B [1 0; 0 1]; C [1 0; 0 1]; D zeros(2,2); sys_mimo ss(A, B, C, D);非线性系统仿真使用Matlab Simulink进行框图建模Python中可用scipy.integrate.odeint求解微分方程实时控制实现结合树莓派等硬件平台使用Python控制库实现实时控制系统辨识技术从实验数据估计系统模型Pythonscipy.signal提供相关工具鲁棒控制设计H∞控制μ综合方法需要更专业的控制工具箱支持