Use ode values without storing

1 vue (au cours des 30 derniers jours)
olabaz
olabaz le 6 Sep 2017
Modifié(e) : Stephen23 le 7 Sep 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.

Réponse acceptée

Stephen23
Stephen23 le 7 Sep 2017
Modifié(e) : Stephen23 le 7 Sep 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 commentaires
olabaz
olabaz le 7 Sep 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 le 7 Sep 2017
Modifié(e) : Stephen23 le 7 Sep 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.

Connectez-vous pour commenter.

Plus de réponses (1)

Jacob Ward
Jacob Ward le 6 Sep 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 commentaires
Jacob Ward
Jacob Ward le 6 Sep 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 le 7 Sep 2017
"...you'd have to go in and change the ode23 code itself..."
Not required at all. See my answer.

Connectez-vous pour commenter.

Community Treasure Hunt

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

Start Hunting!

Translated by