撒
function [sys,x0,str,ts] = SecondOrderSystem(t,x,u,flag,zeta,wn) switch flag case 0 [sys,x0,str,ts] = mdlInitializeSizes; % initialize block case 1 sys = mdlDerivatives(t,x,u,zeta,wn); % define xdot=f(t,x,u) % case 2 沒有,例程中沒有差分方程 case 3 sys = mdlOutputs(t,x,u,wn); % define xup=h(t,x,u) otherwise sys=[]; end %========================================================================== function [sys,x0,str,ts] = mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 2; % 連續狀態變量的個數 sizes.NumDiscStates = 0; sizes.NumOutputs = 1; % 輸出變量的個數 sizes.NumInputs = 1; % 輸入變量的個數 sizes.DirFeedthrough = 0; % 輸入是否前饋到輸出,是=1,否=0 sizes.NumSampleTimes = 1; % 采樣時間 sys = simsizes(sizes); x0 = [0; 0]; % 狀態初值 str = []; % 設置一個空矩陣str,功能未知 ts = [0 0]; % 時間初始化 [period; offset], period=0指連續時間,offset=0指系統從0時刻開始 %========================================================================== function xdot = mdlDerivatives(t,x,u,zeta,wn) xdot(1) = -2 * zeta * wn * x(1) - wn^2 * x(2) + u; xdot(2) = x(1); %========================================================================== function y = mdlOutputs(t,x,u,wn) y = wn^2 * x(2);
以上是一個標准的2階系統的S-Function的m.file
對於傳遞函數要先轉化成狀態方程形式,參見《現代控制理論》能控標准型和能觀標准型部分
在Simulink中調用 S-Function,位置在 Simulink / User-Defined Function
Parameters中填入的是自己定義的 Zeta,wn這兩個變量,其他的如 t , x , u ,flag 這些是系統默認調用參數,不用填;
第三行 module 中只有在調用C語言編寫的文件時才填,否則空着。(C語言文件后面補充,目前建模沒用到)
傳遞函數G(s) 位置在 Simulink / Continuous / Transfer Function
沖擊函數delta 位置在 Simulink / Source / Pulse Generator