How do I declare and iterate a variable in an ODE driver file?

1 visualización (últimos 30 días)
I have a pair of function and ode driver files. Currently, all values except initial conditions are declared as variables in the function file.
I would like to iterate on one variable, and check if the result is better than the previous value.
For example,
  1. start with Snh_in_1=1,
  2. run the ODE,
  3. print y(end,3).
  4. +0.1 to Ssnh (i.e. Snh_in_1 = 1.1)
  5. run the ODE,
  6. print new y(end,3).
  7. if new y(end,3), > original y(end, 3), repeat from step 1.
  8. stop when new y(end,3) less than or equal to previous y(end,3), and report this value of Snh_in_1.
These are my code so far
I can imagine an if loop that might work:
result2 = 2;
result1 = 1;
Ssnh_in_1 = 1;
if result2 >= result1
[t,y]=ode15s(@pha_cont,[0,15],y0);
result1 = y(end,3);
Ssnh_in_1 = Ssnh_in_1 + 0.1;
[t,y]=ode15s(@pha_cont,[0,15],y0);
result2 = y(end,3);
else
disp(Ssnh_in_1)
end
But I have no idea how to pass this variable from the driver into the function file.
How can I do what I want in Matlab? Thanks in advance!

Respuesta aceptada

Torsten
Torsten el 9 de Sept. de 2019
yold = -Inf;
Ssnh_in_1 = 1;
[t,y]=ode15s(@(t,y)pha_cont(t,y,Ssnh_in_1),[0,15],y0);
ynew = y(end,3);
while yold < ynew
Ssnh_in_1 = Ssnh_in_1 + 0.1;
[t,y]=ode15s(@(t,y)pha_cont(t,y,Ssnh_in_1),[0,15],y0);
yold = ynew;
ynew = y(end,3);
end
disp(Ssnh_in_1)

Más respuestas (1)

Bjorn Gustavsson
Bjorn Gustavsson el 9 de Sept. de 2019
The way I read your ODE-function your Snh_in_1 is the initial value of the second component of y. If so it should be no more difficult than something like this:
Snh_in_1 = 1;
dSnh_in_1 = 0.1;
for i_iter = 1:10
y0 = [a0,Snh_in_1+(i_iter-1)*dSnh_in_1,c0,d0,e0]; % I lost track of how many components you used
[t,y] = ode15s(@pha_cont,[0,15],y0);
results(i_iter,:) = y(end,:);
Results{i_iter,1} = t; % If you've integrated all your ODE's you might just
Results{i_iter,2} = y; % as well save the entire solution - if it doesn't become too big...
end
% Then do the rest of the analysis after all the ODE-integrations
HTH
  1 comentario
Miraculous Mongoose
Miraculous Mongoose el 9 de Sept. de 2019
Sorry, the 2nd component of y() is "Snh_1", not "Snh_in_1", which is around line 30 of the function file.
Is there an easy way to adapt your template so that the driver file references "Snh_in_1" in the function file instead?

Iniciar sesión para comentar.

Categorías

Más información sobre Programming en Help Center y File Exchange.

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by