日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 循环神经网络 >内容正文

循环神经网络

matlab/simulink中带参数的S-Function(S函数)的写法

發(fā)布時(shí)間:2023/12/9 循环神经网络 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab/simulink中带参数的S-Function(S函数)的写法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

S函數(shù)的相關(guān)概念與寫(xiě)法,直接在幫助文件中搜:【MATLAB S-Functions Create custom blocks defined】、【S-Function Concepts】等

?

S函數(shù)模塊可以從下圖中拖出來(lái):

圖 1

其中S-Function是正宗的S函數(shù)模塊,旁邊還有一個(gè)S-Function builder是給新手用的,只要學(xué)會(huì)了S函數(shù)模塊,S builder模塊自然一看就懂。

使用S函數(shù)模塊的步驟:①寫(xiě)S函數(shù)的.m文件, 并把m文件所在的文件夾加入搜索路徑,如下圖2所示。②在simulink中拖出S函數(shù),并填上m文件的名字,如果有參數(shù)(下文會(huì)講到),也把參數(shù)名填上,如下圖3所示。然后就可以執(zhí)行仿真了

圖2

圖3

?

下面是最關(guān)鍵的部分,如何寫(xiě)S函數(shù):

寫(xiě)S函數(shù)的本質(zhì)就是寫(xiě)一堆回調(diào)函數(shù),C/C++程序員對(duì)回調(diào)函數(shù)應(yīng)該很熟悉了,既然是回調(diào)函數(shù),那寫(xiě)之前必須要知道形參和返回值的格式,這個(gè)格式從哪查?直接在matlab命令行執(zhí)行:?edit sfuntmpl,就直接打開(kāi)了官方提供的模板,連格式都不用查了,直接仿照官方模板把函數(shù)體改改蓋就行了,方便。

(1)S函數(shù)的總函數(shù)

把官方模板的代碼拷到一個(gè)新文件里,并命名為自定義名稱,我取的名字是oneOrderModule.m,然后把函數(shù)名也改成和文件名相同,我的是這樣的:function [sys,x0,str,ts,simStateCompliance] = oneOrderModule(t,x,u,flag, T)

我與官方版不同的是,自己加了一個(gè)參數(shù)T,如果你還想添加更多參數(shù),直接在形參表里添加就行了。添加的形參的實(shí)參值,來(lái)自于圖3的第二個(gè)輸入框,這個(gè)輸入框可填常量,也可以填工作區(qū)變量名。

形參:①當(dāng)前的仿真時(shí)間t,單位為秒,該參數(shù)可以用來(lái)描述變參數(shù)系統(tǒng),例如你想實(shí)現(xiàn)【在t>2S時(shí),把系統(tǒng)增益給改掉】這一功能,就可以通過(guò)判定t的值來(lái)實(shí)現(xiàn);②x為狀態(tài)列向量;③輸入列向量u;④flag為當(dāng)前狀態(tài)機(jī)的第幾步,例如實(shí)參送進(jìn)來(lái)的flag=0代表S函數(shù)需要初始化,flag=1代表要更新連續(xù)狀態(tài)

返回值:在不同的狀態(tài)步下(也即flag不同時(shí)),返回值的意義是不同的,在模板文件的注釋中都講到了:

例如flag=0時(shí),需要返回:輸入輸出狀態(tài)變量等的大小SIZES、狀態(tài)變量的初值X0等。。。
又如flag=3時(shí),返回值sys代表輸出向量Y,也即狀態(tài)空間表達(dá)式第2式,Y=CX+DU

不同flag下返回值得寫(xiě)法,將在下面的各個(gè)函數(shù)中依次講解

(2)系統(tǒng)初始化

當(dāng)我么在函數(shù)中檢測(cè)到flag=0時(shí),意味著simulnk需要我們返回系統(tǒng)初始化的一些信息。
實(shí)際上,我們可以直接把flag=0時(shí)需要執(zhí)行的代碼直接寫(xiě)在switch-case中,但是為了使程序更清晰,我們也仿照官方模板,在case中調(diào)用初始化函數(shù)mdlInitializeSizes,我們把代碼寫(xiě)在初始化函數(shù)中。

function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizessizes = simsizes;sizes.NumContStates = 1;%連續(xù)狀態(tài)向量的元素?cái)?shù)目 sizes.NumDiscStates = 0;%離散狀態(tài)向量的元素?cái)?shù)目 sizes.NumOutputs = 2;%輸出向量的元素?cái)?shù)目 sizes.NumInputs = 1;%輸入向量的元素?cái)?shù)目 sizes.DirFeedthrough = 1;%輸入是否直接饋通到輸出 sizes.NumSampleTimes = 1; % 采樣時(shí)間矩陣的行數(shù)(必須設(shè)為>=1),另外列數(shù)固定為2,無(wú)需設(shè)置sys = simsizes(sizes);%把以上賦值好的結(jié)構(gòu)賦給返回值 x0 = [0];%設(shè)置狀態(tài)向量的初值 str = [];%保留參數(shù),不用管 ts = [0 0];%采樣時(shí)間設(shè)置,必須為mx2維度,其中m為上面sizes.NumSampleTimes的值 simStateCompliance = 'UnknownSimState';

