0% found this document useful (0 votes)
234 views

Modeling and S Function

This document describes how to simulate an ordinary differential equation (ODE) model in Simulink using S-functions and create a menu interface for adjusting model parameters. I) The ODEs are first solved numerically in MATLAB using the ode function. II) The ODE solution is copied into an S-function and used to simulate the model in Simulink. III) The S-function is modified to take parameters as inputs and the Simulink model is masked to create a menu for adjusting parameters like resistances and capacitances. This allows changing parameters without editing the S-function code.

Uploaded by

neyzenapo
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
234 views

Modeling and S Function

This document describes how to simulate an ordinary differential equation (ODE) model in Simulink using S-functions and create a menu interface for adjusting model parameters. I) The ODEs are first solved numerically in MATLAB using the ode function. II) The ODE solution is copied into an S-function and used to simulate the model in Simulink. III) The S-function is modified to take parameters as inputs and the Simulink model is masked to create a menu for adjusting parameters like resistances and capacitances. This allows changing parameters without editing the S-function code.

Uploaded by

neyzenapo
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 12

Simulating ODEs with S-Functions, step by step

Abstract
This application shows how models based on a system of ODEs (Ordinary Differential
Equations) are simulated using S-Functions in SimuLink. Furthermore it is
demonstrated how the model can be masked in order to construct a menu for entering
the model parameters.
1. Starting
1) Copy and unpack the zip file (remember the directory where you placed the zip file)
2) Run MatLab
3) In MatLab, change directory to the zip file
- For Version 6: use the 'Current Directory' window
- For Versions below 6: use 'cd' command.
4) Check whether you are in the right directory by typing 'pwd' and 'dir'. You see the
unpacked files appear.
5) Run SimuLink
6) Open (in SimuLink) the file 'SimpleConstructionMask.mdl'
7) Press (Simulation / Start)
2. Problem:
We want to simulate a system of ODEs in SimuLink and create a menu for entering the
model parameters. The system van ODEs is:

dT1
Ti T1 T1 T2
= (1/C1) (

)
dt
R1
R2
dT2
T1 T2 T2 Te
)
= (1/C2) (

dt
R2
R3
The following steps are needed to construct the model 'SimpleConstructionMask.mdl'

I)

Simulate the system of ODEs in MatLab using ode

The file simcondvfun.m contains de differential equations for using with ode:
%SIMCONDVFUN SIMple CONstruction Differential Equation FUNction
%
%JvS 12/2003
%
% x(1)=T(1)
% x(2)=T(2)
function xdot=simcondvfun(t,x)
xdot=zeros(2,1);
%modelparameters
R1=0.1;
%K/W
R2=1;
%K/W
R3=0.05;
%K/W
C1=4e4;
%J/K
C2=4e4;
%J/K
% input
Te=0;
Ti=20;

%oC

%oC

xdot(1)=(1/C1)* (
xdot(2)=(1/C2)* (

( Ti -x(1))/R1
(x(1)-x(2))/R2

(x(1)-x(2))/R2
(x(2)- Te)/R3

);
);

The file simconstart.m simulates the system.


%SIMCONSTART SIMple CONstruction START
%
%JvS 12/2003
clear all
t0=0;
te=10*3600;
T0=[10 10]';

%start time
%end time
%start values temperature

[t,x]=ode23('simcondvfun', [t0 te], T0);


plot(t,x)

Type simconstart at the MatLab prompt. This gives the following result:

II)

Copy the contents of the ode mfile into a S-Function, adapt the code of
the S-Function, simulate the system in SimuLink

The file simconsfun1.m is the S-Function to simulate the ODEs in SimuLink.


The adaptation of a standard S-Function is presented in red:
function [sys,x0,str,ts] = simconsfun1(t,x,u,flag)
%SIMCONSFUN1 SIMple CONstruction SFunction 1
%
%JvS 12/2003
%
%input u; output y
%u(1)=Te
%u(2)=Ti
%y(1)=x(1)
%y(2)=x(2)

switch flag,
%%%%%%%%%%%%%%%%%%
% Initialization %
%%%%%%%%%%%%%%%%%%
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
%%%%%%%%%%%%%%%
% Derivatives %
%%%%%%%%%%%%%%%
case 1,
sys=mdlDerivatives(t,x,u);
%%%%%%%%%%%
% Outputs %
%%%%%%%%%%%
case 3,
sys=mdlOutputs(t,x,u);
%%%%%%%%%%%%%%%%%%%
% Unhandled flags %
%%%%%%%%%%%%%%%%%%%
case { 2, 4, 9 },
sys = [];
%%%%%%%%%%%%%%%%%%%%
% Unexpected flags %
%%%%%%%%%%%%%%%%%%%%
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
% end wpfun1
%
%=====================================================================
========
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the Sfunction.
%=====================================================================
========
%
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates
sizes.NumDiscStates
sizes.NumOutputs
sizes.NumInputs
sizes.DirFeedthrough
sizes.NumSampleTimes

