matlab中dir代表什么意思,matlab中 sizes.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 (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)可以通过对相应于你所要求的系统对上述三个函数加以相应的改进来到达自己的要求,因此可以把上述函数当成模板函数.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值