大家好,欢迎来到IT知识分享网。
在学习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给出的值一样,懒得改了,但是大概意思就是这样,
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117748.html
