當前位置:編程學習大全網 - 編程語言 - 如何用matlab編程使用ts算法實現tsd問題

如何用matlab編程使用ts算法實現tsd問題

在matlab的workspace裏打editsfuntmpl(這是matlab自己提供的s函數模板),我們看它來具體分析s函數的結構。它的第壹行是這樣的:function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)先講輸入與輸出變量的含義:t是采樣時間,x是狀態變量,u是輸入(是做成simulink模塊的輸入),flag是仿真過程中的狀態標誌(以它來判斷當前是初始化還是運行等);sys輸出根據flag的不同而不同(下面將結合flag來講sys的含義),x0是狀態變量的初始值,str是保留參數(mathworks公司還沒想好該怎麽用它,嘻嘻,壹般在初始化中將它置空就可以了,str=[]),ts是壹個1×2的向量,ts(1)是采樣周期,ts(2)是偏移量。下面結合sfuntmpl.m中的代碼來講具體的結構:switchflag,%判斷flag,看當前處於哪個狀態case0,[sys,x0,str,ts]=mdlInitializeSizes;flag=0表示處於初始化狀態,此時用函數mdlInitializeSizes進行初始化,此函數在sfuntmpl.m的149行我們找到他,在初始化狀態下,sys是壹個結構體,用它來設置模塊的壹些參數,各個參數詳細說明如下size=simsizes;%用於設置模塊參數的結構體用simsizes來生成sizes.NumContStates=0;%模塊連續狀態變量的個數sizes.NumDiscStates=0;%模塊離散狀態變量的個數sizes.NumOutputs=0;%模塊輸出變量的個數sizes.NumInputs=0;%模塊輸入變量的個數sizes.DirFeedthrough=1;%模塊是否存在直接貫通(直接貫通我的理解是輸入能%直接控制輸出)sizes.NumSampleTimes=1;%模塊的采樣時間個數,至少是壹個sys=simsizes(sizes);%設置完後賦給sys輸出舉個例子,考慮如下模型:dx/dt=fc(t,x,u)也可以用連續狀態方程描述:dx/dt=A*x+B*ux(k+1)=fd(t,x,u)也可以用離散狀態方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u)也可以用輸出狀態方程描述:y=C*x+D*u設上述模型連續狀態變量、離散狀態變量、輸入變量、輸出變量均為1個,我們就只需改上面那壹段代碼為:(壹般連續狀態與離散狀態不會壹塊用,我這兒是為了方便說明)sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不變。繼續在mdlInitializeSizes函數中往下看:x0=[];%狀態變量設置為空,表示沒有狀態變量,以我們上面的假設,可改%為x0=[0,0](離散和連續的狀態變量我們都設它初值為0)str=[];%這個就不用說了,保留參數嘛,置[]就可以了,反正沒什麽用,可%能7.0會給它壹些意義ts=[00];%采樣周期設為0表示是連續系統,如果是離散系統在下面的mdlGet%TimeOfNextVarHit函數中具體介紹嘻嘻,總算講完了初始化,後面的應該快了在sfuntmpl的106行繼續往下看:case1,sys=mdlDerivatives(t,x,u);flag=1表示此時要計算連續狀態的微分,即上面提到的dx/dt=fc(t,x,u)中的dx/dt,找到mdlDerivatives函數(在193行)如果設置連續狀態變量個數為0,此處只需sys=[];就可以了(如sfuntmpl中壹樣),按我們上述討論的那個模型,此處改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u%我們這兒x(1)是連續狀態變量,而x(2)是離散的,這兒只用到連續的,此時的輸出sys就是微分繼續,在sfuntmpl的112行:case2,sys=mdlUpdate(t,x,u);flag=2表示此時要計算下壹個離散狀態,即上面提到的x(k+1)=fd(t,x,u),找到mdlUpdate函數(在206行)它這兒sys=[];表示沒有離散狀態,我們這而可以改成sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即為x(k+1)看來後面幾個壹兩句話就可了,呵呵,在sfuntmpl的118行case3,sys=mdlOutputs(t,x,u);flag=3表示此時要計算輸出,即y=fo(t,x,u),找到mdlOutputs函數(在218行),如上,如果sys=[]表示沒有輸出,我們改成sys=fo(t,x,u)或sys=C*x+D*u%sys此時為輸出y好像快完了,嘻嘻,在sfuntmpl的124行case4,sys=mdlGetTimeOfNextVarHit(t,x,u);flag=4表示此時要計算下壹次采樣的時間,只在離散采樣系統中有用(即上文的mdlInitializeSizes中提到的ts設置ts(1)不為0)連續系統中只需在mdlGetTimeOfNextVarHit函數中寫上sys=[];這個函數主要用於變步長的設置,具體實現大家可以用editvsfunc看vsfunc.m這個例子最後壹個,在sfuntmpl的130行case9,sys=mdlTerminate(t,x,u);flag=9表示此時系統要結束,壹般來說寫上在mdlTerminate函數中寫上sys=[]就可,如果妳在結束時還要設置什麽,就在此函數中寫關於sfuntmpl這個s函數的模板講完了。s函數還可以帶用戶參數,下面給個例子,和simulink下的gain模塊功能壹樣,大夥自己看吧,我睡覺去了,累了function[sys,x0,str,ts]=sfungain(t,x,u,flag,gain)switchflag,case0,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];case3,sys=gain*u;case{1,2,4,9},sys=[];end

  • 上一篇:康佳電視內存不夠,把裏面的應用都刪除了。內存還是不夠,是什麽原因?
  • 下一篇:IE系統的問題
  • copyright 2024編程學習大全網