最近在做Simulink仿真,但是simulink中的定积分模块的上下限是在仿真中只能使用常数值,而自己需要不同时刻定积分的上下限都是在变换的,发现网络上找到的都较为复杂,记录一下自己的解决过程
解决思路: matlab的m文件可以使用定积分函数integral,因而通过simulink调用m文件而解决变上下限定积分的问题
中间遇到的问题:Simulink中的定积分模块上下限为常数值输入,因而无法满足需求,网络上有教程可以设置几个模块从而实现变边界,由于没太懂,因而pass;Simulink中的function模块中有MATLAB Function,其本质也是使用m文件调用,但在里面无法使用integral函数,因而pass
解决方法:使用S-Function函数嵌入Simulink仿真中实现变上下限定积分
具体过程:在simulink中创建s函数图标
1.在命令行输入以下命令,先调用s函数模板,确定自己的s函数文件
>> edit sfuntmpl.m
复制模板内容后,粘贴到新的m文件,修改为自己的函数名称。
2.找到模板中以下内容:
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 4;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
修改NumInputs为定积分中需要输入的参数数目,NumOutpus为定积分输出值的数目
3.找到模板中function sys=mdlOutputs(t,x,u)函数
% mdlOutputs
% Return the block outputs.
%=============================================================================
%
function sys=mdlOutputs(t,x,u)
sys = [];
其中u为上一步中修改的输入参数。
将该模板函数修改为所需要的定积分表达式,sys值即为输出值。
例如:需要计算的表达式如下
该表达式中E、L、 alpha_2为常数,alpha_1为变换量,因而每次的定积分上下限都不同,但在某个时间点的定积分中,alpha_1为确定量。
故对于该定积分一共有四个输入值,输出值为kb1。修改模板函数如下所示:
function sys=mdlOutputs(t,x,u)
E=u(1);
L=u(2);
alpha_2=u(3);
alpha_1 = u(4);
f = @(m)(3.*((1+cos(alpha_1).*((alpha_2-m).*sin(m)-cos(m))).^2).*(alpha_2-m).*cos(m))./(2.*E.*L.*(sin(m)+(alpha_2-m).*cos(m)).^3);
out = 1/integral(f,-alpha_1,alpha_2);
sys = out;
完成如上步骤,则完成了S函数的创建工作,下一步将S函数在simulink中实现输入与输出。
4. 将simulink中的S函数的响应框中函数名称改为你的S函数文件名,并置于同一路径下,从而仿真时能找到s函数文件
使用Simulink中的mux部件,实现多信号输入。
其中输入可以是变换的,从而实现了上下限变换的定积分仿真计算。
不足:调用S函数会使Simulink的仿真变慢。