我是靠谱客的博主 心灵美香烟,最近开发中收集的这篇文章主要介绍matlab 传递函数 仿真,利用S-Function实现传递函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

For a model

with Nx states, Ny outputs, and Nu inputs:

a is an Nx-by-Nx real- or complex-valued matrix.

b is an Nx-by-Nu real- or complex-valued matrix.

c is an Ny-by-Nx real- or complex-valued matrix.

d is an Ny-by-Nu real- or complex-valued matrix.

To set D = 0 , set d to the scalar 0 (zero), regardless of the

dimension.

离散模型:

sys = ss(a,b,c,d,Ts) creates the discrete-time model

a4c26d1e5885305701be709a3d33442f.png

with sample time Ts (in seconds). Set Ts = -1 or Ts = [] to leave

the sample time unspecified.

1.3MATLAB tf2ss函数命令:

将传递函数模型转化为状态空间模型,单输入单输出系统转换如下:

a4c26d1e5885305701be709a3d33442f.png

利用该命令不仅可以转换SISO系统也可以转换MIMO系统,如下MISO系统也可以:

a4c26d1e5885305701be709a3d33442f.png

den= [0 2

3; 1 2 1];

num= [1 0.4 1];

[A,B,C,D] = tf2ss(den,num)

结果:

A =

-0.4000

-1.0000

1.0000

0

B =

1

0

C =

2.0000

3.0000

1.6000

0

D =

0

1

2、实例仿真

2.1假设工业过程某传递函数:

a4c26d1e5885305701be709a3d33442f.png

den= [1.5];

num= [1 5 1];

[A,B,C,D] = tf2ss(den,num)

结果:

a

=

x1

x2

x1

-5  -1

x2

1

0

b =

u1

x1

1

x2

0

c =

x1

x2

y1

0

1.5

d =

u1

y1

0

所以有:

a4c26d1e5885305701be709a3d33442f.png

2.2修改S-Function模板参数:

从结果可以看出,系统有两个状态,没有离散状态,输入1个,输出1个,无直通反馈,一种采用时间,打开模板,复制代码。

function[sys,x0,str,ts,simStateCompliance]

= sfuntmpl(t,x,u,flag)【一个主函数,需修改原函数名:sfuntmpl】

%SFUNTMPL General MATLAB S-Function Template

%  With MATLAB S-functions, you

can define you own ordinary differential

%  equations (ODEs), discrete

system equations, and/or just about

%  any type of algorithm to be

used within a Simulink block diagram.

%

%  The general form of an MATLAB

S-function syntax is:

%

[SYS,X0,STR,TS,SIMSTATECOMPLIANCE]

= SFUNC(T,X,U,FLAG,P1,...,Pn)

%

%  What is returned by SFUNC at

a given point in time, T, depends on the

%  value of the FLAG, the

current state vector, X, and the current

%  input vector, U.

%

%  FLAG

RESULT

DESCRIPTION

%  -----

------

--------------------------------------------

%  0

[SIZES,X0,STR,TS]

Initialization, return system sizes in

SYS,

%

initial

state in X0, state ordering strings

%

in

STR, and sample times in TS.

%  1

DX

Return

continuous state derivatives in SYS.

%  2

DS

Update

discrete states SYS = X(n+1)

%  3

Y

Return

outputs in SYS.

%  4

TNEXT

Return

next time hit for variable step sample

%

time

in SYS.

%  5

Reserved

for future (root finding).

%  9

[]

Termination,

perform any cleanup SYS=[].

%

%

%  The state vectors, X and X0

consists of continuous states followed

%  by discrete

states.

%

%  Optional parameters,

P1,...,Pn can be provided to the S-function and

%  used during any FLAG

operation.

%

%  When SFUNC is called with

FLAG = 0, the following information

%  should be

returned:

%

%

SYS(1)

= Number of continuous states.

%

SYS(2)

