Problem using "trim" function to find steady-state points for a simulink model.

21 次查看(过去 30 天)
Hi guys. I'm trying to simulate this model in S-function. This is my model's code:
function dx=bioreactor(t,x,u)
%Outputs
x1 = x(1);
x2 = x(2);
%inputs
D = u(1);
x2f = u(2);
%Constants
mumax = 0.53;
km = 0.12;
k1 = 0.454;
Y = 0.4;
mu = mumax*x2/(km+x2+k1*x2^2);
dx1 = (mu - D)*x1;
dx2 = D*(x2f-x2)-mu*x1/Y;
dx = [dx1;dx2];
end
%Outputs
x1 = x(1);
x2 = x(2);
%inputs
D = u(1);
x2f = u(2);
%Constants
mumax = 0.53;
km = 0.12;
k1 = 0.454;
Y = 0.4;
mu = mumax*x2/(km+x2+k1*x2^2);
dx1 = (mu - D)*x1;
dx2 = D*(x2f-x2)-mu*x1/Y;
dx = [dx1;dx2];
end
I have simulated this in this S-function:
function [sys,x0,str,ts,simStateCompliance] = bioreactor_sfcn(t,x,u,flag)
%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.
%
% The following outlines the general structure of an S-function.
%
switch flag,
%%%%%%%%%%%%%%%%%%
% Initialization %
%%%%%%%%%%%%%%%%%%
case 0,
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
%%%%%%%%%%%%%%%
% Derivatives %
%%%%%%%%%%%%%%%
case 1,
sys=mdlDerivatives(t,x,u);
%%%%%%%%%%
% Update %
%%%%%%%%%%
case 2,
sys=mdlUpdate(t,x,u);
%%%%%%%%%%%
% Outputs %
%%%%%%%%%%%
case 3,
sys=mdlOutputs(t,x,u);
%%%%%%%%%%%%%%%%%%%%%%%
% GetTimeOfNextVarHit %
%%%%%%%%%%%%%%%%%%%%%%%
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
%%%%%%%%%%%%%
% Terminate %
%%%%%%%%%%%%%
case 9,
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;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
%
% initialize the initial conditions
%
x0 = [1 1];
%
% str is always an empty matrix
%
str = [];
%
% initialize the array of sample times
%
ts = [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.
%=============================================================================
%
function sys=mdlDerivatives(t,x,u)
sys = bioreactor(t,x,u);
% end mdlDerivatives
%
%=============================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=============================================================================
%
function sys=mdlUpdate(t,x,u)
sys = [];
% end mdlUpdate
%
%=============================================================================
% mdlOutputs
% Return the block outputs.
%=============================================================================
%
function sys=mdlOutputs(t,x,u)
sys = x;
% 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.
%=============================================================================
%
function sys=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.
%=============================================================================
%
function sys=mdlTerminate(t,x,u)
sys = [];
% end mdlTerminate
As you can see I have 2 inputs(u(1),u(2)) and two outputs(x(1),x(2)).
The problem is when I use trim function to find steady points in constant u(1) and u(2) by this code below, I get this error "Error using trim
The specified number of model inputs (2) does not match actual number (0) of inputs
Error in trim
Error in Trim_Bioreactor (line 9)
[X,U,Y,DX] = trim('Linearization_with_trim', X0, U0, Y0, IX, IU, IY); - Show complete stack trace"
X0 = [];
U0 = [0.3; 4];
Y0 = [];
IX = [];
IU = [1; 2];
IY = [];
load_system('Linearization_with_trim');
[X,U,Y,DX] = trim('Linearization_with_trim', X0, U0, Y0, IX, IU, IY);
X
I don't understand my simulink runs perfectly and my inputs are specified as 2 so why I'm getting this error??
  2 个评论
Sandeep Mishra
Sandeep Mishra 2024-10-11
After running the simulink model in R2021b, i found the following error:
An error occurred while running the simulation and the simulation was terminated
Caused by: Undefined function 'bioreactor' for input arguments of type 'double'.
Could you please share the 'bioreactor' function?
naiva saeedia
naiva saeedia 2024-10-11
Sorry about the wrong "reactor" function. Here is the "bioreactor" function.
function dx=bioreactor(t,x,u)
%Outputs
x1 = x(1);
x2 = x(2);
%inputs
D = u(1);
x2f = u(2);
%Constants
mumax = 0.53;
km = 0.12;
k1 = 0.454;
Y = 0.4;
mu = mumax*x2/(km+x2+k1*x2^2);
dx1 = (mu - D)*x1;
dx2 = D*(x2f-x2)-mu*x1/Y;
dx = [dx1;dx2];
end

请先登录,再进行评论。

采纳的回答

Sandeep Mishra
Sandeep Mishra 2024-10-11
Hello Naiva,
I encountered a similar error while running the Simulink model in R2021b. After analyzing the error message, I identified that the error occurs due to the incorrect way of passing inputs to the Simulink model. Specifically, the inputs are not being passed using the 'inport' block.
To resolve this, you should use the 'inport' block instead of a 'Constant' block for input values. This will ensure that the inputs are correctly integrated into the Simulink model.
Initialize the inputs in the MATLAB base workspace with the following commands:
% Time value
t = 0;
% User input
D = 1;
x2f =2;
Subsequently, configure the model to import the inputs 'D' and 'x2f' along with the time parameter 't' in the model configuration settings. (Refer attached model_config.png)
Refer to the following MathWorks Documentation to learn more about ‘inport’ block: https://www.mathworks.com/help/releases/R2021b/simulink/slref/inport.html
I hope this helps.
  2 个评论
naiva saeedia
naiva saeedia 2024-10-12
Thanks a lot. I have only one question about this. Why do we need define time value(t=0)? I don't understand why we also consider t as our input?? Also If I want to run my simulink without using workspace I should define t,D and x2f values in callback initfcn right??
Sandeep Mishra
Sandeep Mishra 2024-10-16
Regarding your second query, you can initialize the variables either in the initfcn callback or in the same MATLAB Script before 'load_system('Linearization_with_trim')' function call.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Trimming and Linearization 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by