此函數(shù)中,按照回調(diào)函數(shù)的要求,sys的返回要返回一些成員的尺寸大小,我們可以一個(gè)個(gè)為sys(1)、sys(2)。。等依次賦值,但我們不會(huì)這么做,因?yàn)楣俜侥0鍨槲覀兲峁┝艘粋€(gè)輔助數(shù)據(jù)結(jié)構(gòu)的實(shí)體simsizes,直接把他復(fù)制出來(lái)把成員值改好,再賦值給返回值sys即可。simsizes的成員有6個(gè),其中有2個(gè)需要單獨(dú)講一下:

①直接饋通標(biāo)志DirFeedthrough,這個(gè)東西實(shí)際上就是看看狀態(tài)空間表達(dá)式第2式Y(jié)=CX+DU中的D矩陣是否為0矩陣,如果不是,那我們必須把饋通標(biāo)志設(shè)為1。從回調(diào)函數(shù)來(lái)看,只要我們把DirFeedthrough設(shè)成了1,那么當(dāng)flag=3時(shí),系統(tǒng)會(huì)把t、u兩個(gè)參數(shù)傳進(jìn)總函數(shù)oneOrderModule中,如果DirFeedthrough設(shè)成了0,那么當(dāng)flag=3時(shí),我們?cè)趏neOrderModule函數(shù)或者mdlOutputs函數(shù)中中將無(wú)法讀到t的值(實(shí)際讀出來(lái)總是0),也無(wú)法讀到u的值(實(shí)際讀出來(lái)總是一個(gè)只含Nan元素的向量)。

②采樣時(shí)間矩陣的行數(shù)NumSampleTimes
這個(gè)東西有些復(fù)雜,從直觀上看,它決定了【采樣時(shí)間矩陣ts】的行數(shù),ts矩陣是NumSampleTimes行2列的矩陣。ts的每一行均包含一個(gè)數(shù)據(jù)對(duì):[ 采樣時(shí)間? ?偏移量 ],這些數(shù)據(jù)對(duì)不是亂填的,可選就這么幾種形式:

采樣時(shí)間可以理解為采樣周期,真正的采樣時(shí)刻=n*周期+偏移量。
對(duì)于連續(xù)系統(tǒng),采樣時(shí)間應(yīng)設(shè)為0,matlab也提供宏CONTINUOUS_SAMPLE_TIME,該宏的值=0。
對(duì)于固定步長(zhǎng)的離散系統(tǒng),可以直接設(shè)置采樣間隔和偏移,形如:[ 0.1? ?0.02 ]
對(duì)于變步長(zhǎng)的離散系統(tǒng),可以設(shè)置為:[VARIABLE_SAMPLE_TIME,? 0.0],這種參數(shù)需要同時(shí)把simulink求解器solver設(shè)置成變步長(zhǎng)的。
繼承前一模塊的采樣點(diǎn),可以設(shè)置為:[INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET或0]。

更多知識(shí)點(diǎn),可以搜索這幾個(gè)宏名來(lái)學(xué)習(xí)。

?

(3)連續(xù)系統(tǒng)更新、離散系統(tǒng)更新

這兩個(gè)函數(shù)分別為mdlDerivatives和mdlUpdate,如果需要支持自定義的參數(shù),那么直接修改函數(shù)的形參表即可,在我的例子中,我附加了一個(gè)T參數(shù),那么我的連續(xù)系統(tǒng)更新函數(shù)是這樣的:

function sys=mdlDerivatives(t,x,u, T) A = [-1/T]; B = [1/T]; sys = A*x+B*u;

原理是這樣的,典型一階系統(tǒng)的微分方程:

如果系統(tǒng)中存在離散狀態(tài),那么就在mdlUpdate中寫(xiě)出離散狀態(tài)空間表達(dá)式即可,如果沒(méi)有離散狀態(tài),就直接sys返回空矩陣。

(4)輸出函數(shù)

function sys=mdlOutputs(t,x,u) C = [1 1]; D = [01];sys = C * x + D * u; %sys = [x t];

這個(gè)也沒(méi)啥好說(shuō)的,描述一下輸出向量即可。不過(guò)提醒一下,如果使用了 u或t 參數(shù),不要忘記把饋通標(biāo)志置1,否則在本函數(shù)中收不到t和u的實(shí)參值。

這個(gè)函數(shù)描述了兩個(gè)輸出: y(1)=x,y(2)=x+u

?

?

下面看一下仿真結(jié)果:

和預(yù)想的一樣,沒(méi)毛病。

總結(jié)

以上是生活随笔為你收集整理的matlab/simulink中带参数的S-Function(S函数)的写法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。