=
=
=
=
=
=

2;
0;
2;
2;
1;
1;

sys
x0
str
ts

=
=
=
=

simsizes(sizes);
[10; 10];
[];
[0 0];

% end mdlInitializeSizes
%
%=====================================================================
========
% mdlDerivatives
% Return the derivatives for the continuous states.
%=====================================================================
========
%
function sys=mdlDerivatives(t,x,u)
%model parameters
R1=0.1;
%K/W
R2=1;
%K/W
R3=0.05;
%K/W
C1=4e4;
%J/K
C2=4e4;
%J/K
% input
Te=u(1);
Ti=u(2);

%oC
%oC

xdot(1)=(1/C1)* (
xdot(2)=(1/C2)* (

( Ti -x(1))/R1
(x(1)-x(2))/R2

(x(1)-x(2))/R2
(x(2)- Te)/R3

);
);

sys = [xdot(1); xdot(2)];


% end mdlDerivatives
%
%=====================================================================
========
% mdlOutputs
% Return the block outputs.
%=====================================================================
========
%
function sys=mdlOutputs(t,x,u)
sys = x;
% end mdlOutputs

The system can be simulated by SimpleConstruction.mdl:

The name of the S-Function can be entered by double clicking S-Function block:

The results are the same as in section I)

III)

Masking the model and creating a menu for the model parameters.

If we want to change a parameter of the model at section II, (for example a heat
resistance value) we have to change the code of the S-Function (simconsfun1) by
editing, saving the mfile and simulate again. This can be done in a more user-friendly
way by creating a menu for the model parameters. This can be done as follows:
A) Adapt de S-Function simconsfun1.m as follows (the changes relative to
simconsfun1 are shown in red) and save as simconsfun2.m
function [sys,x0,str,ts] = simconsfun2(t,x,u,flag)
%SIMCONSFUN1 SIMple CONstruction SFunction 2 with extended input
%
%JvS 12/2003
%
%input u; output y
%u(1)=Te
%u(2)=Ti
%u(3)=R1
%u(4)=R2
%u(5)=R3
%u(6)=C1
%u(7)=C2
%y(1)=x(1)
%y(2)=x(2)
switch flag,
%%%%%%%%%%%%%%%%%%
% Initialization %
%%%%%%%%%%%%%%%%%%
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
%%%%%%%%%%%%%%%
% Derivatives %
%%%%%%%%%%%%%%%
case 1,
sys=mdlDerivatives(t,x,u);
%%%%%%%%%%%
% Outputs %
%%%%%%%%%%%
case 3,
sys=mdlOutputs(t,x,u);
%%%%%%%%%%%%%%%%%%%
% Unhandled flags %
%%%%%%%%%%%%%%%%%%%
case { 2, 4, 9 },

sys = [];
%%%%%%%%%%%%%%%%%%%%
% Unexpected flags %
%%%%%%%%%%%%%%%%%%%%
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
% end wpfun1
%
%=====================================================================
========
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the Sfunction.
%=====================================================================
========
%
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates
sizes.NumDiscStates
sizes.NumOutputs
sizes.NumInputs
sizes.DirFeedthrough
sizes.NumSampleTimes
sys
x0
str
ts

=
=
=
=

=
=
=
=
=
=

2;
0;
2;
7;
1;
1;

simsizes(sizes);
[10; 10];
[];
[0 0];

% end mdlInitializeSizes
%
%=====================================================================
========
% mdlDerivatives
% Return the derivatives for the continuous states.
%=====================================================================
========
%
function sys=mdlDerivatives(t,x,u)
%modelparameters zijn nu input
R1=u(3);
%K/W
R2=u(4);
%K/W
R3=u(5);
%K/W
C1=u(6);
%J/K
C2=u(7);
%J/K
% input

Te=u(1);
Ti=u(2);

%oC
%oC

xdot(1)=(1/C1)* (
xdot(2)=(1/C2)* (

( Ti -x(1))/R1
(x(1)-x(2))/R2

(x(1)-x(2))/R2
(x(2)- Te)/R3

);
);

sys = [xdot(1); xdot(2)];


% end mdlDerivatives
%
%=====================================================================
========
% mdlOutputs
% Return the block outputs.
%=====================================================================
========
%
function sys=mdlOutputs(t,x,u)
sys = x;
% end mdlOutputs

B) Adapt the SimuLink model as follows:

C) Select all blocks and click Create Subsystem in the Edit menu. The next result is
obtained:

D) Select the Subsystem (by clicking one time) and click Edit Mask in the Edit menu.
Click the Initialization button and add 5 variables (R1, R2, R3, C1 en C2as follows:

Press OK and save the model as SimpleConstructionTest.mdl


Enter the values of the model parameters in the menu by double clicking the Subsystem:
R1
R2
R3
C1
C2

0.1
1
0.05
4e4
4e4

Simulate SimpleConstructionTest.mdl. The result should be the same as


SimpleConstructionMask.mdl.

You might also like