问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

利用matlab M文件编写S函数的问题

发布网友 发布时间:2022-04-24 01:28

我来回答

5个回答

热心网友 时间:2023-10-18 13:40

1. 函数的函数头

函数的第一行: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)是偏移量

2. 函数分析

下面结合sfuntmpl.m中的代码来讲具体的结构:
switch flag, %判断flag,看当前处于哪个状态

case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
// 解释说明
flag=0表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,此函数在该文件的第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*u
x(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 = []; %保留参数, 置[]就可以了, 没什么用
ts = [0 0]; %采样周期设为0表示是连续系统, 如果是离散系统在下面的mdlGetTimeOfNextVarHit函数中具体介绍

case 1,
sys=mdlDerivatives(t,x,u);
//
flag=1表示此时要计算连续状态的微分, 即上面提到的dx/dt=fc(t,x,u)中的dx/dt, 找到193行的函数mdlDerivatives, 如果设置连续状态变量个数为0, 此处只需sys=[]就可以了, 按我们上述讨论的那个模型, 此处改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u, 我们这儿x(1)是连续状态变量, 而x(2)是离散的, 这儿只用到连续的, 此时的输出sys就是微分

case 2,
sys=mdlUpdate(t,x,u);
//
flag=2表示此时要计算下一个离散状态, 即上面提到的x(k+1)=fd(t,x,u),找到mdlUpdate函数, 它这儿sys=[]表示没有离散状态, 我们这儿可以改成sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)

case 3,
sys=mdlOutputs(t,x,u);
//
flag=3表示此时要计算输出, 即y=fo(t,x,u), 找到218行的mdlOutputs函数. 如果sys=[]表示没有输出, 我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys此时为输出y

case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
//
flag=4表示此时要计算下一次采样的时间, 只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts设置ts(1)不为0), 连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[]. 这个函数主要用于变步长的设置, 具体实现大家可以用edit vsfunc看vsfunc.m这个例子

case 9,
sys=mdlTerminate(t,x,u);
//
flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可, 如果你在结束时还要设置什么,就在此函数中写完了.

热心网友 时间:2023-10-18 13:40

双击你的S-FUNCTION模块后在s-function parameters 中填上一个确定的数,就是你要讲gain定义为的确切数字。另外,sys=mdlOutputs(t,x,u);改为sys=mdlOutputs(t,x,u,gain);

热心网友 时间:2023-10-18 13:41

所有的t x u 后面都加gain ...可以ctrl+F替换比较方便,,,你试试我是菜鸟。。刚学没多久

热心网友 时间:2023-10-18 13:41

当然要定义gain了~~~

热心网友 时间:2023-10-18 13:40

1. 函数的函数头

函数的第一行: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)是偏移量

2. 函数分析

下面结合sfuntmpl.m中的代码来讲具体的结构:
switch flag, %判断flag,看当前处于哪个状态

case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
// 解释说明
flag=0表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,此函数在该文件的第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*u
x(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 = []; %保留参数, 置[]就可以了, 没什么用
ts = [0 0]; %采样周期设为0表示是连续系统, 如果是离散系统在下面的mdlGetTimeOfNextVarHit函数中具体介绍

case 1,
sys=mdlDerivatives(t,x,u);
//
flag=1表示此时要计算连续状态的微分, 即上面提到的dx/dt=fc(t,x,u)中的dx/dt, 找到193行的函数mdlDerivatives, 如果设置连续状态变量个数为0, 此处只需sys=[]就可以了, 按我们上述讨论的那个模型, 此处改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u, 我们这儿x(1)是连续状态变量, 而x(2)是离散的, 这儿只用到连续的, 此时的输出sys就是微分

case 2,
sys=mdlUpdate(t,x,u);
//
flag=2表示此时要计算下一个离散状态, 即上面提到的x(k+1)=fd(t,x,u),找到mdlUpdate函数, 它这儿sys=[]表示没有离散状态, 我们这儿可以改成sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)

