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函数这篇文章中的图像是有问题的。