필터 지우기
필터 지우기

Algebraric equation output from s function

조회 수: 2 (최근 30일)
Andreas Skovhøj
Andreas Skovhøj 2022년 2월 19일
답변: Aditya 2023년 12월 22일
Hi,
I am going to solve a system of ODEs in simulink and i am going to use the state variables in an algebraric equation. My question is if it is possible to write the algebraric equation in the s function and send is as an output of the s_function block in simulink.
Right now i have stated them under function sys=mdlDerivatives which is porobably not right..
here is an example:
function [sys,x0,str,ts] = sfun_TEST(t,x,u,flag,xinit_evap,p)
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes(xinit_evap);
case 1,
sys=mdlDerivatives(t,x,u,p);
case 3,
sys=mdlOutputs(t,x,u);
case { 2, 4, 9 }
sys = []; % Unused flags
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes(xinit_evap)
sizes = simsizes;
sizes.NumContStates = 2;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 7;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1; % At least one sample time is needed
sys = simsizes(sizes);
% initialize the initial conditions
x0 = xinit_evap; % xinit are the initial values that are sent to the S-function, see first line of the S-function
% str is always an empty matrix
str = [];
% initialize the array of sample times
ts = [0 0];
function sys=mdlDerivatives(t,x,u,p)
% Model inputs:
F1 = u(1); % Feed flowrate
F2 = u(2); % Product flowrate
F4 = u(3); % Vapor flowrate
F5 = u(4); % Condensate flowrate
X1 = u(5); % Feed composition
Q100 = u(6); % Heater duty
T1 = u(7); % Feed temperature
% Algebraric equations % UNIT
% ODEs
dxdt(1) = F1 * X1 - F2 * x(1);
dxdt(2) = F4 - F5
!!!I WANT THESE AS MY OUTPUT ALONG WITH THE STATES!!!
T2 = 0.5616 * x(2) + 0.3126 * x(1) + 48.43;
T3 = 0.507 * x(2) + 55.0;
sys = [dxdt(1) dxdt(2)];
function sys=mdlOutputs(t,x,u)
% Calculate the outputs of the model block
sys = [x(1) x(2)];

답변 (1개)

Aditya
Aditya 2023년 12월 22일
Hello Andreas,
I understand that you want to output algebraic equations alongside state variables from an S-function block in Ssimulink, for this you need to update some parts of your code:
1. Update mdlOutputs to compute and include T2 and T3:
function sys = mdlOutputs(t,x,u)
T2 = 0.5616 * x(2) + 0.3126 * x(1) + 48.43;
T3 = 0.507 * x(2) + 55.0;
sys = [x(1); x(2); T2; T3];
end
2. Modify mdlInitializeSizes to indicate four outputs:
function [sys,x0,str,ts] = mdlInitializeSizes(xinit_evap)
sizes = simsizes;
sizes.NumOutputs = 4; % 2 states + 2 algebraic equations
% ... (rest of your code)
end
To test this function in simulink:
  1. Create a new simulink model
  2. Add and configure the s-function block
  3. Add input signals and connect the output signals to "scope" block for display
  4. Run the simulation and Check whether the result is as expected or not.
Hope this helps!

카테고리

Help CenterFile Exchange에서 Interactive Model Editing에 대해 자세히 알아보기

제품


릴리스

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by