Re: Help with findroot
- To: mathgroup at smc.vnet.net
- Subject: [mg9181] Re: [mg9169] Help with findroot
- From: Olivier Gerard <jacquesg at pratique.fr>
- Date: Tue, 21 Oct 1997 02:02:54 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Hi Karl, Your example is clearly a difficult one for any general purpose routines because the function whose zeros you try to find is a very regular one (square root) ponctuated by the essential singularities of the other (tangent). As the method used by FindRoot is Newton descent, if you don't give starting values sufficiently close on the *same* side of the singularity, you cannot expect much in this case. How can we do that ? As Tan[x] dominates all the rest near the singularities, you can find a good approximation of all the roots by just looking at Tan[f[x]] roots. This gives a table of the first 10: rootlist = Table[ Evaluate[First[ (x/. Solve[ Sqrt[x/(1.2 10^-4)] == (2 k+1) Pi/2,x])]],{k,1,10}] and you can then feed Findroot with these values. If you remark that Tan[x] tends to -Infinity when x tends to Pi/2 from the right, you know you must add a small quantity to the Tan[f[x]] root to bracket the root you are searching for. Here is a complete example: In[1]:= x/. Map[ FindRoot[Sqrt[x/(12 10^-5)]==-1/10 Tan[Sqrt[x/(12*10^-5)]], {x,#,#(1+2/100000)}, WorkingPrecision->30, MaxIterations ->24]&, Table[Evaluate[First[ (x/. Solve[ Sqrt[x/(12 10^-5)]==(2k+1) Pi/2, x]) ] ],{k,1,10}] ] FindRoot::"frdig": "\!\(30\) working digits is insufficient to achieve the absolute tolerance \!\(1.00000000000000000065`*^-20\)." FindRoot::"frdig": "\!\(30\) working digits is insufficient to achieve the absolute tolerance \!\(1.00000000000000000065`*^-20\)." Out[1]= { 0.00268873607796611887069764090412, 0.0074261826194566946160960896946, 0.0145323079006264369142195053877, 0.0239836183574210343873004975396, 0.035827380509233890874647154856, 0.050062891245430953402233797855, 0.066643827402591068860991918233, 0.085593468362931953353908980075, 0.106911814227110340526576903488, 0.130598865050298892779541380190 } In such cases, you must to be able to conduct the calculation with as many digits as necessary, so don't artificially limit Mathematica precision by using fixed precision numbers such as 1.2. The simplest way is to use fractions as demonstrated in my code. If you don't do this, Mathematica will complain it has not enough precision to achieve what you want. Note that there were two cases for which the automatic accuracy goal (=working precision - 10=20) was not achieved. You can change that by setting explicitely accuracy goal to 20 and increasing WorkingPrecision to a higher level. It was necessary to increase the MaxIterations option as the slope of the function was large. Hope it helps. Olivier Gerard At 09:38 +0200 97.10.16, Karl Kevala wrote: > I'm having a problem using findroot to solve an equation. Perhaps > someone > could shed some light on what's wrong. > > FindRoot[Sqrt[x/(1.2 10^ -4)]==-0.1*Tan[Sqrt[x/(1.2*10^ > -4)]],{x,0.1,0.1,2}] > > Mathematica 3. returns a value of -0.07 for x which is not anywhere > close to correct. > Further, I've tried several different starting values and min/max > limits, but > a negative answer is always returned. Eventually I'de like to compile > a list > of all the roots of the equation up to, say, x=1000, but I can't even > get one > right now. > > Thanks, > > Karl Kevala