1. Introdução

O Método de Ridder consiste em avaliar a aproximação parcial — obtida em cada iteração pelo Método da Falsa Posição — em uma função de ajuste exponencial, a fim de otimizar a busca pela raiz.

A ideia é semelhante àquela usada pelo Método de Brent, cuja busca intervalar é combinada com um método aberto que possua taxa de convergência superior. Assim como o Método de Brent, possui a vantagem de convergir sempre a uma taxa média superior aos dos métodos intervalares normais. </p>

2. Desenvolvimento do Método

Como queremos encontrar f(x)=0 , vamos tomar

eq1


f \left( x \right) = A+B{e^{Cx}
Sejam três valores de x que estejam delimitando de alguma forma um intervalo que contenha a raiz tal que {x_left,x_predictor,x_right} , cuja amplitude seja $$d_{0}= \left x_{left}-x_{right} \right $$ .Podemos utilizar o Método da Falsa posição para obter uma aproximação da raiz a partir desses pontos neste intervalo:

eq2


x_{predictor}=FalsaPosicao \left( x_{left},x_ \right)

A proposição feita por Ridder é de realizar uma segunda aproximação a partir da fórmula:

eq3


x_{corrector}=x_{left}+d_{0} \left\{ {\frac {\ln \left( \beta \right) }{\ln \left( \alpha \right) } \right\}

onde:

eq4


\alpha={\frac {f_{left}-f_{predictor}}{f_{predictor}-f_{right}}

eq5


\beta={\frac {f_{left}-f_{predictor}}{f_{predictor}-\alpha\,f_{right}}

eq6


fpredictor=f(xpredictor)

eq7


fleft=f(xleft)

eq8


fright=f(xright)

Da série logarítmica[afken], temos:

eq9


\ln \left( 1+x \right) =\sum _{n=1}^{\infty }{\frac { \left( -1\right) ^{n-1}{x}^{n}{n} = x-\dfrac{1}{2}\,{x}^{2}+\dfrac{1}{3}\,{x}^{3}

Uma aproximação satisfatória para o caso pode ser obtida usando-se até o terceiro termo. Desta forma, para x=β1 temos:

eq10


ln(1+{β1})=β112(β1)2+13(β1)3

portanto,

eq11


ln(β)=β112(β1)2+13(β1)3

Para simplificarmos a notação, adotaremos ϕ_β=β1 e ϕ_α=α1 . Desta forma, obtemos facilmente as expressões necessárias para aplicarmos ao método:

eq12


ln(β)=ϕβ12ϕβ2+13ϕβ3

e

eq13


ln(α)=ϕα12ϕα2+13ϕα3

</p>

3. Implementação

 

def ridders(F, xl, xr, errto=0.01, imax=1000):
     """
     Return the root of a function (Using the Ridder's Method)

     ridders(fun, xl, xr, imax, errto)

     * fun: Function where find the roots
     * xl: left bound of interval
     * xr: right bound of interval
     * imax: max of iterations allowed
     * errto: tolerated error

     Author: Pedro Garcia [sawp@sawp.com.br]
     License: Creative Commons
              <http ://creativecommons.org/licenses/by-nc-nd/2.5/br/>
     """
     x = 0
     iterCount = 0
     errno = 1     

     while errno > errto and iterCount < imax:          
          fr = F(xr)
          fl = F(xl)
          d0 = abs(fr - fl)
          x = xr - fr*(xl-xr)/(fl - fr)
          fx = F(x)

          a = (fl - fx)/(fx - fr)
          b = (fl - fx)/(fl - a*fx)
          beta = b - 1
          alfa = a - 1
          lnb = beta - beta*beta/2 + beta*beta*beta/3
          lna = alfa - alfa*alfa/2 + alfa*alfa*alfa/3
          root = xl + d0*lnb/lna
          froot = F(root)

          if fl * fx < 0:
               if xl < root and root < x:
                    if fx * froot < 0:
                         xl = root
                         xr = x
                    else:
                         xr = root
               else:
                    xr = x
          elif fl * fx > 0:
               if x < root and root < xr:
                    if fx * froot < 0:
                         xl = x
                         xr = root
                    else:
                         xl = root
                         fl = froot
               else:
                    xl = x
                    fl = fx
          else:
               if fl == 0:
                    x = xl
               break

          errno = abs(xr - xl)
          iterCount += 1
     return x

Disponível para download em http://www.sawp.com.br/code/rootfind/riders.py </p> </p>

Este documento é disponível sob a licença Creative Commons. As regras dos direitos de cópia deste conteúdo estão acessíveis em http://creativecommons.org/licenses/by-nc-nd/2.5/br/.

References


[afken] G. ARFKEN and H. WEBER, Mathematical methods for physicists, Elsevier, 6th EditionISBN9788535220506 2007, 269–270.
[1] http://en.wikipedia.org/wiki/Ridders%27_method