結合:【Matlab】簡單的滑模控制程序及Simulink仿真本片文章觀看,此篇文章是在這篇文章的基礎上進行修改的
輸出u的推導過程
如果不明白控制量輸出u的推到過成請看:【控制理論】滑模控制最強解析這篇文章
根據推到結果寫s—function函數
控制器的s-function
function [sys,x0,str,ts] = simple_adaptive_controller(t, x, u, flag) switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; % 調用初始化子函數 case 1, sys=[]; case 2, sys=[]; case 3, sys=mdlOutputs(t,x,u); %計算輸出子函數 case 4, sys=[]; %計算下一仿真時刻子函數 case 9, sys=[]; %終止仿真子函數 otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化子函數 sizes = simsizes; sizes.NumContStates = 0; %連續狀態變量個數 sizes.NumDiscStates = 0; %離散狀態變量個數 sizes.NumOutputs = 1; %輸出變量個數 sizes.NumInputs = 5; %輸入變量個數 sizes.DirFeedthrough = 1; %輸入信號是否在輸出端出現 sizes.NumSampleTimes = 0; % at least one sample time is needed sys = simsizes(sizes); x0 = []; %初始值 str = []; ts = []; %[0 0]用於連續系統,[-1 0]表示繼承其前的采樣時間設置 simStateCompliance = 'UnknownSimState'; function sys=mdlOutputs(t,x,u) %計算輸出子函數 J = 2; thd = u(1); dthd = u(4); ddthd = u(5); th = u(2); dth = u(3); e = th - thd; de = dth; c = 10; s = c*e + de; xite = 1.1; k = 0; ut = J*-c*(dth - dthd)-J*xite*sign(s) - J*ddthd ; sys(1) = ut;
模型狀態方程的s-function函數建立
function [sys,x0,str,ts] = plant(t, x, u, flag) switch flag, case 0, [sys,x0,str,ts]=mdlInitializeSizes; % 調用初始化子函數 case 1, sys=mdlDerivatives(t,x,u); %調用計算微分子函數 case 2, sys=[]; case 3, sys=mdlOutputs(t,x,u); %計算輸出子函數 case 4, sys=[]; %計算下一仿真時刻子函數 case 9, sys=[]; %終止仿真子函數 otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化子函數 sizes = simsizes; sizes.NumContStates = 2; %連續狀態變量個數 sizes.NumDiscStates = 0; %離散狀態變量個數 sizes.NumOutputs = 2; %輸出變量個數 sizes.NumInputs = 1; %輸入變量個數 sizes.DirFeedthrough = 0; %輸入信號是否在輸出端出現 sizes.NumSampleTimes = 1; % at least one sample time is needed sys = simsizes(sizes); x0 = [0, 0]; %初始值 str = []; ts = [0 0]; %[0 0]用於連續系統,[-1 0]表示繼承其前的采樣時間設置 simStateCompliance = 'UnknownSimState'; function sys = mdlDerivatives(t, x, u) %計算微分子函數 J = 2; dt = sin(t); ut = u(1); sys(1) = x(2); sys(2) = 1/J*(ut+dt); function sys=mdlOutputs(t,x,u) %計算輸出子函數 sys(1) = x(1); sys(2) = x(2);
simulink模型
最終圖像
藍色是追蹤角度thea曲線
黃色是sin曲線
橘紅色是dthea曲線