S函数(基础1)
? ? ? ? 在學習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給出的值一樣,懶得改了,但是大概意思就是這樣,
?
總結
- 上一篇: MyBatisPlus怎么忽略映射字段
- 下一篇: poj 1182