資源描述:
《matlab中如何編寫(xiě)s函數(shù).docx》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、函數(shù)是systemFunction的簡(jiǎn)稱,用它來(lái)寫(xiě)自己的simulink模塊。???????可以用matlab、C、C++、Fortran、Ada等語(yǔ)言來(lái)寫(xiě),這兒我只介紹怎樣用matlab語(yǔ)言來(lái)寫(xiě)吧(主要是它比較簡(jiǎn)單)。先講講為什么要用s函數(shù),我覺(jué)得用s函數(shù)可以利用matlab的豐富資源,而不僅僅局限于simulink提供的模塊,而用c或c++等語(yǔ)言寫(xiě)的s函數(shù)還可以實(shí)現(xiàn)對(duì)硬件端口的操作,還可以操作windowsAPI等的。先介紹一下simulink的仿真過(guò)程(以便理解s函數(shù)),simulink的仿真有兩個(gè)階段:一個(gè)為初始化,這個(gè)階段主要是設(shè)置一些參數(shù),像系統(tǒng)的輸入輸出個(gè)數(shù)、狀態(tài)初值、采樣時(shí)間等
2、;第二個(gè)階段就是運(yùn)行階段,這個(gè)階段里要進(jìn)行計(jì)算輸出、更新離散狀態(tài)、計(jì)算連續(xù)狀態(tài)等等,這個(gè)階段需要反復(fù)運(yùn)行,直至結(jié)束。在matlab的workspace里打editsfuntmpl(這是matlab自己提供的s函數(shù)模板),我們看它來(lái)具體分析s函數(shù)的結(jié)構(gòu)。它的第一行是這樣的:function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag).先講輸入與輸出變量的含義:t是采樣時(shí)間,x是狀態(tài)變量,u是輸入(是做成simulink模塊的輸入),flag是仿真過(guò)程中的狀態(tài)標(biāo)志(以它來(lái)判斷當(dāng)前是初始化還是運(yùn)行等);sys輸出根據(jù)flag的不同而不同(下面將結(jié)合flag來(lái)講sys的含義
3、),x0是狀態(tài)變量的初始值,str是保留參數(shù)(mathworks公司還沒(méi)想好該怎么用它,嘻嘻,一般在初始化中將它置空就可以了,str=[]),ts是一個(gè)1×2的向量,ts(1)是采樣周期,ts(2)是偏移量。下面結(jié)合sfuntmpl.m中的代碼來(lái)講具體的結(jié)構(gòu):switchflag,%判斷flag,看當(dāng)前處于哪個(gè)狀態(tài)case0,[sys,x0,str,ts]=mdlInitializeSizes;flag=0表示處于初始化狀態(tài),此時(shí)用函數(shù)mdlInitializeSizes進(jìn)行初始化,此函數(shù)在sfuntmpl.m的149行,我們找到他,在初始化狀態(tài)下,sys是一個(gè)結(jié)構(gòu)體,用它來(lái)設(shè)置模塊的一些參數(shù)
4、,各個(gè)參數(shù)詳細(xì)說(shuō)明如下size=simsizes;%用于設(shè)置模塊參數(shù)的結(jié)構(gòu)體用simsizes來(lái)生成sizes.NumContStates=0;%模塊連續(xù)狀態(tài)變量的個(gè)數(shù)sizes.NumDiscStates=0;%模塊離散狀態(tài)變量的個(gè)數(shù)sizes.NumOutputs=0;%模塊輸出變量的個(gè)數(shù)sizes.NumInputs=0;%模塊輸入變量的個(gè)數(shù)sizes.DirFeedthrough=1;%模塊是否存在直接貫通(直接貫通我的理解是輸入能%直接控制輸出)sizes.NumSampleTimes=1;%模塊的采樣時(shí)間個(gè)數(shù),至少是一個(gè)sys=simsizes(sizes);%設(shè)置完后賦給sys輸
5、出舉個(gè)例子,考慮如下模型:dx/dt=fc(t,x,u)也可以用連續(xù)狀態(tài)方程描述:dx/dt=A*x+B*ux(k+1)=fd(t,x,u)也可以用離散狀態(tài)方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u)也可以用輸出狀態(tài)方程描述:y=C*x+D*u設(shè)上述模型連續(xù)狀態(tài)變量、離散狀態(tài)變量、輸入變量、輸出變量均為1個(gè),我們就只需改上面那一段代碼為:(一般連續(xù)狀態(tài)與離散狀態(tài)不會(huì)一塊用,我這兒是為了方便說(shuō)明)sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不
6、變。繼續(xù)在mdlInitializeSizes函數(shù)中往下看:x0=[];%狀態(tài)變量設(shè)置為空,表示沒(méi)有狀態(tài)變量,以我們上面的假設(shè),可改為x0=[0,0](離散和連續(xù)的狀態(tài)變量我們都設(shè)它初值為0)str=[];%這個(gè)就不用說(shuō)了,保留參數(shù)嘛,置[]就可以了,反正沒(méi)什么用,可能7.0會(huì)給它一些意義ts=[00];%采樣周期設(shè)為0表示是連續(xù)系統(tǒng),如果是離散系統(tǒng)在下面的mdlGet%TimeOfNextVarHit函數(shù)中具體介紹。嘻嘻,總算講完了初始化,后面的應(yīng)該快了在sfuntmpl的106行繼續(xù)往下看:case1,sys=mdlDerivatives(t,x,u);flag=1表示此時(shí)要計(jì)算連續(xù)狀態(tài)的
7、微分,即上面提到的dx/dt=fc(t,x,u)中的dx/dt,找到mdlDerivatives函數(shù)(在193行)如果設(shè)置連續(xù)狀態(tài)變量個(gè)數(shù)為0,此處只需sys=[];就可以了(如sfuntmpl中一樣),按我們上述討論的那個(gè)模型,此處改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u%我們這兒x(1)是連續(xù)狀態(tài)變量,而x(2)是離散的,這兒只用到連續(xù)的,此時(shí)的輸出sys就是微分繼續(xù)