matlab中(1 )什么意思,matlab中area(1)什么意?mat – 手机爱问

b7a85014ec7813f327e04b420be8d1c8.png

2013-10-24

DirFeedthrough 什么意?

s-function也就是system-function的缩写。说得简单,s-function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。 要了解 s-function,必须了解以下知识:

(1)direct feedthrough

(2)dynamically sized inputs

(3)setting sample times and offsets

一。 direct feedthrough

direct feedthrough意思是说系统的输出或可变采样时间是否受到输入的控制。有的系统是受到输入控制的,如:

y=k*u...全部

s-function也就是system-function的缩写。说得简单,s-function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。

要了解 s-function,必须了解以下知识:

(1)direct feedthrough

(2)dynamically sized inputs

(3)setting sample times and offsets

一。

direct feedthrough

direct feedthrough意思是说系统的输出或可变采样时间是否受到输入的控制。有的系统是受到输入控制的,如:

y=k*u (u是输入,k是放大因子,y是输出)

而有的系统输出是不受到输入影响,如:

输出:y=x

dx=u

x表示状态

二。

dynamically sized inputs

主要是给出:输入连续状态数目(size。NumContStates),离散状态数目(size。NumDiscStates) ,输出数目(size。

NumOutputs),输入数目(size。NumInputs),Direct Feedthrough(size。Dir Feedthrough)。

三。setting sample times and offsets

setting smaple times and offsets主要设置采样时间。

MATLAB为了用户方便,已经书写了S-FUNCTIONS模板函数sfuntmpl。m。为了更好的写S-Function,该函数sfuntmpl。m内容如下面所示,该函数可以通过which sfuntmpl。

m来查看它的位置。一般是在\toolbox\simulink\blocks\文件夹中,然后通过输入命令edit sfuntmpl。m来查看M代码,当然也可以使用type函数。

事例一:连续系统例子:

function [sys,x0,str,ts] = csfunc(t,x,u,flag)

A=[-0。

09 -0。01; 1 0];

B=[ 1 -7; 0 -2];

C=[ 0 2; 1 -5];

D=[-3 0; 1 0];

switch flag,

case 0

[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D);

case 1

sys=mdlDerivatives(t,x,u,A,B,C,D);

case 3

sys=mdlOutputs(t,x,u,A,B,C,D);

case { 2, 4, 9 }

sys = [];

otherwise

error(['Unhandled flag = ',num2str(flag)]);

end

function [sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D)

sizes = simsizes;

sizes。

NumContStates = 2; sizes。NumDiscStates = 0; sizes。NumOutputs = 2;

sizes。NumInputs = 2; sizes。DirFeedthrough = 1; sizes。

NumSampleTimes = 1;

sys = simsizes(sizes); x0 = zeros(2,1); str = []; ts = [0 0];

function sys=mdlDerivatives(t,x,u,A,B,C,D)

sys = A*x + B*u; % end mdlDerivatives

function sys=mdlOutputs(t,x,u,A,B,C,D)

sys = C*x + D*u; % end mdlOutputs

事例二:离散系统

function [sys,x0,str,ts] = dsfunc(t,x,u,flag)

A=[-1。

3839 -0。5097 1。0000 0];

B=[-2。5559 0 0 4。2382];

C=[ 0 2。0761 0 7。7891];

D=[ -0。8141 -2。9334 1。

2426 0];

switch flag,

case 0

[sys,x0,str,ts] = mdlInitializeSizes(A,B,C,D);

case 2

sys = mdlUpdate(t,x,u,A,B,C,D); %%%%%%%%%%

case 3

sys = mdlOutputs(t,x,u,A,C,D); %%%%%%%%%%%%%

case 9

sys = [];

otherwise

error(['unhandled flag = ',num2str(flag)]);

end %end dsfunc

function [sys,x0,str,ts] = mdlInitializeSizes(A,B,C,D)

sizes = simsizes;

sizes。

NumContStates = 0; sizes。NumDiscStates = size(A,1); sizes。NumOutputs = size(D,1);

sizes。NumInputs = size(D,2); sizes。

DirFeedthrough = 1; sizes。NumSampleTimes = 1;

sys = simsizes(sizes); x0 = ones(sizes。NumDiscStates,1); str = []; ts = [1 0];

function sys = mdlUpdate(t,x,u,A,B,C,D)

sys = A*x+B*u; %end mdlUpdate

