Is the time vector t for the function odefun() inside ode45() always required?

5 vues (au cours des 30 derniers jours)
Hi
I am new to using ode45 in Matlab and there is a question that popped up.
When I call the odefun function, which is called "ODE_SEIR" in my case (see below), I was wondering why it is necessary to specify the time vector "timevec" even if ODE_SEIR does not use it? I tried removing timevec in the place marked bold below but for some reason the script doesn't run then and I get the following output:
error code
Index exceeds the number of array elements (1).
Error in ODE_SEIR (line 11)
E = initial(2);
Error in SEIR>@(value_initial,param)ODE_SEIR(value_initial,param)
Error in odearguments (line 90)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.
Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Error in SEIR (line 52)
[timevec, sol] = ode45(@(value_initial, param)...
It looks like ode45 interprets the parameter value_initial (called "initial" inside the ODE_SEIR function) as the time vector timevec. I assume that the time vector just always has to be added as a parameter but I am not sure. Thanks a lot for your help!
main script
% Integrieren des Systems (Differentialgleichungen) von t0 bis tend (= timevec)
% und den jeweiligen Anfangsbedingungen.
[timevec, sol] = ode45(@(timevec, value_initial, param)...
ODE_SEIR(timevec, value_initial, param),tspan, value_initial);
function ODE_SEIR
function deriv = ODE_SEIR(~, initial, param)
% Herauslesen der Anfangsbedingungen für die ODEs
S = initial(1);
E = initial(2);
I = initial(3);
R = initial(4);
% Berechnung der ODEs
dS = -param.beta*I*S/param.population;
dE = param.beta*I*S/param.population-param.alpha*E;
dI = param.alpha*E-param.gamma*I;
dR = param.gamma*I;
deriv = [dS; dE; dI; dR];
end
  4 commentaires
Martin Vontobel
Martin Vontobel le 4 Avr 2020
Hi Madhan Ravi, thanks for your comment. It looks like Stephen found the answer to the question in the Matlab documentation (see his answer below). Best wishes, Martin
Martin Vontobel
Martin Vontobel le 4 Avr 2020
Hi Darova,
Thanks for pointing out that the argument "param" was superfluous there, where I put it in the first place.

Connectez-vous pour commenter.

Réponse acceptée

Steven Lord
Steven Lord le 29 Mar 2020
From the documentation page for the ode45 function "The function dydt = odefun(t,y), for a scalar t and a column vector y, must return a column vector dydt of data type single or double that corresponds to f(t,y). odefun must accept both input arguments, t and y, even if one of the arguments is not used in the function."
  2 commentaires
Martin Vontobel
Martin Vontobel le 4 Avr 2020
Hi Stephen, thanks a lot for your reply. I did not find this comment you mentioned above in the MATLAB documentation. Your reply confirms what I assumed might be the case. Cheers, Martin

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Programming dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by