1.2.2 Raízes de Equações — Métodos Abertos — Newton Raphson
1. Introdução
O método de Newton-Raphson é outro método aberto, pois a convergência à raiz não depende da delimitação de um intervalo, possuindo as propriedades descritas do Método do Ponto Fixo.
Provavelmente é o método numérico mais aplicado computacionalmente para a aproximação de raízes, graças à sua capacidade de rápida convergência.
2. Desenvolvimento do Método
Na Figura metodo, observamos que a partir da aproximação inicial da raiz é possível estender uma reta tangente do ponto . O ponto onde esta tangente intercepta o eixo das abcissas é a segunda estimativa, . Desta figura, é visível que a inclinação é equivalente à
$$ \dfrac{ d }{ d x } f(x_{i}) = \dfrac{ f(x_{i}) }{ \left( x_{i} – x_{i+1} \right) } $$
isolando , aparece naturalmente a iteração conhecida como o Método de Newton:
$$ x_{i+1} = x_{i} – \dfrac{f(x_{i})}{\dfrac{ d }{ d x } f(x_{i})} $$
Como no Método do Ponto Fixo, basta executar sucessivas aproximações para convergir à raiz, tendo como critério de parada um erro pré-definido.
3. Implementação
A implementação deste método consiste em basicamente alterar o código do Ponto Fixo de forma utilizar a chamada da expressão deduzida ao invés da própria função :
def newtonRaphson(G, diffG, x0, errto, imax):
"""
return the root of a function (using the Newton-Raphson Method)
newtonRaphson(fun, diffFun, x0, errto, imax)
* fun: Function where find the roots
* diffFun: analytic derivative of fun
* x0: next point (estimative)
* errto: tolerated error
* imax: max of iterations allowed
Author: Pedro Garcia [sawp@sawp.com.br]
see: http://www.sawp.com.br
License: Creative Commons
Dec 2009
"""
x1 = x0 - G(x0)/diffG(x0) # fixed point x1 = G(x0)
iterCount = 0
errno = fabs((x1 - x0)/x1)
while errno > errto and iterCount < imax:
x0 = x1
x1 = x0 - G(x0)/diffG(x0) # in fixed point will be x1 = G(x0)
iterCount += 1
if x1 != 0:
errno = fabs((x1 - x0)/x1)
return x1
Veja que a implementação do método de Newton-Raphson é dependente de mais uma função, que precisa ser declarada. Embora este método não dependa da escolha da melhor função G, como ocorre no método do Ponto Fixo, o codificador precisa implementar tanto a função que se deseja conhecer a raiz como a sua derivada.
Um exemplo de utilização deste código pode ser encontrado em http://www.sawp.com.br/code/rootfind/newtonraphson.py
4. Observações
Embora o método do Newton-Raphson seja quase sempre o mais eficiente na busca de raízes, ele nem sempre é aplicável. Um exemplo interessante está em comparar as funções de avaliação do Método do Ponto Fixo e as do código de Newton-Raphson.
Ao utilizarmos Newton-Raphson para buscar a raiz da função:
G1 = exp(1.d0)**(-x/2.d0)
e usando sua derivada:
diffG1 = (1/2)*(exp(1.d0))**(-(1.d0/2.d0)*x)
o programa gera um resultado que não converge à raiz. Provavelmente se o código for compilado e executado, o resultado será “NaN” ou “infinity”.
5. Copyright
Este documento está 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/.