Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)

目录

前言

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怎么看频域波形图

1.导出数据基本操作

比如以我的悬架模型我例子,我需要判断被动、主动、参考模型的幅频特性,这里我使用to workspace模型将其数据导出到工作区间:

Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)_第1张图片

 这里我习惯进行一些设置,方便再工作区间查看和索引:

1.1对to workspace模块

Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)_第2张图片

1.2对模型进行设置

Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)_第3张图片

 这样simulink模型仿真之后,数据便在工具箱区间这样一目了然显示了:

Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)_第4张图片

 2. 使用Matlab函数估计simulink闭环系统传递函数

2.1函数格式介绍

2.1.1 iddata函数

格式:

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为采样时间

2.1.2 tfest函数

格式:

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

matlab simulink 传递函数,如何从Simulink模型获取传递函数到Matlab_安泰一金钢网防护窗的博客-CSDN博客

2.1.3 bode函数和bodeplot函数

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)

2.1.4 bodemag函数

bodemag函数只显示幅值信息,其余用法同bodeplot。

格式:

bodemag(sys)
bodemag(sys,{wmin,wmax})
bodemag(sys,w)
bodemag(sys1,sys2,...,sysN,w)

2.2 得到闭环传递函数实现程序

由于我这里是单输入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     

可以看到会显示估计的匹配度等一些信息。

3.频域分析

以伯德图为例,实现程序如下:

3.1 bodeplot绘制

由于频域分析,我对伯德图频域进行限制,也可以不用,就会显示系统默认的频域横坐标。

w = logspace(-1,2,50);%频域范围
bodeplot(sys1,'r',sys2,'k',sys3,'b',w);
title("Body Acceleration"); legend("Passive","Active","Reference")

运行结果

Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)_第5张图片

3.2 bode绘制

程序:

figure(2);bode(sys1,'r',sys2,'k',sys3,'b');%效果同bodeplot函数
title("Body Acceleration"); legend("Passive","Active","Reference")

运行结果:

Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)_第6张图片

3.3 bodemag函数绘制

程序:

figure;bodemag(sys1,'r',sys2,'k',sys3,'b',w);%只绘制伯德图的幅值,没有相位
title("Body Acceleration"); legend("Passive","Active","Reference")

运行结果:

Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)_第7张图片

3.4 注意事项

①这几个函数可以对图像的线条类型、线条颜色进行调整,但是不能对线条大小调整,如:

便会报错:

错误使用 DynamicSystem/bode (line 95)
Invalid syntax for time or frequency response command. See command help for more information

②对于传递函数估计的iddata函数使用要注意,input和output的维度要相同,否则会报错,如:

 ③对于传递函数估计的tfest函数要至少指定极点的数目,否则报错,如:

3.5程序汇总

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博客

4.学习问题

①关于估计传递函数,需要人为给定极点数,这样估计的传递函数是否准确呢?能否有其他的替代方法?

利用MATLAB来计算simulink模型传递函数

汽车操纵动力学Simulink建模 | 时域 频域 稳定性分析 | 2自由度单轮系统 - 哔哩哔哩

②这样绘制的伯德图和线性化工具箱的是否一致?

这里使用线性化工具箱绘制了一张,可以看基本是一致的

Simulink模型闭环传递函数导出及Matlab对simulink模型进行频域分析(含实现程序)_第8张图片

如果有帮助,麻烦帮忙点个赞是我最大的分享动力,非常感谢!

注:仅为便利自己学习和学术交流使用,错误在所难免,如有兴趣的学者可以参考交流,如果侵权,立马删,谢谢!

参考资料:

你可能感兴趣的:(MATLAB工具箱,频域分析,matlab,算法,频域分析,汽车,悬架)