# NDSolve break condition

I'm solving a differential equation numerically by

NDSolve[{p'[r] == -function[r,p[r]], p == pcenter}, p,{r, 0, rmax}]


with function>0. At some r, p[r] becomes negative. I want NDSolve to stop as soon as this happens and save the value of r. Any ideas how to do this?

• WhenEvent is what you want – acl Jul 12 '14 at 12:52
• exactly. thank you! – dan-ros Jul 12 '14 at 12:54
• @acl I posted an answer using what I learned from your comment. Thanks! By the way, I'm involving you in an experiment without your permission (sorry!) – Ian Jun 5 '15 at 21:50
• @Ian excellent, up voted. Happy to serve as a guinea pig. – acl Jun 5 '15 at 22:41
• @lan I read through your experiment. I feel reluctant to formally accept your answer though because I never actually tested the code – dan-ros Jun 7 '15 at 16:10

## 1 Answer

A WhenEvent[event, action] can be included in the list eqn used in NDSolve[eqn,__]. For example:

eqn = {
p'[r] == -p[r] - 1,
p == 1,
WhenEvent[p[r] == 0, rMax = r; "StopIntegration"]
};
sol = NDSolve[eqn, p, {r, 0, \[Infinity]}];
Plot[p[r] /. sol, {r, 0, rMax}]

• FYI: The last r is in fact the endpoint of the domain of the solution. The domain may be obtained with p["Domain"] /. sol. (Of course, it can be convenient to save it in a variable rMax as you did, too.) – Michael E2 Jun 5 '15 at 22:18