一、Simulink 系統(tǒng)仿真實(shí)例
- 下面的應(yīng)用實(shí)例我們將分別采用不同建模方法為系統(tǒng)建模并仿真。
- 例如,有初始狀態(tài)為 0 的二階微分方程 x ′ ′ + 0.2 x ′ + 0.4 x = 0.2 u ( t ) x''+0.2x'+0.4x=0.2u(t) x′′+0.2x′+0.4x=0.2u(t),其中 u ( t ) u(t) u(t) 是單位階躍函數(shù),對此我們嘗試建立系統(tǒng)模型并仿真 。
1. 方法一
- 我們利用 Integrator(積分器)模塊直接構(gòu)造求解微分方程的模型。
- 我們將原微分方程改寫為 x ′ ′ = 0.2 u ( t ) ? 0.2 x ′ ? 0.4 x x''=0.2u(t)-0.2x'-0.4x x′′=0.2u(t)?0.2x′?0.4x
- x ′ ′ x'' x′′ 經(jīng)積分作用得 x ‘ x‘ x‘, x ′ x' x′ 再經(jīng)積分模塊作用就得 x x x,而 x ′ x' x′ 和 x x x 經(jīng)代數(shù)運(yùn)算又產(chǎn)生 x ′ ′ x'' x′′,據(jù)此可以建立系統(tǒng)模型并仿真。步驟如下。
- (1) 利用 Simulink 模塊庫中的基本模塊不難建立如下圖所示的系統(tǒng)模型。
- 模型中各個(gè)模塊說明如下。
- ① u(t) 輸入模塊:它的 Step time 被設(shè)置為 0,模塊名稱由原來的 Step 改為 u(t)。
- ② Gs 增益模塊:增益參數(shù) Gain 設(shè)置為 0.2。
- ③ Add 求和模塊:其圖標(biāo)形狀 Icon shape 設(shè)置為 rectangular,符號列表 List of signs 設(shè)置為 ±-。
- ④ Integrator 積分模塊:參數(shù)不需要改變。
- ⑤ G1 和 G2 反饋增益模塊:增益參數(shù)分別設(shè)置為 0.4 和 0.2,它們的方向翻轉(zhuǎn)可借助快捷菜單中的 Rotate & Flip ? \longrightarrow ?Flip Block 命令或模型編輯窗口的 Diagram ? \longrightarrow ?Rotate & Flip ? \longrightarrow ?Flip Block 命令實(shí)現(xiàn)。
- (2) 設(shè)置系統(tǒng)仿真參數(shù)。打開 Configuration Parameters 窗口,把仿真的終止時(shí)間設(shè)置為 20s。
- (3) 仿真操作。雙擊示波器圖標(biāo),打開示波器窗口。單擊模型編輯窗口工具欄中的 Run 按鈕,就可在示波器窗口中看到仿真結(jié)果的變化曲線,如下圖所示。
2. 方法二
- 利用傳遞函數(shù)模塊(Transfer Fcn)建模。
- 對方程 x ′ ′ + 0.2 x ′ + 0.4 x = 0.2 u ( t ) x''+0.2x'+0.4x=0.2u(t) x′′+0.2x′+0.4x=0.2u(t) 兩邊取 Laplace 變換,得 s 2 X ( s ) + 0.2 s X ( s ) + 0.4 X ( s ) = 0.2 U ( s ) s^{2}X(s)+0.2sX(s)+0.4X(s)=0.2U(s) s2X(s)+0.2sX(s)+0.4X(s)=0.2U(s)
- 經(jīng)整理得傳遞函數(shù) G ( s ) = X ( s ) U ( s ) = 0.2 s 2 + 0.2 s + 0.4 G(s)=\frac{X(s)}{U(s)}=\frac{0.2}{s^{2}+0.2s+0.4} G(s)=U(s)X(s)?=s2+0.2s+0.40.2?
- 在 Continuous 模塊庫中有標(biāo)準(zhǔn)的傳遞函數(shù)(Transfer Fcn)模塊可供調(diào)用,于是,就可以構(gòu)建求解微分方程的模型并仿真。根據(jù)系統(tǒng)傳遞函數(shù)構(gòu)建如下圖所示的仿真模型。
- 模型中各個(gè)模塊說明如下。
- (1) u(t) 模塊:設(shè)置 Step time 為 0。
- (2) G(S) 模塊:雙擊 Transfer Fcn 模塊,打開參數(shù)設(shè)置對話框,在 Numerator coefficients 文本框中輸入傳遞函數(shù)的分子多項(xiàng)式系數(shù) [0.2],在 Denominator coefficients 文本框中輸入傳遞函數(shù)的分母多項(xiàng)式的系數(shù) [1,0.2,0.4],如下圖所示。
- 以后的操作與方法 1 相同。
3. 方法三
- 利用狀態(tài)方程模塊(State-Space)建模。
- 若令 x 1 = x x_{1}=x x1?=x, x 2 = x ′ x_{2}=x' x2?=x′,那么微分方程 x ′ ′ + 0.2 x ′ + 0.4 x = 0.2 u ( t ) x''+0.2x'+0.4x=0.2u(t) x′′+0.2x′+0.4x=0.2u(t) 可寫成 x ′ = [ x 1 ′ x 2 ′ ] = [ 0 1 ? 0.4 ? 0.2 ] [ x 1 x 2 ] + [ 0 0.2 ] u ( t ) x'=\begin{bmatrix}x^{'}_{1} \\x^{'}_{2} \end{bmatrix}=\begin{bmatrix} 0&1 \\ -0.4&-0.2 \end{bmatrix}\begin{bmatrix}x_{1} \\x_{2} \end{bmatrix}+\begin{bmatrix}0 \\0.2 \end{bmatrix}u(t) x′=[x1′?x2′??]=[0?0.4?1?0.2?][x1?x2??]+[00.2?]u(t)
- 寫成狀態(tài)方程為 { x ′ = A x + B u y = C x + D u \left\{\begin{matrix}x^{'}=Ax+Bu \\y=Cx+Du \end{matrix}\right. {x′=Ax+Buy=Cx+Du?
- 式中, A = [ 0 1 ? 0.4 ? 0.2 ] A=\begin{bmatrix} 0&1 \\ -0.4 &-0.2 \end{bmatrix} A=[0?0.4?1?0.2?], B = [ 0 ? 0.2 ] B=\begin{bmatrix} 0 \\ -0.2 \end{bmatrix} B=[0?0.2?], C = [ 1 0 ] C=\begin{bmatrix} 1&0 \end{bmatrix} C=[1?0?], D = 0 D=0 D=0。
- 在 Continuous 模塊庫中有標(biāo)準(zhǔn)的狀態(tài)方程(State-Space)模塊可供調(diào)用,于是,就可以構(gòu)建求解微分方程的模型并仿真。根據(jù)系統(tǒng)狀態(tài)方程構(gòu)建如下圖所示的仿真模型。
- 模型中各個(gè)模塊說明如下:
- (1) u(t) 輸入模塊:它的 Step time 被設(shè)置為 0。
- (2) State-Space 模塊:A、B、C、D 各文本框中依次輸入 [0,1;-0.4,-0.2]、[0;0.2]、[1,0] 和 0,如下圖所示。
- 后面的操作與方法 1 相同。
二、S 函數(shù)的設(shè)計(jì)與應(yīng)用
- S 函數(shù)用于開發(fā)新的 Simulink 通用功能模塊,是一種對模塊庫進(jìn)行擴(kuò)展的工具。S 函數(shù)可以采用 MATLAB 語言以及 C、C++、FORTRAN 等語言編寫。
- 在 S 函數(shù)中使用文本方式輸入公式、方程,非常適合復(fù)雜動態(tài)系統(tǒng)的數(shù)學(xué)描述,并且在仿真過程中可以對仿真進(jìn)行更精確的控制。
- S 函數(shù)稱為系統(tǒng)函數(shù)(System Function),采用非圖形化的方式描述功能模塊。
- MATLAB 語言編寫的 S 函數(shù)可以充分利用 MATLAB 所提供的豐富資源,方便地調(diào)用各種工具箱函數(shù)和圖形函數(shù)使用;
- C 語言編寫的 S 函數(shù)可以實(shí)現(xiàn)對操作系統(tǒng)的訪問,如實(shí)現(xiàn)與其他進(jìn)程的通信和同步等。
- 非 MATLAB 語言編寫的 S 函數(shù)需要用編譯器生成 MEX 文件。
1. 用 MATLAB 語言編寫 S 函數(shù)
- S 函數(shù)有固定的程序格式,可以從 Simulink 提供的 S 函數(shù)模板程序開始構(gòu)建自己的 S 函數(shù)。
1.1 主程序
- S 函數(shù)主程序的引導(dǎo)語句如下:
function [sys,x0,str,ts]=fname(t,x,u,flag)
- 其中,fname 是 S 函數(shù)的函數(shù)名,t、x、u、flag 分別為仿真時(shí)間、狀態(tài)向量、輸入向量和子程序調(diào)用標(biāo)志。 flag 控制在仿真的各階段調(diào)用 S 函數(shù)的哪一個(gè)子程序,其含義和有關(guān)信息如下表所示。
取值 | 功能 | 調(diào)用函數(shù)名 | 返回參數(shù) |
---|---|---|---|
0 | 初始化 | mdllnitializeSizes | sys 為初始化參數(shù),x0、str、ts 如定義 |
1 | 計(jì)算連續(xù)狀態(tài)變量的導(dǎo)數(shù) | mdlDerivatives | sys 返回連續(xù)狀態(tài) |
2 | 計(jì)算離散狀態(tài)變量的更新 | mdIUpdate | sys 返回離散狀態(tài) |
3 | 計(jì)算輸出信號 | mdlOutputs | sys 返回系統(tǒng)輸出 |
4 | 計(jì)算下一個(gè)采樣時(shí)刻 | mdlGetTimeOfNextVarHit | sys 返回下一步仿真的時(shí)間 |
9 | 結(jié)束仿真任務(wù) | mdlTerminate | 無 |
- Simulink 每次調(diào)用 S 函數(shù)時(shí),必須給出這 4 個(gè)參數(shù)。sys、x0、str 和 ts 是 S 函數(shù)的返回參數(shù)。
- sys 是一個(gè)返回參數(shù)的通用符號,它得到何種參數(shù)取決于 flag 值。例如,flag=3 時(shí),sys 得到的是 S 函數(shù)的輸出向量值。
- x0 是初始狀態(tài)值,如果系統(tǒng)中沒有狀態(tài)變量,x0 將得到一個(gè)空陣。
- str 僅用于系統(tǒng)模型同 S 函數(shù) API(應(yīng)用程序編程接口)的一致性校驗(yàn)。對于 M 文件 S 函數(shù),它將被置成一個(gè)空陣。
- ts 是一個(gè)兩列矩陣,一列是 S 函數(shù)中各狀態(tài)變量的采樣周期,另一列是相應(yīng)的采樣時(shí)間的偏移量。采樣周期按遞增順序排列,ts 中的一行對應(yīng)一個(gè)采樣周期。對于連續(xù)系統(tǒng),采樣周期和偏移量都應(yīng)置成 0。如果取采樣周期為 -1,則將繼承輸入信號的采樣周期。
- 此外,在主程序輸入?yún)?shù)中還可以包括用戶自定義參數(shù)表: pl,p2,…,pn,這也就是希望賦給 S 函數(shù)的可選變量,其值通過相應(yīng) S 函數(shù)的參數(shù)對話框設(shè)置,也可以在命令行窗口賦值。
- 于是 S 函數(shù)主程序的引導(dǎo)語句可以寫成
function [sys,x0,str,ts]=fname(t,x,u,flag,pl,p2,…,pn)
- 主程序采用 switch-case 語句,引導(dǎo) Simulink 到正確的子程序。
1.2 子程序
- M 文件 S 函數(shù)共有 6 個(gè)子程序,供 Simulink 在仿真的不同階段調(diào)用,這些子程序的前綴為 mdl。
- 每一次調(diào)用 S 函數(shù)時(shí),都要給出一個(gè) flag 值,實(shí)際執(zhí)行 S 函數(shù)中與該 flag 值對應(yīng)的那個(gè)子程序。
- Simulink 在仿真的不同階段,需要調(diào)用 S 函數(shù)中不同的子程序。
- (1) 初始化子程序 mdlInitializeSizes。子程序 mdlInitializeSizes 定義 S 函數(shù)參數(shù),如采樣時(shí)間、輸入量、輸出量、狀態(tài)變量的個(gè)數(shù)以及其他特征。
- 為了向 Simulink 提供這些信息,在子程序 mdlInitializeSizes 的開始處,應(yīng)調(diào)用 simsizes 函數(shù),這個(gè)函數(shù)返回一個(gè) sizes 結(jié)構(gòu),結(jié)構(gòu)的成員 sizes.NumContStates、sizes.NumDiscStates、sizes.NumOutputs 和 sizes.NumInputs 分別表示連續(xù)狀態(tài)變量的個(gè)數(shù)、離散狀態(tài)變量的個(gè)數(shù)、輸出的個(gè)數(shù)和輸入的個(gè)數(shù)。這 4 個(gè)值可以置為 -1,使其大小動態(tài)改變。
- 成員 sizes.DirFeedthrough 是直通標(biāo)志,即輸入信號是否直接在輸出端出現(xiàn)的標(biāo)志,是否設(shè)定為直通,取決于輸出是否為輸入的函數(shù),或者取樣時(shí)間是否為輸入的函數(shù)。1 表示 yes,0 表示 no。成員 sizes.NumSampleTimes 是模塊采樣周期的個(gè)數(shù),一般取 1。
- 按照要求設(shè)置好的結(jié)構(gòu) sizes 用 sys=simsizes(sizes) 語句賦給 sys 參數(shù)。除了 sys 外,還應(yīng)該設(shè)置系統(tǒng)的初始狀態(tài)變量 x0、說明變量 str 和采樣周期變量 ts。
- (2) 其他子程序。狀態(tài)的動態(tài)更新使用 mdlDerivatives 和 mdIUpdate 兩個(gè)子程序,前者用于連續(xù)狀態(tài)的更新,后者用于離散狀態(tài)的更新。這些函數(shù)的輸出值,即相應(yīng)的狀態(tài),均由 sys 變量返回。
- 對于同時(shí)含有連續(xù)狀態(tài)和離散狀態(tài)的混合系統(tǒng),則需要同時(shí)寫出這兩個(gè)函數(shù)來分別描述連續(xù)狀態(tài)和離散狀態(tài)。
- 模塊輸出信號的計(jì)算使用 mdlOutputs 子程序,系統(tǒng)的輸出仍由 sys變量返回。
- 一般應(yīng)用中很少使用 flag 為 4 和 9 的情況,mdlGetTimeOfNextVarHit 和 mdlTerminate 兩個(gè)子程序較少使用。
2. S 函數(shù)的應(yīng)用
- 下面來看兩個(gè)簡單的 M 文件 S 函數(shù)例子。
- 例如,我們采用 S 函數(shù)實(shí)現(xiàn) y = n x y=nx y=nx,即把一個(gè)輸入信號放大 n n n 倍。
- (1) 利用 MATLAB 語言編寫 S 函數(shù),程序如下。
%****************************************
%S函數(shù)timesn.m,其輸出是輸入的n倍
%****************************************
function [sys,x0,str,ts]=timesn(t,x,u,flag,n)
switch flag
case 0
[sys,x0,str,ts]=mdlInitializeSizes; %初始化
case 3
sys=mdloutputs(t,x,u,n); %計(jì)算輸出量
case {1,2,4,9}
sys=[];
otherwise %出錯(cuò)處理
error(num2str(flag));
end
%****************************************
%mdlInitializesizes:當(dāng)flag為0時(shí)進(jìn)行整個(gè)系統(tǒng)的初始化
%******************** ********************
function [sys,x0,str,ts]=mdlInitializeSizes()
%調(diào)用函數(shù)simsizes以創(chuàng)建結(jié)構(gòu)sizes
sizes=simsizes;
%用初始化信息填充結(jié)構(gòu)sizes
sizes.NumContStates=0; %無連續(xù)狀態(tài)
sizes.NumDiscStates=0; %無離散狀態(tài)
sizes.NumOutputs=1; %有一個(gè)輸出量
sizes.NumInputs=1; %有一個(gè)輸入信號
sizes.DirFeedthrough=1; %輸出量中含有輸入量
sizes.NumSampleTimes=1; %單個(gè)采樣周期
%根據(jù)上面的設(shè)置設(shè)定系統(tǒng)初始化參數(shù)
sys=simsizes(sizes);
%給其他返回參數(shù)賦值
x0=[]; %設(shè)置初始狀態(tài)為零狀態(tài)
str=[]; %將str變量設(shè)置為空字符串
ts=[-1,0]; %假定繼承輸入信號的采樣周期
%初始化子程序結(jié)束
%****************************************
% mdlOutputs:當(dāng)flag值為3時(shí),計(jì)算輸出量
%****************************************
function sys=mdloutputs(t,x,u,n)
sys=n*u;
%輸出量計(jì)算子程序結(jié)束
- 將該程序以文件名 timesn.m 存盤。編好 S 函數(shù)后,就可以對該模塊進(jìn)行封裝和測試了。
- (2) 模塊的封裝與測試。
- ① 建立 S-Function 模塊和編寫的S函數(shù)文件之間的聯(lián)系。新建一個(gè)模型,向模型編輯窗口中添加 User-Defined Functions 子模塊庫中的 S-Function 模塊、Sine Wave 模塊和 Scope 模塊,構(gòu)建如下圖所示的仿真模型。
- 在模型編輯窗口中雙擊 S-Function 模塊打開如下圖所示的參數(shù)對話框,在 S-functionname 編輯框中輸入 S 函數(shù)名 timesn 在 S-function parameters 編輯框中輸入外部參數(shù) n。
- n 可以在 MATLAB 工作空間中用命令定義。如果有多個(gè)外部參數(shù),參數(shù)之間用逗號分隔。
- ② 模型封裝。其具體操作與子系統(tǒng)的封裝類似。在模型編輯窗口選中 S-Function 模塊,再選擇 Diagram ? \longrightarrow ?Mask ? \longrightarrow ?Create Mask 命令,或按 Ctrl+M 鍵,打開封裝編輯器,選擇 Parameters & Dialog 選項(xiàng)卡,在左側(cè)控件工具箱中單擊 Edit 工具,往中間的 Dialog box 區(qū)域的控件列表中添加編輯框控件 #1,選中該控件后,在右側(cè)的 Property editor 區(qū)域中,在 Name 欄輸入 n,Prompt 欄輸入 “放大倍數(shù)”,勾選 Evaluate 復(fù)選框,具體如下圖所示。
- 設(shè)置完成后單擊 OK 按鈕。S 函數(shù)模塊被封裝后,雙擊它,則得到如下圖所示的模塊參數(shù)對話框。
- 當(dāng)輸入 n 的值為 10 時(shí),得到的仿真結(jié)果如下圖所示。
- 例如,我們采用 S 函數(shù)構(gòu)造非線性分段函數(shù) y = { 3 x x < 1 3 1 ≤ x < 3 3 ? ( x ? 3 ) 2 3 ≤ x < 4 2 4 ≤ x < 5 2 ? ( x ? 5 ) 2 5 ≤ x < 6 1 x ≥ 6 y=\left\{\begin{matrix} 3\sqrt{x}& x< 1\\ 3 & 1\le x< 3\\ 3-(x-3)^{2} &3\le x< 4 \\ 2 & 4\le x< 5\\ 2-(x-5)^{2} & 5\le x< 6\\ 1 &x\ge 6 \end{matrix}\right. y=? ? ??3x?33?(x?3)222?(x?5)21?x<11≤x<33≤x<44≤x<55≤x<6x≥6?。
- (1) 利用 MTALAB 語言編寫 S 函數(shù),程序如下:
function [sys,x0,str,ts]=sfunction(t,x, u,flag)
switch flag
case 0
[sys,x0,str,ts]=mdlInitializeSizes;
case 3
sys=mdlOutputs(t,x,u);
case {1,2,4,9}
sys=[];
otherwise
error(['Unhandled flag=',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[];
str=[];
ts=[0,0];
function sys=mdlOutputs(t,x,u)
if u<1
sys=3*sqrt(u);
elseif u>=1&&u<3
sys=3;
elseif u>=3&&u<4
sys=3-(u-3)^2;
elseif u>=4&&u<5
sys=2;
elseif u>=5&&u<6
sys=2-(u-5)^2;
else
sys=1;
end
- 將該程序以文件名 sfunction.m 存盤。
- (2) 模塊的測試。向模型編輯窗口中添加 S-Function 模塊,并在其參數(shù)設(shè)置對話框中輸入 M 文件名 sfunction,構(gòu)建如下圖所示的仿真模型。
文章來源:http://www.zghlxwxcb.cn/news/detail-535217.html
- 運(yùn)行即可得到如下圖所示的仿真結(jié)果。
文章來源地址http://www.zghlxwxcb.cn/news/detail-535217.html
到了這里,關(guān)于MATLAB 之 Simulink 系統(tǒng)仿真實(shí)例和 S 函數(shù)的設(shè)計(jì)與應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!