資源描述:
《matlab中s函數(shù)編寫心得(轉(zhuǎn)).doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、matlab中s函數(shù)編寫心得(轉(zhuǎn))??PartI:??????所謂s函數(shù)是systemFunction的簡(jiǎn)稱,用它來(lái)寫自己的simulink模塊.s函數(shù)可以用matlab、C、C++、Fortran、Ada等語(yǔ)言來(lái)寫,這兒我只介紹怎樣用matlab語(yǔ)言來(lái)寫吧(主要是它比較簡(jiǎn)單)???先講講為什么要用s函數(shù),我覺(jué)得用s函數(shù)可以利用matlab的豐富資源,而不僅僅局限于simulink提供的模塊,而用c或c++等語(yǔ)言寫的
2、s函數(shù)還可以實(shí)現(xiàn)對(duì)硬件端口的操作,還可以操作windowsAPI等????先介紹一下simulink的仿真過(guò)程(以便理解s函數(shù)),simulink的仿真有兩個(gè)階段:一個(gè)為初始化,這個(gè)階段主要是設(shè)置一些參數(shù),像系統(tǒng)的輸入輸出個(gè)數(shù)、狀態(tài)初值、采樣時(shí)間等;第二個(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).1.函數(shù)的函數(shù)頭函數(shù)的第一行:function[
3、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的含義),x0是狀態(tài)變量的初始值,str是保留參數(shù)(mathworks公司還沒(méi)想好該怎么用它,一般在初始化中將它置空就可以了,str=[]),ts是一個(gè)1×2的向量,ts(1)是采樣周期,ts(2)是偏移量2.函數(shù)分析下面結(jié)合sfuntmpl.m中
4、的代碼來(lái)講具體的結(jié)構(gòu):???switchflag,%判斷flag,看當(dāng)前處于哪個(gè)狀態(tài)????case0,???????[sys,x0,str,ts]=mdlInitializeSizes;???//解釋說(shuō)明???flag=0表示當(dāng)前處于初始化狀態(tài),此時(shí)調(diào)用函數(shù)mdlInitializeSizes進(jìn)行初始化,此函數(shù)在該文件的第149行定義.其中的參數(shù)sys是一個(gè)結(jié)構(gòu)體,它用來(lái)設(shè)置模塊的一些參數(shù),各個(gè)參數(shù)詳細(xì)說(shuō)明如下???size=simsizes;%用于設(shè)置模塊參數(shù)的結(jié)構(gòu)體用simsizes來(lái)生成???sizes.NumContStates=0;????
5、?%模塊連續(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輸出舉個(gè)例子,
6、考慮如下模型: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.
7、NumInputs=1;其他的可以不變,繼續(xù)在mdlInitializeSizes函數(shù)中往下看:x0=[];???%狀態(tài)變量設(shè)置為空,表示沒(méi)有狀態(tài)變量,以我們上面的假設(shè),可改為x0=[0,0](離散和連續(xù)的狀態(tài)變量我們都設(shè)它初值為0)str=[];???%保留參數(shù),置[]就可以了,沒(méi)什么用ts=[00];%采樣周期設(shè)為0表示是連續(xù)系統(tǒng),如果是離散系統(tǒng)在下面的mdlGetTimeOfNextVarHit函數(shù)中具體介紹case1,sys=mdlDerivatives(t,x,u);//flag=1表示此時(shí)要計(jì)算連續(xù)狀態(tài)的微分,即上面提到的dx/dt=fc(
8、t,x,u)中的dx/dt,找到193行的函數(shù)mdlDerivatives,如果設(shè)置連續(xù)狀態(tài)變