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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MATLAB/simulink_S函数

發布時間:2023/12/9 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MATLAB/simulink_S函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

S函數是simulink動態系統的核心,可以采用m代碼,C,C++等語言編寫S函數,由一種特定的語法構成,用來描述并實現連續系統,離散系統以及復合系統等動態系統。S函數可以接收來自simulink求解器的相關信息,并對求解器發出的命令做出適當的響應

基礎知識

simulink

simulink是MATLAB中的可視化仿真工具,基于MATLAB采用框圖方式實現動態系統建模、仿真和分析的過程。每個simulink模塊都有三個基本元素:輸入向量,狀態向量和輸出向量。分別用u,x,y表示。

其中狀態向量最為重要,可以分為連續狀態,離散狀態或兩者混合狀態,實際運用中多用離散狀態。

simulink的仿真過程包含兩個主要階段:初始化運行階段,初始化主要是設置一些基本參數,如系統輸入輸出個數,狀態初值,采樣時間等;運行階段主要是計算輸出,更新離散狀態,計算連續狀態等;
對系統仿真控制是通過系統模型與求解器之間建立對話的方式進行,simulink將系統模型、模塊參數和系統方程傳遞給simulink求解器,求解器將計算出的系統狀態與仿真時間通過simulink傳遞給系統模型本身,通過這樣的交互作用方式完成動態系統仿真。

S函數

過零

動態系統仿真過程中,過零是指系統模型中的信號或系統模型特征的某種改變,包括:1)信號在上一個仿真時間步長之內改變了符號。2)系統模塊在上個仿真時間步長改變了模式。對于離散模塊及其產生的離散信號不需要進行過零檢測

直接饋通(direct feedthrough)

直接饋通:表示系統的輸出可變采樣時間是否受輸入控制
在編寫S-函數時,初始化函數中需要對sizes.DirFeedthrough 進行設置,如果輸出函數mdlOutputs或者對于變采樣時間的(mdlGetTimeOfNextVarHit)是輸入u的函數,則模塊具有直接饋通的特性sizes.DirFeedthrough=1;否則為0。

S-Function建立

1.通過在simulink中雙擊空白處輸入s function,回車確認,添加s函數,打開空白文件

2.通過library Browser打開,找到s-function examples,打開模板文件,更改函數名字與文件名字一致,另存為xiuMS

S函數模板文件詳解

function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag) %主函數 %主函數包含四個輸出: % sys數組包含某個子函數返回的值(根據flag不同而不同) % x0為所有狀態的初始化向量 % str是保留參數,總是一個空矩陣(一般置空即可) % Ts返回系統采樣時間(是一個1x2的向量,ts(1)是采樣周期,ts(2)是偏移量 %函數的四個輸入分別為采樣時間t、狀態x、輸入u和仿真流程控制標志變量flag(判斷當前狀態) %輸入參數后面還可以接續一系列的附帶參數simStateCompliance %% switch flag,case 0,[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;% flag=0,表示當前處于初始化狀態,此時調用函數mdlInitializeSizes進行初始化,具體見下面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);otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));end %主函數結束 %下面是各個子函數,即各個回調過程 function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化回調子函數 %提供狀態、輸入、輸出、采樣時間數目和初始狀態的值 %初始化階段,標志變量flag首先被置為0,S-function首次被調用時 %該子函數首先被調用,且為S-function模塊提供下面信息 %該子函數必須存在 sizes = simsizes;%生成sizes數據結構,信息被包含在其中 sizes.NumContStates = 0;%連續狀態數,默認為0 sizes.NumDiscStates = 0;%離散狀態數,默認為0 sizes.NumOutputs = 0;%輸出個數,默認為0 sizes.NumInputs = 0;%輸入個數,默認為0 sizes.DirFeedthrough = 1;%是否存在直饋通道,1存在,0不存在 sizes.NumSampleTimes = 1;%采樣時間個數,至少是一個 sys = simsizes(sizes);%返回size數據結構所包含的信息 x0 = [];%設置初始狀態 str = [];%保留變量,置空即可 ts = [0 0];%設置采樣時間,若采樣周期設為0,則為連續系統 simStateCompliance = 'UnknownSimState';function sys=mdlDerivatives(t,x,u)%計算導數回調子函數(計算連續狀態的微分) %給定t,x,u計算連續狀態的導數,可以在此給出系統的連續狀態方程 %該子函數可以不存在 sys = [];%sys表示狀態導數,即dxfunction sys=mdlUpdate(t,x,u)%狀態更新回調子函數(計算下一個離散狀態) %給定t、x、u計算離散狀態的更新 %每個仿真步內必然調用該子函數,不論是否有意義 %除了在此描述系統的離散狀態方程外,還可以在此添加其他每個仿真步內都必須執行的代碼 sys = [];%sys表示下一個離散狀態,即x(k+1)function sys=mdlOutputs(t,x,u)%計算輸出回調函數,給定t,x,u計算輸出,可以在此描述系統的輸出方程 %該子函數必須存在 sys = [];%sys表示輸出,即yfunction sys=mdlGetTimeOfNextVarHit(t,x,u)%計算下一個采樣時間,僅在系統是變采樣時間系統時調用 sampleTime = 1; %設置下一次采樣時間是在1s以后 sys = t + sampleTime;%sys表示下一個采樣時間點function sys=mdlTerminate(t,x,u)%仿真結束時要調用的回調函數 %在仿真結束時,可以在此完成仿真結束所需的必要工作 sys = [];

s函數控制流程圖

實例

以S函數完成對輸入信號運算:y=2u\ y=2 u?y=2u
在模板文件中只需將輸入輸出改為1,在回調函數mdlOutputs中輸入狀態方程 sys=2?u\ sys=2*u?sys=2?u即可

function [sys,x0,str,ts,simStateCompliance] = xiuMS(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);otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = 1; sizes.NumInputs = 1; sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; % at least one sample time is needed sys = simsizes(sizes); x0 = []; str = []; ts = [0 0]; simStateCompliance = 'UnknownSimState'; function sys=mdlDerivatives(t,x,u) sys = []; function sys=mdlUpdate(t,x,u) sys = []; function sys=mdlOutputs(t,x,u) sys = 2*u; 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框圖,得到仿真結果

總結

以上是生活随笔為你收集整理的MATLAB/simulink_S函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。