I am working with NDSolve to plot an ODE as a function of time. I need to find a way to figure out the exact value X of the solution for some specific time, say t*. Even better, a way to figure out the time t* at which the F[t*]=X. It's probably straightforward but don't have much experience with NDSolve! Thanks in advance!
2 Answers
You can use WhenEvent
. Let's say we want the points that the solution takes the value of 2.5:
{sol,points}=Reap@NDSolve[{D[y[x],x]==Sin[x], y[0]==1, WhenEvent[y[x]==2.5,Sow[{x,y[x]}]]}, {y[x]}, {x, 0, 10}];
points
is our desired set of points:
{{{2.0944,2.5},{4.18879,2.5},{8.37758,2.5}}}
You can see them on a plot:
Show[Plot[y[x] /. sol, {x, 0, 10}],
ListPlot[points, PlotStyle -> Orange]]
Also, the exact value at any point, e.g. $x=1$ can be retrieved by y[1]/.sol
Sometimes I find it easier to use NDSolveValue
which is exactly the same, but gives the values instead of rules. Look it up and you might find it useful.
It would be better if you had supplied an example problem. It is possible that the answer below will not work in general.
Let's use a simple gravity example where we start with an object 10 feet above the ground and let it free fall.
sol = NDSolve[{h''[t] == -98/10, h'[0] == 0, h[0] == 10},
h, {t, 0, 10/7}]
{{h -> InterpolatingFunction[{{0., 1.42857}}, <>]}}
The method I use to define a function of time from this output (there is more than one method) is:
f[t_] := sol[[1, 1, 2]][t]
Now one can plot it:
Plot[f[t], {t, 0, 10/7}]
If we wanted to know at what time the object would be 4 feet above the ground one could use:
solN = NSolve[f[t] == 4, t]
(* {{t -> 1.10657}} *)
This will give you a warning message about Inverse functions but that is OK.
-
$\begingroup$ That's great! Thanks. Will get right back to trying it out :-) $\endgroup$– ToxApr 9, 2016 at 15:54