S函数(基础1)

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

大家好,欢迎来到IT知识分享网。

        在学习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给出的值一样,懒得改了,但是大概意思就是这样,

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117748.html

(0)
上一篇 2025-11-18 16:10
下一篇 2025-11-18 16:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信