MATLAB rlocus函数根轨迹完整实操教程

文章目录

一、rlocus函数核心用途

rlocus是控制系统工具箱专用函数,用于绘制单位负反馈系统 随开环增益K从0到无穷变化时,闭环极点在复平面上的移动轨迹,也就是根轨迹。

通过根轨迹能直观完成三件工程常用工作:

  1. 判断不同增益下系统是否稳定;
  2. 根据阻尼比、超调量要求选定合适开环增益K;
  3. 直观观察零极点对系统动态性能的影响。
    使用前提:提前用tf、zpk、ss搭建LTI线性系统,缺少Control System Toolbox会提示函数未定义。

二、系统建模基础写法

根轨迹只针对开环传递函数建模,两种常用写法。

1. 分子分母系数向量写法(实验报告常用)

示例开环传递函数 G ( s ) = 1 s ( s + 3 ) G(s)=\frac{1}{s(s+3)} G(s)=s(s+3)1

matlab 复制代码
num = [1];
den = conv([1 0],[1 3]);
G = tf(num,den);

多阶分母连续相乘,全部用conv函数嵌套展开,避免手动展开多项式出错。

2. s符号直接建模(复杂系统更简洁)

matlab 复制代码
s = tf('s');
G = 1/(s*(s+3));

三、rlocus基础绘图语法

1. 最简调用,自动绘制完整根轨迹

matlab 复制代码
clear;clc;
s = tf('s');
G = 1/(s*(s+2)*(s+5));
figure;
rlocus(G);
grid on;
title('三阶系统开环根轨迹图');
xlabel('实轴 σ');
ylabel('虚轴 jω');

运行后图像横轴复平面实轴,纵轴虚轴;鼠标左键点击轨迹任意一点,弹窗直接显示:增益K、闭环极点坐标、阻尼比、超调量、无阻尼自然振荡频率。

2. 限定增益K范围绘制局部根轨迹

系统增益区间过大时曲线拥挤,可手动指定K上下限,只绘制关注区间轨迹:

matlab 复制代码
K_range = 0:0.01:20;
rlocus(G,K_range);
grid on;

四、高频进阶实操用法

场景1:添加阻尼比、自然频率参考网格 sgrid

工程设计一般要求阻尼比0.4~0.7,叠加等值线可快速定位满足动态指标的极点:

matlab 复制代码
s = tf('s');
G = 1/(s*(s+1)*(s+4));
rlocus(G);
sgrid(0.6,[]); % 仅绘制阻尼比0.6参考线
grid on;
title('带阻尼比网格的根轨迹');

sgrid(zeta,wn):第一个参数填目标阻尼比,第二个参数填自然频率,留空则只显示阻尼线。

场景2:交互式选取增益 rlocfind

手动点击根轨迹上目标极点,自动返回对应开环增益K,直接生成闭环系统验证阶跃响应:

matlab 复制代码
s = tf('s');
G = 1/(s*(s+2)*(s+5));
rlocus(G);
sgrid(0.5,[]);
grid on;
[K_select,pole] = rlocfind(G);
disp(['选中的开环增益 K = ',num2str(K_select)]);
% 构建单位负反馈闭环系统
G_close = feedback(K_select*G,1);
figure;
step(G_close);
grid on;
title(['K=',num2str(K_select),'闭环系统阶跃响应']);

运行代码后鼠标点击目标极点,命令行输出增益,同时弹出闭环阶跃曲线,一步完成增益整定与性能验证。

场景3:多个系统根轨迹同图对比

对比校正前后、增加零点/极点后的轨迹变化,区分线型颜色:

matlab 复制代码
clear;clc;
s = tf('s');
G1 = 1/(s*(s+4));
G2 = (s+1)/(s*(s+4)); % 增加零点校正
figure;
rlocus(G1,'r-',G2,'b--');
grid on;
legend('原系统','增加零点校正后','Location','best');
title('校正前后根轨迹对比');

场景4:提取根轨迹数据,不绘图

需要批量计算不同K对应的极点坐标时,返回增益向量与极点矩阵:

matlab 复制代码
s = tf('s');
G = 1/(s*(s+3));
K_list = 0:0.5:10;
[r,K_out] = rlocus(G,K_list);
% r每一列对应一个K下的全部闭环极点
disp('增益与对应闭环极点:');
for i = 1:length(K_out)
    disp(['K=',num2str(K_out(i)),' 极点:',num2str(r(:,i))]);
end

场景5:搭配零极点图辅助分析 pzmap

绘制根轨迹前先查看开环零极点分布,预判轨迹走向:

matlab 复制代码
s = tf('s');
G = 1/(s*(s+2)*(s+5));
figure;
pzmap(G);
grid on;
title('系统开环零极点分布图(o零点,x极点)');

五、离散系统根轨迹绘制

离散系统传递函数建立时指定采样时间Ts,rlocus用法完全一致:

matlab 复制代码
num = [0.1];
den = conv([1 -1],[1 -0.5]);
Ts = 0.1;
Gz = tf(num,den,Ts);
figure;
rlocus(Gz);
grid on;
title('离散系统根轨迹图');

六、常见报错与实操避坑

  1. 未定义函数'rlocus'
    未安装Control System Toolbox,命令行输入ver control校验,附加功能管理器安装工具箱。
  2. 根轨迹只有一小段、缺少分支
    分母多项式未完整展开,多阶因式相乘必须用conv嵌套,不能直接手写合并多项式。
  3. rlocfind点击无响应
    必须先弹出rlocus绘图窗口,再执行rlocfind;代码中分figure分开绘图,避免多图覆盖。
  4. 轨迹越过虚轴不知道临界稳定增益
    鼠标点击轨迹与虚轴交点,弹窗读取对应K值,该值为系统临界稳定增益。
  5. 分不清开环闭环
    rlocus只输入开环传递函数,闭环系统需要用feedback结合选定K重新构造。

七、完整可直接运行综合示例脚本

matlab 复制代码
% rlocus根轨迹完整仿真代码
clear; clc; close all;
% 1. 构建三阶开环传递函数
s = tf('s');
G_open = 1/(s*(s+1)*(s+5));
disp('开环传递函数:');
G_open

% 2. 绘制带阻尼网格的根轨迹
figure(1);
rlocus(G_open);
sgrid(0.6,[]);
grid on;
title('三阶系统根轨迹(阻尼比0.6参考线)');

% 3. 交互式选取增益,生成闭环验证动态性能
[K,p] = rlocfind(G_open);
G_close = feedback(K*G_open,1);
figure(2);
step(G_close);
grid on;
title(['K=',num2str(K),'闭环系统阶跃响应曲线']);

% 4. 提取指定增益区间的极点数据
K_data = 0:0.2:15;
[pole_mat,K_out] = rlocus(G_open,K_data);
disp('前5组增益对应闭环极点:');
disp([K_out(1:5), pole_mat(:,1:5)']);
相关推荐
va学弟2 小时前
Java 网络通信编程(10):Channel 和 Selector
java·开发语言
爱吃提升2 小时前
MATLAB impulse函数脉冲响应完整实操教程
开发语言·matlab
小饕2 小时前
从 1080 Ti 到树莓派 4:Qwen2.5-0.5B Function Calling 端侧部署七步实战
开发语言·人工智能
糯米导航2 小时前
Rust + ONNX Runtime 构建生产级 AI 推理服务:从零到压测
开发语言·人工智能·rust
阿pin3 小时前
Java随笔-ConcurrentHashMap
java·开发语言·哈希算法
秋田君3 小时前
QT_QT布局详解
开发语言·数据库·qt
ximen502_3 小时前
Python 语言知识总结
开发语言·python
m0_738120723 小时前
PHP代码审计基础——超全局变量(三)
开发语言·安全·网络安全·php
烟锁池塘柳03 小时前
【C/C++】解决C++控制台输出中文乱码问题
c语言·开发语言·c++
C+-C资深大佬3 小时前
Java 变量:从入门到精通
java·开发语言·python