= Number of discrete states.

%

SYS(3)

= Number of outputs.

%

SYS(4)

= Number of inputs.

%

Any

of the first four elements in SYS can be specified

%

as

-1 indicating that they are dynamically sized. The

%

actual

length for all other flags will be equal to the

%

length

of the input, U.

%

SYS(5)

= Reserved for root finding. Must be zero.

%

SYS(6)

= Direct feedthrough flag (1=yes, 0=no). The s-function

%

has

direct feedthrough if U is used during the FLAG=3

%

call.

Setting this to 0 is akin to making a promise that

%

U

will not be used during FLAG=3. If you break the promise

%

then

unpredictable results will occur.

%

SYS(7)

= Number of sample times. This is the number of rows in

TS.

%

%

%

X0

=

Initial state conditions or [] if no states.

%

%

STR

= State

ordering strings which is generally specified as [].

%

%

TS

=

An m-by-2 matrix containing the sample time

%

(period,

offset) information. Where m = number of sample

%

times.

The ordering of the sample times must be:

%

%

TS

= [0

0,

:

Continuous sample time.

%

0

1,

:

Continuous, but fixed in minor step

%

sample

time.

%

PERIOD

OFFSET, : Discrete sample time where

%

PERIOD

> 0 & OFFSET < PERIOD.

%

-2

0];

:

Variable step discrete sample time

%

where

FLAG=4 is used to get time of

%

next

hit.

%

%

There

can be more than one sample time providing

%

they

are ordered such that they are monotonically

%

increasing.

Only the needed sample times should be

%

specified

in TS. When specifying more than one

%

sample

time, you must check for sample hits explicitly by

%

seeing

if

%

abs(round((T-OFFSET)/PERIOD)

- (T-OFFSET)/PERIOD)

%

is

within a specified tolerance, generally 1e-8. This

%

tolerance

is dependent upon your model's sampling times

%

and

simulation time.

%

%

You

can also specify that the sample time of the S-function

%

is

inherited from the driving block. For functions which

%

change

during minor steps, this is done by

%

specifying

SYS(7) = 1 and TS = [-1 0]. For functions which

%

are

held during minor steps, this is done by specifying

%

SYS(7)

= 1 and TS = [-1 1].

%

%

SIMSTATECOMPLIANCE

= Specifices how to handle this block when saving and

%

restoring

the complete simulation state of the

%

model.

The allowed values are: 'DefaultSimState',

%

'HasNoSimState'

or 'DisallowSimState'. If this value

%

is

not speficified, then the block's compliance with

%

simState

feature is set to 'UknownSimState'.

%  Copyright 1990-2010 The

MathWorks, Inc.

%  $Revision: 1.18.2.5

$

%

% The following outlines the general structure of an

S-function.

%

switchflag,

%%%%%%%%%%%%%%%%%%

%

Initialization %

%%%%%%%%%%%%%%%%%%

case0,

