from
Solving Index-1 DAEs in Simulink using Level-2 M S-functions
by Atul Bhargav
This example illustrates the use of Simulink Level-2 S-functions to solve Index-I DAEs
|
| HB1_DAE_sfun(block) |
function HB1_DAE_sfun(block)
% Level-2 M file S-Function for times two demo.
% Copyright 1990-2004 The MathWorks, Inc.
% $Revision: 1.1.6.1 $
setup(block);
%endfunction
function setup(block)
%% Register number of dialog parameters
block.NumdialogPrms = 2;
%% Register number of input and output ports
block.NumInputPorts = 1;
block.NumOutputPorts = 3;
%% Setup functional port properties to dynamically
%% inherited.
block.SetPreCompInpPortInfoToDynamic;
block.SetPreCompOutPortInfoToDynamic;
block.InputPort(1).Dimensions = 1;
block.InputPort(1).DirectFeedthrough = true;
block.OutputPort(1).Dimensions = 1;
block.OutputPort(2).Dimensions = 1;
block.OutputPort(3).Dimensions = 1;
block.NumContStates = 2;
block.RegBlockMethod('InitializeConditions', @InitConditions);
block.RegBlockMethod('Outputs', @Output);
block.RegBlockMethod('Derivatives', @Derivative);
block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);
%endfunction
function InitConditions(block)
%% Initialize Dwork
block.ContStates.Data(1) = block.DialogPrm(1).Data;
block.ContStates.Data(2) = block.DialogPrm(2).Data;
%endfunction
function Output(block)
y1 = block.ContStates.Data(1);
y2 = block.ContStates.Data(2);
y3 = block.InputPort(1).Data;
block.OutputPort(1).Data = y1;
block.OutputPort(2).Data = y2;
block.OutputPort(3).Data = y1 + y2 + y3 - 1;
%endfunction
function Derivative(block)
y1 = block.ContStates.Data(1);
y2 = block.ContStates.Data(2);
y3 = block.InputPort(1).Data;
block.Derivatives.Data = [-0.04 * y1 + 1e4 * y2 * y3;
0.04 * y1 - 1e4 * y2 * y3 - 3e7 * y2^2];
%endfunction
function SetInpPortFrameData(block, idx, fd)
block.InputPort(idx).SamplingMode = fd;
block.OutputPort(1).SamplingMode = fd;
block.OutputPort(2).SamplingMode = fd;
block.OutputPort(3).SamplingMode = fd;
%endfunction
|
|
Contact us at files@mathworks.com