S函数(基础1)

        在学习S函数的时候总是发现按照网上的很多解释每一行的意义的文章很多,但是实际操作的时候总是不知道该如何下手,所以我就不再讲每一行的意义是什么,怎么用,这一节我只讲下面一种情况,适合有一点基础,刚入门的人。

        在写状态方程时如何加入状态方程中的已知输入量。就是如方程

                                                                                   xhat=Ax+Bu,

                                                                                    y=Cx+Du

中假如A=[1 2;3 4],那么有很多时候A=[m f;q w],是这样的形式出现,网上的S函数的例子也没有相关的,让人一下摸不着头脑,虽然这个对于熟悉的人来说很简单,但是对于没有基础的人来说很难。废话不多说,下面是例子。

下图中,上面的是没有外部参数的,下面是有外部参数的。

S函数(基础1)

S函数代码:

没有外部参数:

function [sys,x0,str,ts]=wentext1(t,x,u,flag)
A=[0.09 0.01;1 0];
B=[1 7;0 2];
C=[0 2;1 5];
D=[3 0;1 0];
switch flag,
    case 0,
        [sys,x0,str,ts]=mdInitializeSizes(A,B,C,D);
    case 1,
        sys=mdlDerivatives(t,x,u,A,B,C,D);
    case 2,
        sys=mdlUpdate(t,x,u);
    case 3,
        sys=mdlOutputs(t,x,u,A,B,C,D);  
    case 4,
        sys=mdlGetTimeOfNextVarHit(t,x,u);    
    case 9,
        sys=mdlTerminate(t,x,u);    
    otherwise
        DAStudio.error('Simulink:bloks:unhandledFlag',num2str(flag));
end
function [sys,x0,str,ts]=mdInitializeSizes(A,B,C,D)
sizes=simsizes;
sizes.NumContStates=2;
sizes.NumDiscStates=0;
sizes.NumOutputs=2;
sizes.NumInputs=2;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=zeros(2,1);
str=[];
ts=[0 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u,A,B,C,D)

sys=A*x+B*u;
function sys=mdlUpdate(t,x,u)
sys=[];
function sys=mdlOutputs(t,x,u,A,B,C,D)

sys=C*x+D*u;
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime=1;
sys=t+sampleTime;
function sys=mdlTerminate(t,x,u)
sys=[];

有外部参数的:

function [sys,x0,str,ts]=wentext(t,x,u,flag)
%A=[0.09 0.01;1 0];
%B=[1 7;0 2];
%C=[0 2;1 5];
%D=[3 0;1 0];
switch flag,
    case 0,
        [sys,x0,str,ts]=mdInitializeSizes;
    case 1,
        sys=mdlDerivatives(t,x,u);
    case 2,
        sys=mdlUpdate(t,x,u);
    case 3,
        sys=mdlOutputs(t,x,u);  
    case 4,
        sys=mdlGetTimeOfNextVarHit(t,x,u);    
    case 9,
        sys=mdlTerminate(t,x,u);    
    otherwise
        DAStudio.error('Simulink:bloks:unhandledFlag',num2str(flag));
end
function [sys,x0,str,ts]=mdInitializeSizes
sizes=simsizes;
sizes.NumContStates=2;
sizes.NumDiscStates=0;
sizes.NumOutputs=2;
sizes.NumInputs=4;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=zeros(2,1);
str=[];
ts=[0 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)   %让u(1);u(2)成为输入变量,可以是其他几个位置,其他的可以作为外部输入的值
F=u(3);                                              %外部输入的值可以是常数,也可以是其他,在写代码时容易出错,主要是维度出问题
M=u(4);                                             %维度重点看u这个矩阵,容易忘记转置
A=[0.09 F;1 M];
B=[0 7;0 2];
u=[u(1);u(2)];
sys=A*x+B*u;
function sys=mdlUpdate(t,x,u)
sys=[];
function sys=mdlOutputs(t,x,u)
C=[0 2;1 5];
D=[3 0;1 0];
u=[u(1);u(2)];
sys=C*x+D*u;
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime=1;
sys=t+sampleTime;
function sys=mdlTerminate(t,x,u)
sys=[];

代码没有和上文的A给出的值一样,懒得改了,但是大概意思就是这样,