function [sys,x0,str,ts,simStateCompliance] = int_hyo(t,x,u,flag) switch flag, case 0, [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes; 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:blocks:unhandledFlag', num2str(flag)); end function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 1; sizes.NumDiscStates = 0; sizes.NumOutputs = 1; sizes.NumInputs = 1; sizes.DirFeedthrough = 0; sizes.NumSampleTimes = 1; % at least one sample time is needed sys = simsizes(sizes); x0 = [-1]; %之前這里是0,改為1,應為x0代表-cos(t)在0初始時刻應該為-1 str = []; ts = [0 0]; simStateCompliance = 'UnknownSimState'; function sys=mdlDerivatives(t,x,u) sys = u; function sys=mdlUpdate(t,x,u) sys=[]; function sys=mdlOutputs(t,x,u) sys=x ; function sys=mdlGetTimeOfNextVarHit(t,x,u) sampleTime = 1; % Example, set the next hit to be one second later. sys = t + sampleTime; function sys=mdlTerminate(t,x,u) sys = [];
simulink模型為
圖像為
上面的x0 = [-1]; %之前這里是0,改為1,應為x0代表-cos(t)在0初始時刻應該為-1為什么這么改?
這是關於狀態變量是什么的問題(x0表示狀態變量,賦值是表示初始時刻狀態變量的值),如果狀態變量表示x = sin(t)時,這里為0,但是根據程序來看這里的狀態變量選擇的並不是x = sin(t),而是x = -cos(t),為什么這么說呢?
因為程序中調用了
function sys=mdlDerivatives(t,x,u)
sys = u;
function sys=mdlOutputs(t,x,u) sys=x ;
輸入(即sint(t))積分結果通過sys間接給了x狀態變量,x是一個表示sin(t)積分后的變量,你想想這個狀態變量到底是什么,不就是x = -cos(t)嗎?如果不明白為什么積分后間接給x狀態變量這句話,不要着急下面一篇文章能夠讓你清楚mdlDerivatives函數內部的原理
之前看到s函數那篇文章中積分這一節程序時,看到最后的圖像感覺有問題,但是不知道程序中哪個地方出錯了,主要還是不是很理解function sys=mdlDerivatives(t,x,u)的用法。看了一個博主的文章瞬間對這個子函數理解了,在這里將此博主的文章搬運過來便於閱讀
原文鏈接:https://blog.csdn.net/qq_43159983/article/details/104644017
Matlab S函數 function sys=mdlDerivatives(t,x,u)
設函數為 h’’ = 1/J*(ut+dt)
1 s函數里 的x狀態含義:
狀態1: x(1) —表示狀態值h
狀態2: x(2) —表示狀態值的導數(或稱速度)h’
2 function sys=mdlDerivatives(t,x,u)
在控制系統中,該函數可用於描述微分方程,例如描述被控對象和自適應率等,並采用數值分析方法(如ODE方法)實現模型的自動求解。如下:
function sys=mdlDerivatives(t,x,u) J=2; dt=sin(t); ut=u(1); sys(1)=x(2); sys(2)=1/J*(ut+dt); //注: 1/J*(ut+dt)為一個二階導函數
function sys=mdlOutputs(t,x,u) sys(1)=x(1); sys(2)=x(2);
sys(1)根據x(2) 解出 函數里變量值 h ——狀態1,即x(2)積分后賦給sys(1)。
sys(2)根據二階導函數’1/J*(ut+dt)‘解出一階導數 h’ ——狀態2,即1/J*(ut+dt)積分后賦給sys(2)。
最后,sys通過中間變量x傳輸到Output的x里面。
這里和simulink中的積分模塊做下對比
simulink中的模型
這里1/s模塊內需要設置初始狀態為-1(也是表示的-cos(t)初始時刻的值)
圖像結果