MATLAB rlocus函数结合根轨迹做控制器参数优化实操教程

📅 2026/7/12 6:47:19 👁️ 阅读次数 📝 编程学习
MATLAB rlocus函数结合根轨迹做控制器参数优化实操教程

文章目录

    • 一、整体思路说明
    • 二、基础:纯比例K参数单变量优化(最常用)
      • 2.1 优化判定指标
      • 2.2 完整优化代码流程
      • 2.3 优化操作步骤
      • 2.4 批量遍历增益自动筛选最优K(无需手动点选)
    • 三、进阶1:新增校正零点,根轨迹优化超前校正参数
      • 实操优化流程
    • 四、进阶2:滞后校正根轨迹优化(改善稳态误差)
    • 五、进阶3:PI控制器参数根轨迹优化
    • 六、根轨迹参数优化核心注意事项
    • 七、完整综合优化示例(可直接复制做课程设计)

一、整体思路说明

根轨迹参数优化核心逻辑:以开环增益(K)为可调参数,利用rlocus观察闭环极点分布,结合阻尼比、稳定裕度、阶跃响应性能指标筛选最优增益;若单增益无法满足要求,可新增超前/滞后校正零极点,再通过根轨迹重新优化参数。
适用场景:比例控制器P参数整定、超前校正、滞后校正、PI/PID初步参数寻优,全程依托rlocusrlocfindsgrid完成可视化优化,最后用阶跃响应验证优化效果。

二、基础:纯比例K参数单变量优化(最常用)

2.1 优化判定指标

工程通用约束条件:

  1. 闭环极点全部位于s平面左半平面(系统稳定);
  2. 共轭复极点阻尼比(\zeta=0.4\sim0.7),超调量5%~25%;
  3. 远离虚轴,保证调节时间短、响应速度快;
  4. 避开临界稳定增益区间。

2.2 完整优化代码流程

clear;clc;close all;s=tf('s');% 原始被控对象开环传递函数Gp=1/(s*(s+2)*(s+6));figure(1);rlocus(Gp);% 绘制阻尼比参考网格sgrid([0.4,0.7],[]);grid on;title('根轨迹优化:阻尼比0.4~0.7最优区间');% 交互式拾取满足阻尼比的最优增益[K_opt,poles]=rlocfind(Gp);disp(['优化后比例增益 K = ',num2str(K_opt)]);disp(['对应闭环极点:',num2str(poles)]);% 构建闭环系统验证动态性能G_close=feedback(K_opt*Gp,1);figure(2);step(G_close);grid on;title(['K=',num2str(K_opt),'优化后闭环阶跃响应']);

2.3 优化操作步骤

  1. 运行代码弹出根轨迹,0.4~0.7两条阻尼线之间为最优极点区域;
  2. 鼠标点击轨迹落在两条网格线中间的共轭极点;
  3. 读取输出(K_{opt}),自动生成闭环阶跃曲线,查看超调、调节时间是否达标;
  4. 若超调偏大,重新点击更靠近0.7阻尼线的极点,重新选取更小增益。

2.4 批量遍历增益自动筛选最优K(无需手动点选)

适合需要批量对比、写入实验报告场景,自动筛选阻尼比落在0.4~0.7区间的增益:

s=tf('s');Gp=1/(s*(s+2)*(s+6));% 设定增益遍历范围K_list=0:0.1:30;[r,K_out]=rlocus(Gp,K_list);% 循环判断每组增益对应的共轭极点阻尼比fori=1:length(K_out)p=r(:,i);% 提取共轭复极点complex_p=p(imag(p)~=0);if~isempty(complex_p)sigma=real(complex_p(1));wd=abs(imag(complex_p(1)));wn=sqrt(sigma^2+wd^2);zeta=-sigma/wn;% 筛选阻尼比0.4~0.7区间ifzeta>=0.4&&zeta<=0.7disp(['适配增益K=',num2str(K_out(i)),' 阻尼比ζ=',num2str(zeta)]);endendend

三、进阶1:新增校正零点,根轨迹优化超前校正参数

单纯调节比例K无法同时满足响应速度与超调时,引入超前校正 (G_c(s)=K\frac{s+z}{s+p}\quad(z<p)),固定零点z,通过根轨迹优化极点p与总增益K。

实操优化流程

  1. 固定校正零点,多次调整极点p,绘制多条根轨迹对比轨迹偏移;
  2. 选择能让主极点落在目标阻尼区间的p;
  3. 再用rlocfind拾取最优K;
