s函数中第一个程序修改(介绍function sys = mlupdate(t, x, u)用法)

示例:

dx1/dt=-0.5572x1-0.7814x2+u1-u2;

dx2/dt=0.7814x1+2u2;

y=1.9691x1+6.4493x2;

simulink模型的建立

 s函数程序

 A=[-0.5572,-0.7814;0.7814,0];
 B=[1,-1;0,2];
 C=[1.9691,6.4493];

程序与之前修改的部分使用红色标出

  function [sys,x0,str,ts,simStateCompliance] = sfun_state01(t,x,u,flag,A,B,C)
  switch flag,
  case 0,
  [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
  case 1,
  sys=mdlDerivatives(t,x,u);
  case 2,
  sys=mdlUpdate(t,x,u,A,B);
  case 3,
 sys=mdlOutputs(t,x,u,C);
 case 4,
 sys=mdlGetTimeOfNextVarHit(t,x,u);
 case 9,
 sys=mdlTerminate(t,x,u);
 otherwise
 DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
 end
 function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
 sizes = simsizes;
 sizes.NumContStates  = 0;
 sizes.NumDiscStates  = 2;
 sizes.NumOutputs     = 1;
 sizes.NumInputs      = 2;
 sizes.DirFeedthrough = 0;
 sizes.NumSampleTimes = 1;
 sys = simsizes(sizes);
 x0  = [0 0]';
 str = [];
 ts  = [0.02,0];
 simStateCompliance = 'UnknownSimState';
 function sys=mdlDerivatives(t,x,u)
  
 sys = [];
 function sys=mdlUpdate(t,x,u,A,B)
 % update state variable
 Ts = 0.02;
 sys = x + (A * x + B * u) *Ts;
  
 function sys=mdlOutputs(t,x,u,C)
 % update output
 sys = C * x;
  
 function sys=mdlGetTimeOfNextVarHit(t,x,u)
  
 sampleTime = 1;
 sys = t + sampleTime;
 function sys=mdlTerminate(t,x,u)
  
 sys = [];

图像结果

function sys = mlupdate(t, x, u)的功能是对离散状态量的跟新,即更新下一采样时刻的状态变量,并在之后的mdloutputs中处理;这是s函数文章中程序错误的原因,但为什么会写成上面的形式呢?离散变量的跟新是什么意思,在这里给大家推导一遍帮助大家的理解

 

 这个式子就是malupdate中需要编写的式子,离散变量的更新就是更新下一个采样时刻的状态变量,在outputs函数中对下一采样时刻处理得到下一采样时刻的输出结果。

有同学会问程序中写的式sys = x + (A * x + B * u) * Ts呢?x代表的x(k)应该好理解,但是左边为什么是sys而不是x(k + 1),首先malupdate函数的输出只有一个sys,其次sys会通过中间变量x传输到Output的x里面,所以这里的sys可以代表x(k + 1)。

到这里小伙伴们应该都清楚了,但是我是怎么验证我写的s-function函数是对s函数这一文章中写的式错的呢?很好办直接对状态方程建立simulink模型看图像和自己写的s-function模型的图像是否一致不就完了。

simulink中的模型

 为了便于观看左边是状态变量x建立的模型,右边是表示输出y的模型,它们之间是使用goto和from模块结合的和直接连线是一样的

图像结果是

              

 为了便于对比这里将s-function中模型的图像也放在这里左边的是状态方程搭建模型的图像,右边是s-function模型的图像,是不是一模一样,显然s函数这篇文章中的图像是有问题的。

posted @ 2021-03-06 10:45  北极星!  阅读(1455)  评论(0编辑  收藏  举报