RE: nested FindRoot
- To: mathgroup at smc.vnet.net
- Subject: [mg20929] RE: [mg20904] nested FindRoot
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Wed, 1 Dec 1999 01:49:59 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Peter Klamser wrote: ------------------------- Hello, when I try to use FindRoot on a function that also uses FindRoot nothing happens. Is because FindRoot has the Attribute HoldAll? ------------------------- I get it working below. It probably helps a lot to make sure FindRoot does not evaluate when it would fail. Below (f), (g) are only defined when (x1), (x2) are Real. If FindRoot did evaluate when (x1),(x2) are symbols it would fail. In the definition of (f) I give only one starting value so Newton's method is used. This works since Mathematica can find the derivative D[Exp[t]+t^3-x1, t] For the definition of (g) I must give two starting points. This causes FindRoot to use secant method or Brent's method which don't need symbolic derivatives. Actually I could have used Newton's method if I figured out what to use for the Jacobian option in FindRoot. In[1]:= Off[FindRoot::frmp,FindRoot::frsec]; SetOptions[FindRoot,MaxIterations->100,AccuracyGoal->Infinity]; In[3]:= f[x1_Real]:=t/.FindRoot[Exp[t]+t^3==x1,{t,0}]; g[x2_Real]:=t/.FindRoot[t^2+f[t]+ArcTan[t]==x2,{t,-300,300}] In[5]:= g[3.4] Out[5]= -2.44411 Above I get an answer for g[3.4] Let's verify that it is a valid solution. At Out[8] we see that (v==f[u]) is True. Then at Out[9] we see that (u==g[3.4]) is True. So the solution works. In[6]:= u=g[3.4]; v=f[u]; In[8]:= Exp[v]+v^3==u Out[8]= True In[9]:= u^2+f[u]+ArcTan[u]==3.4 Out[9]= True -------------- Note: Often times there is an art to getting FindRoot to converge. -------------------- Regards, Ted Ersek For Mathematica tips, tricks see http://www.dot.net.au/~elisha/ersek/Tricks.html