根轨迹绘图:传函分子分母的系数带复数

matlab有个自带的函数rlocus可以绘制系统的根轨迹,但只在系数为实数的情况下可用,如:

num_open = [1, 2];  % 开环传递函数分子多项式系数
den_open = [1, 3, 4];  % 开环传递函数分母多项式系数
K_vals = linspace(0, 100, 500);  % 增益范围
rlocus(tf(num_open,den_open),K_vals)

num_open = [1, 2+1i];  % 开环传递函数分子多项式系数
den_open = [1, 3+2i, 2-1i];  % 开环传递函数分母多项式系数
K_vals = linspace(0, 100, 500);  % 增益范围
rlocus(tf(num_open,den_open),K_vals)

 


那么如何用matlab实现系统传函系数为复数时的根轨迹绘制呢 ?

可以通过以下方法实现绘制具有复数系数的传递函数的根轨迹:

  1. 将具有复数系数的传递函数转换为状态空间表示。这可以通过MATLAB的tf2ss函数完成。

  2. 在状态空间表示下,计算系统特征根随参数(例如增益)变化的轨迹。这可以通过在一系列参数值上循环并使用MATLAB的eig函数计算特征值来完成。

  3. 在复平面上绘制根轨迹。

以上面的情况为例,具体代码如下:

% 定义开环传递函数
num_open = [1, 2+1i];  % 开环传递函数分子多项式系数
den_open = [1, 3+2i, 2-1i];  % 开环传递函数分母多项式系数

% 计算闭环传递函数
% 此处以单位负反馈系统为例,根据自己分析的情况做相应更改
G_open = tf(num_open, den_open);
G_closed = feedback(G_open, 1);

% 提取闭环传递函数的分子和分母多项式系数
[num_closed, den_closed] = tfdata(G_closed, 'v'); % 'v':指定以数组形式输出(默认cell)

% 转换为状态空间表示
[A, B, C, D] = tf2ss(num_closed, den_closed);

% 计算根轨迹
K_vals = linspace(0, 100, 500);  % 增益范围(根据自己的情况修改)
roots = zeros(length(den_closed)-1, length(K_vals));

for i = 1:length(K_vals)
    K = K_vals(i);
    eigvals = eig(A - B*K*C);
    roots(:, i) = eigvals;
end

% 绘制根轨迹
figure;
ax = gca;
hold(ax,"on")
for j = 1:length(den_closed)-1
    plot(ax,real(roots(j,1)), imag(roots(j,1)),'xr') % 起点
    plot(ax,real(roots(j,:)), imag(roots(j,:)));
end
hold(ax,"off")
xlabel('Real Axis');
ylabel('Imaginary Axis');
title('Root Locus of Closed-loop System with Complex Coefficients');
axis([-120,20,-6,6])

注:

1.上述根轨迹计算针对的系统结构与与matlab自带函数rlocus一致,如下:

2.本人写的这个函数存在一个缺陷,望周知:无法判断求出来的特征值哪些来源于同一个根,画根轨迹图时可能需要手动调整。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值