Extract particular value from NDSolveValue

How do I extract values from NDSolveValue at particular point: for example how do I extract the last point?

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.