概述
在学习S函数的时候总是发现按照网上的很多解释每一行的意义的文章很多,但是实际操作的时候总是不知道该如何下手,所以我就不再讲每一行的意义是什么,怎么用,这一节我只讲下面一种情况,适合有一点基础,刚入门的人。
在写状态方程时如何加入状态方程中的已知输入量。就是如方程
xhat=Ax+Bu,
y=Cx+Du
中假如A=[1 2;3 4],那么有很多时候A=[m f;q w],是这样的形式出现,网上的S函数的例子也没有相关的,让人一下摸不着头脑,虽然这个对于熟悉的人来说很简单,但是对于没有基础的人来说很难。废话不多说,下面是例子。
下图中,上面的是没有外部参数的,下面是有外部参数的。
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给出的值一样,懒得改了,但是大概意思就是这样,
最后
以上就是搞怪板栗为你收集整理的S函数(基础1)的全部内容,希望文章能够帮你解决S函数(基础1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复