text: ## module ridder
  ''' root = ridder(f,a,b,tol=1.0e-9).
      Finds a root of f(x) = 0 with Ridder's method.
      The root must be bracketed in (a,b).
  '''
  import error
  import math
  from numpy import sign
  
  def ridder(f,a,b,tol=1.0e-9):   
      fa = f(a)
      if fa == 0.0: return a
      fb = f(b)
      if fb == 0.0: return b
      if sign(fa) == sign(fb): error.err('Root is not bracketed')
      for i in range(30):
        # Compute the improved root x from Ridder's formula
          c = 0.5*(a + b); fc = f(c)
          s = math.sqrt(fc**2 - fa*fb)
          if s == 0.0: return None
          dx = (c - a)*fc/s
          if (fa - fb) < 0.0: dx = -dx 
          x = c + dx; fx = f(x)
        # Test for convergence
          if i > 0:
              if abs(x - xOld) < tol*max(abs(x),1.0): return x
          xOld = x
        # Re-bracket the root as tightly as possible
          if sign(fc) == sign(fx): 
              if sign(fa)!= sign(fx): b = x; fb = fx
              else: a = x; fa = fx
          else:
              a = c; b = x; fa = fc; fb = fx
      return None
      print('Too many iterations')
  
  