目录
前言
1.导出数据基本操作
1.1对to workspace模块
1.2对模型进行设置
2. 使用Matlab函数估计simulink闭环系统传递函数
2.1函数格式介绍
2.1.1 iddata函数
2.1.2 tfest函数
2.1.3 bode函数和bodeplot函数
2.1.4 bodemag函数
2.2 得到闭环传递函数实现程序
3.频域分析
3.1 bodeplot绘制
3.2 bode绘制
3.3 bodemag函数绘制
3.4 注意事项
3.5程序汇总
之前一直在对模型进行时域分析,后来发现很多文章含频域分析的内容,但是网上又没有开源代码,所以经过自己一番摸索,得到一种不用simulink线性化工具箱绘制频域分析图的方法,并且能利用matlab函数导出模型的闭环传递函数。若有错误,欢迎指导!
关于使用Simulink线性化工具箱对Simulink模型频域分析见上期文章,链接:
MATLAB/Simulink 线性分析工具箱频域分析(手把手教会)_Mr. 邹的博客-CSDN博客_simulink怎么看频域波形图
比如以我的悬架模型我例子,我需要判断被动、主动、参考模型的幅频特性,这里我使用to workspace模型将其数据导出到工作区间:
这里我习惯进行一些设置,方便再工作区间查看和索引:
这样simulink模型仿真之后,数据便在工具箱区间这样一目了然显示了:
格式:
data = iddata(y,u,Ts)
data = iddata(y,[],Ts)
data = iddata(y,u,Ts,'Frequency',W)
data = iddata(___,Name,Value)
其中,y为输出(即这里的ddxs),u为输入(即这里的xr),Ts为采样时间
格式:
sys = tfest(data,np)
sys = tfest(data,np,nz)
sys = tfest(data,np,nz,iodelay)
sys = tfest(___,Name,Value)
sys = tfest(data,init_sys)
sys = tfest(___,opt)
data即为上述用iddata导出的数据,np为极点数,nz为零点数。
参考:
【MATLAB】利用tfest函数 由扫频数据计算传递函数_GUNDAM_EXIA_的博客-CSDN博客_matlab tfest
bode函数和bodeplot函数这两个函数用法基本一致,不过bode函数的用法更多,它还可以导出相位和幅值的信息。
bode函数格式:
bode(sys)
bode(sys1,sys2,...,sysN)
bode(sys1,LineSpec1,...,sysN,LineSpecN)
bode(___,w)
[mag,phase,wout] = bode(sys)
[mag,phase,wout] = bode(sys,w)
[mag,phase,wout,sdmag,sdphase] = bode(sys,w)
bodeplot函数格式:
h = bodeplot(sys)
bodeplot(sys)
bodeplot(sys1,sys2,...)
bodeplot(AX,...)
bodeplot(..., plotoptions)
bodeplot(sys,w)
bodemag函数只显示幅值信息,其余用法同bodeplot。
格式:
bodemag(sys)
bodemag(sys,{wmin,wmax})
bodemag(sys,w)
bodemag(sys1,sys2,...,sysN,w)
由于我这里是单输入3输出,所以导出来三个传递函数:sys1、sys2、sys3
即这里我需要对三个被控对象:被动、主动、参考模型分别在路面激励下的某一个相同输出(车身加速度)的传递函数:
tfdata1 = iddata(ddxs(:,1),xr,0.001);%输入xr到输出第一个车身加速度ddxs(:,1)的数据
np = 5;
sys1 = tfest(tfdata1,np);%传递函数估计
tfdata2 = iddata(ddxs(:,2),xr,0.001);
sys2 = tfest(tfdata2,np);
tfdata3 = iddata(ddxs(:,3),xr,0.001);
sys3 = tfest(tfdata3,np)
为了节省篇幅,我只放第三个传递函数的运行结果:
sys3 =
From input "u1" to output "y1":
2762 s^4 + 1.516e05 s^3 + 6.764e05 s^2 + 1.12e05 s - 8.604e04
----------------------------------------------------------------
s^5 + 16.46 s^4 + 3595 s^3 + 3.675e04 s^2 + 2.001e05 s + 7.52e05
Continuous-time identified transfer function.
Parameterization:
Number of poles: 5 Number of zeros: 4
Number of free coefficients: 10
Use "tfdata", "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using TFEST on time domain data "tfdata3".
Fit to estimation data: 74.06%
FPE: 0.002833, MSE: 0.002825
可以看到会显示估计的匹配度等一些信息。
以伯德图为例,实现程序如下:
由于频域分析,我对伯德图频域进行限制,也可以不用,就会显示系统默认的频域横坐标。
w = logspace(-1,2,50);%频域范围
bodeplot(sys1,'r',sys2,'k',sys3,'b',w);
title("Body Acceleration"); legend("Passive","Active","Reference")
运行结果
程序:
figure(2);bode(sys1,'r',sys2,'k',sys3,'b');%效果同bodeplot函数
title("Body Acceleration"); legend("Passive","Active","Reference")
运行结果:
程序:
figure;bodemag(sys1,'r',sys2,'k',sys3,'b',w);%只绘制伯德图的幅值,没有相位
title("Body Acceleration"); legend("Passive","Active","Reference")
运行结果:
①这几个函数可以对图像的线条类型、线条颜色进行调整,但是不能对线条大小调整,如:
便会报错:
错误使用 DynamicSystem/bode (line 95)
Invalid syntax for time or frequency response command. See command help for more information
②对于传递函数估计的iddata函数使用要注意,input和output的维度要相同,否则会报错,如:
③对于传递函数估计的tfest函数要至少指定极点的数目,否则报错,如:
tfdata1 = iddata(ddxs(:,1),xr,0.001);%输入xr到输出第一个车身加速度ddxs(:,1)的数据
np = 5;
sys1 = tfest(tfdata1,np);%传递函数估计
tfdata2 = iddata(ddxs(:,2),xr,0.001);
sys2 = tfest(tfdata2,np);
tfdata3 = iddata(ddxs(:,3),xr,0.001);
sys3 = tfest(tfdata3,np);
w = logspace(-1,2,50);%频域范围
%%%%bodeplot函数绘制%%%%%
% bodeplot(sys1,'r',sys2,'k',sys3,'b',w);
% title("Body Acceleration"); legend("Passive","Active","Reference")
%%%%bode函数绘制%%%%%
% figure(2);bode(sys1,'r',sys2,'k',sys3,'b',w,'linewidth',1);%效果同bodeplot函数
% title("Body Acceleration"); legend("Passive","Active","Reference")
%%%%bodemag函数绘制%%%%%
figure;bodemag(sys1,'r',sys2,'k',sys3,'b',w);%只绘制伯德图的幅值,没有相位
title("Body Acceleration"); legend("Passive","Active","Reference")
此外关于splot频域分析使用方法和程序在我的这篇文章也有提到,也是可以进行频域分析:
ltisys和ltiss函数使用及示例学习(含实现程序)_Mr. 邹的博客-CSDN博客
①关于估计传递函数,需要人为给定极点数,这样估计的传递函数是否准确呢?能否有其他的替代方法?
利用MATLAB来计算simulink模型传递函数
汽车操纵动力学Simulink建模 | 时域 频域 稳定性分析 | 2自由度单轮系统 - 哔哩哔哩
②这样绘制的伯德图和线性化工具箱的是否一致?
这里使用线性化工具箱绘制了一张,可以看基本是一致的
如果有帮助,麻烦帮忙点个赞是我最大的分享动力,非常感谢!
注:仅为便利自己学习和学术交流使用,错误在所难免,如有兴趣的学者可以参考交流,如果侵权,立马删,谢谢!
参考资料: