How do I extract values from NDSolveValue
at particular point: for example how do I extract the last point?
2 Answers
the result of NDSolveValue
is an interpolation function. Example.
sol[x_] =
NDSolveValue[{ y''[x] + y[x] == 0 , y[0] == 0, y'[0] == 1,
WhenEvent[y[x] == 0, "StopIntegration"]}, y[x], {x, 0, 20}]
you can do sol["Methods"]
to see a bunch of descriptve data available:
{"Coordinates", "DerivativeOrder", "Domain", "ElementMesh", "Evaluate", "Grid", "InterpolationMethod", "InterpolationOrder", "MethodInformation", "Methods", "OutputDimensions", "Periodicity", "PlottableQ", "Properties", "QuantityUnits", "ValuesOnGrid"}
Grid
holds the actual evaluation points, so the last point is:
end=sol["Grid"][[-1,1]]
3.14159
in this case since we didn't know the domain in advance its useful to set the range for Plot
:
Plot[sol[x], {x, 0, end}]
here is a plot of the actual solution points:
ListPlot[Transpose[{Flatten[sol["Grid"]], sol["ValuesOnGrid"]}]]
If all you want is the last point, there's an even easier method. Using george's example:
NDSolveValue[{y''[x] + y[x] == 0, y[0] == 0, y'[0] == 1}, y[20], {x, 20}]
0.912945
and you can see that the value at x == 20
is returned at once.
If you're using WhenEvent[]
for event detection, you can use the second argument to throw a result at once:
Quiet[Catch[NDSolveValue[{y''[x] + y[x] == 0, y[0] == 0, y'[0] == 1,
WhenEvent[y[x] == 0, Throw[{x, y[x]}]; "StopIntegration"]},
{}, {x, ∞}]], NDSolveValue::noout]
{3.14159, 1.00614*10^-16}
and you get the point where the integration was stopped, without needing to produce the usual InterpolatingFunction[]
output.