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)']);
相关推荐
枕星而眠32 分钟前
C++ STL Map容器完全指南:从有序红黑树到无序哈希表
java·开发语言
爱吃牛肉的大老虎1 小时前
Rust对象之结构体,枚举,特性
开发语言·后端·rust
bbq粉刷匠2 小时前
HashMap 底层原理深度拆解(二):putVal 完整链路解析(懒加载 · 链表遍历 · 尾插法)
java·开发语言·哈希算法
@三十一Y2 小时前
C++:红黑树的实现
开发语言·c++
乐观勇敢坚强的老彭3 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
a1117764 小时前
中文优先的企业 RAG 知识库 开源项目
开发语言·开源·kotlin
破z晓4 小时前
javascript 导出excel表
开发语言·javascript·excel
t-think4 小时前
C++类和对象详解(一)
开发语言·c++
西门啐血4 小时前
上位机开发之假装有设备,使用 C# 模拟串口设备
开发语言·mongodb·c#