function sys = mdlOutputs(t,x,u,A,C,D)

sys = C*x+D*u; %end mdlUpdate

事例三:离散和连续的混合型

function [sys,x0,str,ts] = mixedm(t,x,u,flag)

dperiod = 1; doffset = 0;

switch flag

case 0

[sys,x0,str,ts]=mdlInitializeSizes(dperiod,doffset);

case 1

sys=mdlDerivatives(t,x,u);

case 2

sys=mdlUpdate(t,x,u,dperiod,doffset);

case 3

sys=mdlOutputs(t,x,u,doffset,dperiod);

case 9

sys = [];

otherwise

error(['unhandled flag = ',num2str(flag)]);

end % end mixedm %

function [sys,x0,str,ts]=mdlInitializeSizes(dperiod,doffset)

sizes = simsizes; sizes。

NumContStates = 1; sizes。NumDiscStates = 1;

sizes。NumOutputs = 1; sizes。NumInputs = 1; sizes。DirFeedthrough = 0;

sizes。

NumSampleTimes = 2; sys = simsizes(sizes); x0 = ones(2,1); str = [];

ts = [0 0;dperiod doffset];

function sys=mdlDerivatives(t,x,u)

sys = u; % end mdlDerivatives

function sys=mdlUpdate(t,x,u,dperiod,doffset)

if abs(round((t - doffset)/dperiod) - (t - doffset)/dperiod) < 1e-8, sys = x(1);

else sys = []; end % end mdlUpdate

function sys=mdlOutputs(t,x,u,doffset,dperiod)

if abs(round((t - doffset)/dperiod) - (t - doffset)/dperiod) < 1e-8, sys = x(2); else sys = []; end

本帖中对是连续,离散,连续与离散混合系统的三个例子加以说明,以至于大家在看下面的例子时能更好的理解。

一。函数mdlInitializeSizes

对于描述连续型的函数csfunc。m

sizes。NumContStates = 2; sizes。NumDiscStates = 0;

表明本函数是描述连续型的

sizes。

NumOutputs = 2; sizes。NumInputs = 2;

sizes。DirFeedthrough = 1; sizes。NumSampleTimes = 1;

对于描述离散型的函数dsfunc。

m

sizes。NumContStates = 0; sizes。NumDiscStates = size(A,1);

表明本函数是描述离散型的

sizes。NumOutputs = size(D,1); sizes。

NumInputs = size(D,2);

sizes。DirFeedthrough = 1; sizes。NumSampleTimes = 1;

对于描述混合型的函数mixedm。m

sizes。

NumContStates = 1; sizes。NumDiscStates = 1;

表明本函数是描述混合型的

sizes。NumOutputs = 1; sizes。NumInputs = 1;

sizes。

DirFeedthrough = 0; sizes。NumSampleTimes = 2;

关于变量sizes。numoutputs和sizes。numinputs则由描述的系统的输出,输入而定。

关于变量sizes。DirFeedthrough,则可以查看矩阵D,如果D是非空,则为1,否则为0

关于变量sizes。NumSampleTimes,即是ts这个矩阵的行数。

二。函数mdlDerivatives

仅仅出现在含有连续型的系统中;这部分应该根据系统状态来决定。

三。函数mdlUpdate 仅仅出现在含有离散型的系统中;该函数应该根据系统状态来决定

四。函数mdlOutputs 该函数在各种类型中都有,应该根据描述系统的输出来决定;

五。关于书写s-functions函数的注意之点

(1)我想大家都会觉得上述三个函数都不利于维护,因此在写s-functions函数时不妨把矩阵 A,B,C,D也考虑成变量,作为输入参数;

(2)关于在csfuncs。

m中的型如case(2,4,9)这种形式,大家最好不要采用,不利于维护,可以分开来写

(3)关于结构sizes中的各个变量的值,最好从输入参量中得到,而不是通过人为判断来输入

(4)因此,其实上述三种形式,可以变化成一种形式。

(5)可以通过对相应于你所要求的系统对上述三个函数加以相应的改进来到达自己的要求,因此可以把上述函数当成模板函数。

。收起

