Use ode values without storing

1 visualización (últimos 30 días)
olabaz
olabaz el 6 de Sept. de 2017
Editada: Stephen23 el 7 de Sept. de 2017

Hi, I have a system of ODEs that I can solve using ode23. To solve I do:

[t, S] = ode23(@odefunc,tSpan,S0)

and then what I am really interested in is a variable:

D(t) = 2*pi*(S(1)(t) + S(2)(t) + S(3)(t) + ...)

and then I plot D(t) vs t.

Doing it this way, however, I am forced to store all S(1)(t), all S(2)(t), etc. when I really only need their sum for each time. This takes a lot of memory since I have 280k*3 equations. How can I go about just calculating D at each step and saving that in an array to then plot D(t) vs t.

Respuesta aceptada

Stephen23
Stephen23 el 7 de Sept. de 2017
Editada: Stephen23 el 7 de Sept. de 2017
Write your own output function, which is called by ode45 after each successful step:
Inside the function:
  • Store the sum value in a persistent variable.
  • Add a special case that returns the persistent variable (e.g. the third input = 'getval').
To use it:
  • Use the init call to empty the persistent variable.
  • On each call append the sum value onto the persistent variable.
  • After ode45 has finished call the output function with your special third input to return the persistent variable.
Easy! You have stored only the values that you want, and get them in a vector at the end.
  2 comentarios
olabaz
olabaz el 7 de Sept. de 2017
Thanks. This is what I was looking for. I wasn't able to get the output working so I just made a global variable and appended to it.
Stephen23
Stephen23 el 7 de Sept. de 2017
Editada: Stephen23 el 7 de Sept. de 2017
@olabaz: I am glad that it works. If you upload your code I will have a look. I would recommend avoiding global if you can.

Iniciar sesión para comentar.

Más respuestas (1)

Jacob Ward
Jacob Ward el 6 de Sept. de 2017
You could create a function that calls ode23, finds the sum of S, and then returns that sum. Something like this:
function [t,D] = odeSum()
...
[t, S] = ode23(@odefunc,tSpan,S0)
D(t) = 2*pi*(S(1)(t) + S(2)(t) + S(3)(t) + ...)
end
Since the function throws away any variables that aren't output variables, you wouldn't be saving all the useless S data and would be left with only D when you come out of the function.
  3 comentarios
Jacob Ward
Jacob Ward el 6 de Sept. de 2017
I see. Well, I could be wrong, but I think in order to do what you are saying you'd have to go in and change the ode23 code itself so that it only outputs what you want. Maybe someone else will have a better suggestion.
Stephen23
Stephen23 el 7 de Sept. de 2017
"...you'd have to go in and change the ode23 code itself..."
Not required at all. See my answer.

Iniciar sesión para comentar.

Categorías

Más información sobre Ordinary Differential Equations en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by