[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;

%%%%%%%%%%%%%%%

%

Derivatives %

%%%%%%%%%%%%%%%

case1,

sys=mdlDerivatives(t,x,u);

%%%%%%%%%%

%

Update %

%%%%%%%%%%

case2,

sys=mdlUpdate(t,x,u);

%%%%%%%%%%%

%

Outputs %

%%%%%%%%%%%

case3,

sys=mdlOutputs(t,x,u);

%%%%%%%%%%%%%%%%%%%%%%%

%

GetTimeOfNextVarHit %

%%%%%%%%%%%%%%%%%%%%%%%

case4,

sys=mdlGetTimeOfNextVarHit(t,x,u);

%%%%%%%%%%%%%

%

Terminate %

%%%%%%%%%%%%%

case9,

sys=mdlTerminate(t,x,u);

%%%%%%%%%%%%%%%%%%%%

%

Unexpected flags %

%%%%%%%%%%%%%%%%%%%%

otherwise

DAStudio.error('Simulink:blocks:unhandledFlag',

num2str(flag));

end

% end sfuntmpl

%

%=============================================================================

% mdlInitializeSizes

% Return the sizes, initial conditions, and sample times for the

S-function.

%=============================================================================

%

function[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes

%

% call simsizes for a sizes structure, fill it in and convert it to

a

% sizes array.

%

% Note that in this example, the values are hard coded.

This is not a

% recommended practice as the characteristics of the block are

typically

% defined by the S-function parameters.

%

sizes =

simsizes;【不要更改】

sizes.NumContStates

= 2;【包括x1和x2两个连续状态】

sizes.NumDiscStates

= 0;【无离散状态】

sizes.NumOutputs

=

1;【一个输入u】

sizes.NumInputs

=

1;【一个输出y】

sizes.DirFeedthrough =

0;【y和u无关】

sizes.NumSampleTimes = 1;%

at least one sample time is needed【一个采用周期时间,可有多个】

sys =

simsizes(sizes);【不要更改】

%

% initialize the initial conditions

%

x0

= [0;0];【初始状态均为0】

%

% str is always an empty matrix

%

str =

[];【系统预留参数,不要更改】

%

% initialize the array of sample times

%

ts

= [0 0];【采样时间和偏移量,都为0说明为连续无偏移】

% Specify the block simStateCompliance. The allowed values

are:

%

'UnknownSimState',

< The default setting; warn and assume

DefaultSimState

%

'DefaultSimState',

< Same sim state as a built-in block

%

'HasNoSimState',

< No sim state

%

'DisallowSimState'

< Error out when saving or restoring the model sim

state

simStateCompliance =

'UnknownSimState';

% end mdlInitializeSizes

%

%=============================================================================

% mdlDerivatives

% Return the derivatives for the continuous states.

%=============================================================================

%

functionsys=mdlDerivatives(t,x,u)【求导,输出为状态x的导数】

sys =

[-5 -1;1

0]*x+[1;0]*u;

% end mdlDerivatives

%

%=============================================================================

% mdlUpdate

% Handle discrete state updates, sample time hits, and major time

step

% requirements.

%=============================================================================

%

functionsys=mdlUpdate(t,x,u)【离散情况下的x(n+1)】

sys =

[];

% end mdlUpdate

%

%=============================================================================

% mdlOutputs

% Return the block outputs.

%=============================================================================

%

functionsys=mdlOutputs(t,x,u)【系统输出y】

sys =

1.5*x(2);

% end mdlOutputs

%

%=============================================================================

% mdlGetTimeOfNextVarHit

% Return the time of the next hit for this block.

Note that the result is

% absolute time.  Note that this function is only

used when you specify a

% variable discrete-time sample time [-2 0] in the sample time

array in

% mdlInitializeSizes.

%=============================================================================

%

functionsys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime = 1;%

Example, set the next hit to be one second

later.

sys = t +

sampleTime;

% end mdlGetTimeOfNextVarHit

%

%=============================================================================

% mdlTerminate

% Perform any end of simulation tasks.

%=============================================================================

%

functionsys=mdlTerminate(t,x,u)

sys =

[];

% end mdlTerminate

2.3仿真结果

在simulink中建立一下模型:

a4c26d1e5885305701be709a3d33442f.png

双击打开S-Function块,如图所示:

a4c26d1e5885305701be709a3d33442f.png

其中,G_S_m.m就是刚才建立的S-Function。

如果仿真条件都一样则两个模型的仿真结果将会重合,为了便于区分,分别设定Step和Step1的阶跃时间为0和1,终值均为1,则仿真结果如下:

a4c26d1e5885305701be709a3d33442f.png

最后

以上就是心灵美香烟为你收集整理的matlab 传递函数 仿真,利用S-Function实现传递函数的全部内容,希望文章能够帮你解决matlab 传递函数 仿真,利用S-Function实现传递函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部