matlab程序 matlab s函数 . function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag) % SFUNTMPL 是M-文件 S函数模板 % 通过剪裁,用户可以生成自己的S函数,不过一定要重新命名 % 利用S函数可以生成连续、离散混合系统等,实现任何模块的功能 % % M-文件S函数的语法为: % [SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn) % % 参数含义: % t是当前时间 % x是S函数相应的状态向量 % u是模块的输入 % flag是所要执行的任务 % % FLAG 结果 功能 % ----- ------ -------------------------------------------- % 0 [SIZES,X0,STR,TS] 模块初始化 % 1 DX 计算模块导数 % 2 DS 更新模块离散状态 % 3 Y 计算模块输出 % 4 TNEXT 计算下一个采样时间点 % 9 [] 结束仿真 % % % 用户切勿改动输出参数的顺序、名称和数目 % 输入参数的数目不能小于1,这四个参数的名称和排列顺序不能改动 % 用户可以根据自己的要求添加额外的参数,位置依次为第5,6,7,8,9等。 % S函数的flag参数是一个标记变量,具有6个不同值,分别为0,1,2,3,4,9 % flag的6个值分别指向6个不同的子函数 % flag所指向的子函数也成为回调方法(Callback Methods) switch flag, %初始化,调用“模块初始化”子程序% case 0, [sys,x0,str,ts]=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); %其他的flag% otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end % end sfuntmpl %============================================================================= % “模块初始化”子函数 % 返回大小、初始条件和样本 function [sys,x0,str,ts]=mdlInitializeSizes % 调用simsizes函数,返回规范格式的sizes构架 % 这条指令不要修改 sizes = simsizes; % 模块的连续状态个数,0是默认值 % 用户可以根据自己的要求进行修改 sizes.NumContStates = 0; % 模块的离散状态个数,0是默认值 % 用户可以根据自己的要求进行修改 sizes.NumDiscStates = 0; % 模块的输出个数,0是默认值 % 用户可以根据自己的要求进行修改 sizes.NumOutputs = 1; % 模块的输入个数,0是默认值 % 用户可以根据自己的要求进行修改 sizes.NumInputs = 2; % 模块包含的直通前向馈路个数,1是默认值 % 用户可以根据自己的要求进行修改 sizes.DirFeedthrough = 1; % 模块采样时间的个数,1是默认值,至少需要一个样本时间 % 用户可以根据自己的要求进行修改 sizes.NumSampleTimes = 1; % 初始化后的构架sizes经simsizes函数处理后向sys赋值 % 这条指令不要修改 sys = simsizes(sizes); % 给模块初始值变量赋值,[]是默认值 % 用户可以根据自己的要求进行修改 x0 = []; % 系统保留变量 % 切勿改动,保持为空 str = []; % “二元对”描述采样时间及偏移量。[0 0]是默认值 % [0 0]适用于连续系统 % [-1 0]则表示该模块采样时间继承其前的模块采样时间设置 ts = [0 0]; % end mdlInitializeSizes %============================================================================= % 计算导数向量 function sys=mdlDerivatives(t,x,u) % 此处填写计算导数向量的指令 % []是模块的默认值 % 用户必须把算得的离散状态的导数向量赋给sys sys = []; % end mdlDerivatives %============================================================================= % 计算离散状态向量 function sys=mdlUpdate(t,x,u) % 此处填写计算离散状态向量的指令 % []是模块的默认值 % 用户必须把算得的离散状态向量赋给sys sys = []; % end mdlUpdate %============================================================================= % 计算模块输出向量 function sys=mdlOutputs(t,x,u) % 此处填写计算模块输出向量的指令 % []是模块的默认值 % 用户必须把算得的模块输出向量赋给sys global m l J g=9.8; M0=1/3*m*l*l; G0=1/2*m*l*g*cos(u(1)); % 期望轨迹 dd_qr=-sin(t);d_qr=cos(t);qr=sin(t); d_q=u(2);q=u(1); % u1=(M0+J)*(dd_qr+2*2*(d_qr-d_q)+4*(qr-q))+G0; sys = u1; % end mdlOutputs %============================================================================= % 计算下一采样时刻 function sys=mdlGetTimeOfNextVarHit(t,x,u) % 该子函数仅在“采样时间”情况下使用 % sampleTime = 1 是模块默认设置,表示在当前时间1秒后再调用本模块 % 用户可以根据自己的要求修改 sampleTime = 1; % 将计算得到的下一采样时刻赋给sys % 切勿改动 sys = t + sampleTime; % end mdlGetTimeOfNextVarHit %============================================================================= function sys=mdlTerminate(t,x,u) % 模板默认设置,一般情况不要改动 sys = []; % end mdlTerminate
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值