1.1.3 Raízes de Equações — Métodos Intervalares — Método de Rider
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
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: |
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:
x_{corrector}=x_{left}+d_{0} \left\{ {\frac {\ln \left( \beta \right) }{\ln \left( \alpha \right) } \right\}
onde:
\alpha={\frac {f_{left}-f_{predictor}}{f_{predictor}-f_{right}}
\beta={\frac {f_{left}-f_{predictor}}{f_{predictor}-\alpha\,f_{right}}
fpredictor=f(xpredictor)
fleft=f(xleft)
fright=f(xright)
Da série logarítmica[afken], temos:
\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:
ln(1+{β−1})=β−1−12(β−1)2+13(β−1)3
portanto,
ln(β)=β−1−12(β−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:
ln(β)=ϕβ−12ϕβ2+13ϕβ3
e
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>
4. Copyright
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/.