RE: The equivalent of FindRoot for an interpolating function
- To: mathgroup at smc.vnet.net
- Subject: [mg37480] RE: [mg37470] The equivalent of FindRoot for an interpolating function
- From: "David Park" <djmp at earthlink.net>
- Date: Fri, 1 Nov 2002 01:42:55 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Philip,
It is difficult with FindRoot because of the nature of your function and the
inadequacies of FindRoot.
sol = NDSolve[{y'[t] == 1 - y[t], y[0] == 0}, y, {t, 0, 20}]
fy = y /. sol[[1]]
{{y -> InterpolatingFunction[{{0., 20.}}, "<>"]}}
InterpolatingFunction[{{0., 20.}}, "<>"]
Just to see what the function looks like...
Plot[fy[x], {x, 0, 20},
PlotRange -> {0, 1}];
The InterpolatingFunction is only defined between 0 and 20. That gives
FindRoot lots of problems.
FindRoot[fy[x] == 0.99, {x, 15, 0, 20}]
FindRoot::"regex": "Reached the point \!\({\(-133.32815729997475`\)}\) which
\
is outside the region \!\({\({0.`, 20.`}\)}\)."
{x -> -133.328}
I do not understand why FindRoot doesn't go to a bisection method once it
goes outside the range. I suppose there is a reason.
In any case, Ted Ersek has a much better root finding package called
RootSearch. I believe it is available on MathSource. (My one objection to
the copy of his package that I have is that it is not in a well defined
folder. It was in my ExtraPackages\Enhancements folder, but the name in the
BeginPackage statement did not correspond. So it wouldn't load. I simple
added the Enhancement context to the name and then it loaded. I am not
certain how the MathSource copy works.)
Needs["Enhancements`RootSearch`"]
xsol = RootSearch[fy[x] == 0.99, {x, 0, 20}][[1, 1]]
x -> 4.60521
fy[x] /. xsol
0.99
A very neat package.
David Park
djmp at earthlink.net
http://home.earthlink.net/~djmp/
From: Philip M. Howe [mailto:pmhowe at lanl.gov]
To: mathgroup at smc.vnet.net
Hi Folks,
I wish to find the value of the independent variable in an
interpolating function that makes the dependent variable assume some
value of interest. For example,
sol = NDSolve[{y'[t] == 1-y[t], y[0]==0}, y, {t, 0, 20}]
fy = y/.sol[[1]]
produces an interpolating function. I would like to extract the
value of t that yields a value of 0.99 or 0.9999 (say) for y. Is
there a straightforward way of doing this?
Thanks in advance for the help.
Regards,
Phil
--
Philip M. Howe
Program Manager, Stockpile Surety
Los Alamos National Laboratory
(505) 665-5332
(505) 667-9498
Fax: 505-665-5249
email pmhowe at lanl.gov
Mail Stop P945