clear;clc;s=tf('s');Gp=1/(s*(s+6));z=1;% 固定校正零点% 两组不同校正极点对比Gc1=(s+z)/(s+8);Gc2=(s+z)/(s+12);G1=Gc1*Gp;G2=Gc2*Gp;figure;rlocus(G1,'r-',G2,'b--');sgrid(0.6,[]);grid on;legend('校正极点p=8','校正极点p=12');title('超前校正极点参数根轨迹对比优化');% 选择轨迹性能更好的系统拾取最优K[K_opt,~]=rlocfind(G2);G_close=feedback(K_opt*G2,1);figure;step(G_close);grid on;

优化逻辑:极点p越大,根轨迹主极点越往左,系统响应速度越快,反复对比选出兼顾超调与速度的p。

四、进阶2:滞后校正根轨迹优化(改善稳态误差)

滞后校正 (G_c(s)=\frac{s+z}{s+p}\quad(z>p)),作用压低低频增益、提升稳态精度,根轨迹优化要点:

  1. 校正零极点靠近原点,几乎不改变主极点动态特性;
  2. 主极点仍落在0.4~0.7阻尼区间,仅优化稳态误差;
s=tf('s');Gp=1/(s*(s+3));Gc=(s+0.8)/(s+0.1);% 滞后校正G_open=Gc*Gp;figure;rlocus(G_open);sgrid(0.6,[]);[K_opt,~]=rlocfind(G_open);G_close=feedback(K_opt*G_open,1);figure;step(G_close);

优化判断:对比不加滞后校正、加滞后校正两条阶跃曲线,稳态误差明显减小,振荡幅度不变即为参数合适。

五、进阶3:PI控制器参数根轨迹优化

PI控制器 (G_c(s)=K_p+\frac{K_i}{s}=K_p\frac{s+K_i/K_p}{s}),令零点(z=K_i/K_p),通过根轨迹优化零点位置与总增益:

  1. 调整零点z,观察根轨迹主极点位置;
  2. 选定合适零点后,拾取最优比例增益;
s=tf('s');Gp=1/(s+4);% PI控制器,零点z可变z=1.2;Gc=(s+z)/s;G_open=Gc*Gp;figure;rlocus(G_open);sgrid(0.5,[]);[Kp_opt,~]=rlocfind(G_open);Ki_opt=Kp_opt*z;disp(['最优比例Kp=',num2str(Kp_opt),' 积分Ki=',num2str(Ki_opt)]);G_close=feedback(Kp_opt*Gc*Gp,1);step(G_close);grid on;

六、根轨迹参数优化核心注意事项

  1. 区分主导极点与远极点
    优化只关注靠近虚轴的共轭主导极点;远离虚轴的极点响应速度极快,对动态性能影响很小,不用作为优化依据。
  2. 优化必须配套阶跃响应验证
    根轨迹只能看极点位置,无法反映稳态误差、实际超调量,选出参数后必须绘制step曲线校验指标。
  3. 多参数优化分步进行,不要同时调多个变量
    先固定校正零极点,优化增益K;确定K后再微调零极点,多变量同步调整会无法判断参数影响规律。
  4. 临界稳定增益约束
    优化的K必须小于轨迹与虚轴交点对应的临界增益,否则系统发散;鼠标点击虚轴交点可读取临界K上限。
  5. sgrid网格仅作参考,不能完全照搬
    若系统存在远实极点,即使主极点阻尼比达标,曲线仍可能出现小幅振荡,需以实际阶跃响应为准。
  6. 离散系统优化禁用sgrid
    离散z平面根轨迹使用zgrid绘制阻尼圆,稳定边界为单位圆,优化判定标准和连续s平面完全不同。

七、完整综合优化示例(可直接复制做课程设计)

% 基于rlocus的比例增益完整参数优化脚本clear;clc;close all;s=tf('s');% 被控对象G_obj=2/(s*(s+1)*(s+5));% 1. 绘制根轨迹,划定最优阻尼区间figure(1);rlocus(G_obj);sgrid([0.4,0.7],[]);grid on;title('根轨迹参数优化:ζ=0.4~0.7最优区间');% 2. 交互式拾取最优增益[K_best,poles_best]=rlocfind(G_obj);disp('==========优化结果==========');disp(['最优比例增益 K = ',num2str(K_best)]);disp(['闭环主导极点:',num2str(poles_best)]);% 3. 构建闭环系统,验证时域指标G_clos=feedback(K_best*G_obj,1);figure(2);step(G_clos);grid on;title(['优化参数K=',num2str(K_best),'闭环阶跃响应']);% 4. 提取响应数据计算超调量[y,t]=step(G_clos);y_steady=y(end);y_max=max(y);overshoot=(y_max-y_steady)/y_steady*100;disp(['系统超调量:',num2str(overshoot),' %']);