case 3,
sys=mdlOutputs(t,x,u);
//
flag=3表示此时要计算输出, 即y=fo(t,x,u), 找到218行的mdlOutputs函数. 如果sys=[]表示没有输出, 我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys此时为输出y

case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
//
flag=4表示此时要计算下一次采样的时间, 只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts设置ts(1)不为0), 连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[]. 这个函数主要用于变步长的设置, 具体实现大家可以用edit vsfunc看vsfunc.m这个例子

case 9,
sys=mdlTerminate(t,x,u);
//
flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可, 如果你在结束时还要设置什么,就在此函数中写完了.

热心网友 时间:2023-10-18 13:40

双击你的S-FUNCTION模块后在s-function parameters 中填上一个确定的数,就是你要讲gain定义为的确切数字。另外,sys=mdlOutputs(t,x,u);改为sys=mdlOutputs(t,x,u,gain);

热心网友 时间:2023-10-18 13:41

所有的t x u 后面都加gain ...可以ctrl+F替换比较方便,,,你试试我是菜鸟。。刚学没多久

热心网友 时间:2023-10-18 13:41

当然要定义gain了~~~

热心网友 时间:2023-10-18 13:42

所有输出函数改成function sys=mdlOutputs(t,x,u,gain)

热心网友 时间:2023-10-18 13:42

所有输出函数改成function sys=mdlOutputs(t,x,u,gain)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
日语鼻浊音怎么个读法,我是自学的,背完50音图之后看这个有点乱。_百度... 日语中的鼻浊音一定要发吗 日语的鼻浊音到底是什么鬼 日语 哪两行有鼻浊音? 日语里面有没有鼻浊音啊,就是"か"那一行,是否当不是句首时就读鼻... 魔兽世界奶僧和踏风武僧pve和pvp分别用什么雕文和天赋,求大神! pvp奶僧拿550双手好还是单手好 魔兽世界5.0熊猫武增要什用什么装备武器 问一下,长城4S店的销售顾问待遇怎样 慎重词语解释 matlab中S函数的编程问题 求助建立一个MATLAB中S函数的建立及用法 在matlab中如何编写多输入输出的s函数 屏幕上有条纹怎么回事? MATLAB S函数中的mdlDerivatives是怎么应用的?讲的越详细越好。 matlab中的s函数里可以调用函数吗 MATLAB中S函数问题。 matlab s函数 在MATLAB中S函数怎么生成? Matlab中的m函数,S函数,C函数都有什么区别,分别用在什么地方? ie浏览器使用出错 我的IE浏览器出错了该怎么办啊 IE浏览器出错崩溃的问题怎么解决? 为什么我的电脑浏览器功能异常,窗口布局混乱页面内容显示不正常?, 如果自己不关注过微信运动别人的微信榜上会显示自己的步数吗? ie浏览器经常出错是怎么回事 电脑上有一个插件可能导致IE功能异常,但电脑管家杀毒杀了好多次还是 电脑IE异常 IE浏览器不好用了怎么办? ie浏览器功能异常 matlab编写s函数,求解 乔司中国银行可以拉征信报告吗? Matlab中S函数怎么编写呀? 手机出现条纹,怎么回事? 关于matlab中S函数的问题 在MATLAB中用C语言编写S函数时,怎么生成动态链接库(DLL)文件 使用Matlab建立个simulink模型,其中用到 S函数,在执行时,S函数在一个步长时间周期里执行几次? MATLAB里面已知开环传递函数怎么写S函数? 3岁孩子离婚判给谁 3岁孩子离婚后应当判给谁 苹果14系统怎么更新下载 离婚三岁孩子一般判给谁 如何快速获取iOS10.2描述文件 你见过最好看的品牌logo是什么? 有哪些大学的logo很好看? 什么牌子的汽车的,标志最帅,最酷? 有哪些大学的 logo 很好看? 有没有象这样很帅的标志 我的吉利ICON,帅就完事了,展示它的魅力 家政公司的服务内容能做哪些