S函数(基础1)
? ? ? ? 在學(xué)習(xí)S函數(shù)的時候總是發(fā)現(xiàn)按照網(wǎng)上的很多解釋每一行的意義的文章很多,但是實(shí)際操作的時候總是不知道該如何下手,所以我就不再講每一行的意義是什么,怎么用,這一節(jié)我只講下面一種情況,適合有一點(diǎn)基礎(chǔ),剛?cè)腴T的人。
? ? ? ? 在寫狀態(tài)方程時如何加入狀態(tài)方程中的已知輸入量。就是如方程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?xhat=Ax+Bu,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? y=Cx+Du
中假如A=[1 2;3 4],那么有很多時候A=[m f;q w],是這樣的形式出現(xiàn),網(wǎng)上的S函數(shù)的例子也沒有相關(guān)的,讓人一下摸不著頭腦,雖然這個對于熟悉的人來說很簡單,但是對于沒有基礎(chǔ)的人來說很難。廢話不多說,下面是例子。
下圖中,上面的是沒有外部參數(shù)的,下面是有外部參數(shù)的。
S函數(shù)代碼:
沒有外部參數(shù):
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=[];
有外部參數(shù)的:
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);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %外部輸入的值可以是常數(shù),也可以是其他,在寫代碼時容易出錯,主要是維度出問題
 M=u(4);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%維度重點(diǎn)看u這個矩陣,容易忘記轉(zhuǎn)置
 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給出的值一樣,懶得改了,但是大概意思就是這樣,
?
總結(jié)
 
                            
                        - 上一篇: MyBatisPlus怎么忽略映射字段
- 下一篇: poj 1182
