Use ode values without storing

1 Ansicht (letzte 30 Tage)
olabaz
olabaz am 6 Sep. 2017
Bearbeitet: Stephen23 am 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.

Akzeptierte Antwort

Stephen23
Stephen23 am 7 Sep. 2017
Bearbeitet: Stephen23 am 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 Kommentare
olabaz
olabaz am 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 am 7 Sep. 2017
Bearbeitet: Stephen23 am 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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Programming finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by