日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

S函数(基础1)

發布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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給出的值一樣,懶得改了,但是大概意思就是這樣,

?

總結

以上是生活随笔為你收集整理的S函数(基础1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。