RE: Help with findroot
- To: mathgroup at smc.vnet.net
- Subject: [mg9236] RE: [mg9202] Help with findroot
- From: Ersek_Ted%PAX1A at mr.nawcad.navy.mil
- Date: Fri, 24 Oct 1997 01:00:50 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Following up on the discussion between Sean Ross and Karl: |> |> 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}] |> |To shed some light on what is happening, try plotting both |sides of your equation independently and see where they cross ie: | I think it's better to plot the difference between the left hand side and right hand side. The solution is where the difference is zero. I think this is why the command is called FindRoot instead of FindEqual. | |There are two methods that come to mind. | |1) Engineering approach. Tangent changes value so rapidly near the |roots that any kind of precision is going to be both hard to achieve |and potentially meaningless, so just do the graphic solution and let |the roots be equal to the vertical asymptotes of Tangent, ie x/(1.2*10^ |-4)=n Pi/2. Before proceeding, ask yourself exactly why you need those |roots and how much precision you need and how hard you are willing to |work to get it. | I agree with the above. | |2) For really ugly root finding problems, the Bisection method is |usually the best. It is generally the first algorithm mentioned in |Numerical Methods textbooks because it is very simple. It is |comparatively slow, but always converges and does not depend on |derivatives or slopes. | However, Mathematica will use Brent's method if f[x_]:= (left hand side - right hand side) has opposite sign at the two initial guesses. Brent's method is very effective. It's uses a combination of bisection and 2nd order inverse interpolation. If you are interested read about Brent's method in Numerical Recipes in C. Brent's method is also guaranteed to converge, and doesn't need values of the functions derivatives. If your problem has any practical significance, and the function is continuous at a first order root you can be pretty sure Brent's method will converge faster than bisection. Usually 8-12 iterations does the trick. However, the Bisection method will converge the fastest in the worst case scenario. Note: I have special bag of tricks for efficiently finding a multiple root. e-mail me if you are interested. | |As a general point of problem solving technique, it is usually a good |idea to learn as much about your problem as you can before attempting |to solve it. In your case, graphing out the functions would have told |you that something was fishy before starting out. It also shows that |no collection of canned routines(like mathematica) can substitute for a |working knowledge of numerical methods. | I agree with the above. Ted Ersek ersek_ted%pax1a at mr.nawcad.navy.mil