No post sobre o Método do Ponto Fixo terminei com a observação de que a vantagem real do MPF não é velocidade, mas sim que ele serve de base para métodos mais rápidos, por exemplo, o método de newton.
A ideia central do MPF é construir uma função de iteração tal que na vizinhança da raiz. Quanto menor , mais rápida a convergência. Então o que acontece se a gente escolher de forma que exatamente?
Derivando a fórmula
Toda função de iteração válida tem a forma
Derivando:
Na raiz , , então
Para que :
Assumindo essa forma para todo , ou seja, , e substituindo:
Essa é a função de iteração do Método de Newton. A relação de recorrência fica:
A interpretação geométrica
Tem uma forma mais intuitiva de chegar na mesma fórmula. A reta tangente à curva no ponto é:
O zero dessa reta, ou seja, onde ela cruza o eixo :
Que é exatamente . Newton está aproximando a função por sua tangente a cada iteração e usando o zero dessa reta como próxima estimativa. Se a função for “bem comportada” perto da raiz, a tangente é uma boa aproximação local e o método avança rápido.
Veja como as iterações saltam direto para perto da raiz. A partir do segundo passo, já está na 5ª casa decimal.
Convergência quadrática
O que faz Newton especial é a ordem de convergência. Para o MPF, em geral, a ordem é linear (): o erro cai por um fator constante a cada iteração. Para Newton, como , a análise da convergência mostra que o erro satisfaz:
Ordem : o erro na iteração seguinte é proporcional ao quadrado do erro atual. Na prática, isso significa que o número de dígitos corretos dobra a cada iteração.
A derivada de do método de Newton é . Na raiz, , logo , que é justamente o que queríamos quando derivamos a fórmula.
Implementando em Python
1import math2
3def f(x):4 return x * math.log10(x) - 15
6def df(x):7 return math.log10(x) + 1 / math.log(10)8
9def newton(f, df, x0, eps=1e-5):10 x = x011 k = 012 while True:13 fx = f(x)14 dfx = df(x)15 x_novo = x - fx / dfx16 erro = abs(x_novo - x) / abs(x_novo)17 k += 118 print(f"Iteração {k:2d}: x = {x_novo:.8f}, f(x) = {f(x_novo):.2e}, erro = {erro:.2e}")19 if erro < eps:20 return x_novo21 x = x_novo22
23raiz = newton(f, df, x0=2)24print(f"\nRaiz encontrada: {raiz:.6f}")Rodando para a mesma do post da bissecção, a partir de :
1Iteração 1: x = 2.54117607, f(x) = 2.93e-02, erro = 2.13e-012Iteração 2: x = 2.50630938, f(x) = 1.04e-04, erro = 1.39e-023Iteração 3: x = 2.50618415, f(x) = 1.36e-09, erro = 5.00e-054Iteração 4: x = 2.50618415, f(x) = 0.00e+00, erro = 6.51e-105
6Raiz encontrada: 2.5061844 iterações para . A bissecção precisou de 17 para o mesmo resultado.
O padrão de convergência quadrática aparece nas colunas de erro: de 1.39e-02 para 1.06e-04 é uma queda de , não como seria no caso linear, porque o erro já está pequeno o suficiente para o termo quadrático dominar.
A influência do chute inicial
Para ver na prática o que o teorema diz, considere , com .
a) Chute inicial
| 1 | 1.000000 | −1.000000 | 2.000000 | 1.500000 |
| 2 | 1.500000 | 0.875000 | 5.750000 | 1.347826 |
| 3 | 1.347826 | 0.100681 | 4.449905 | 1.325200 |
| 4 | 1.325200 | 0.002057 | 4.268463 | 1.324718 |
| 5 | 1.324718 | ≈ 0 | 4.264634 | 1.324718 |
Raiz com 6 casas decimais, convergida em 5 iterações.
b) Chute inicial
A derivada se anula em . O ponto está exatamente nessa vizinhança crítica:
A derivada quase nula faz a reta tangente ficar quase horizontal, disparando para longe da raiz. O método não diverge, ele encontra a raiz, mas leva 12 iterações para chegar lá, contra 5 do chute :
| 1 | 0.600000 | −1.3840 |
| 2 | 17.900000 | 5716.44 |
| 3 | 11.946802 | 1692.17 |
| 4 | 7.985520 | 500.24 |
| 5 | 5.356909 | 147.37 |
| 6 | 3.624996 | 43.01 |
| 7 | 2.505589 | 12.22 |
| 8 | 1.820129 | 3.210 |
| 9 | 1.461044 | 0.658 |
| 10 | 1.339323 | 0.063 |
| 11 | 1.324913 | 0.000831 |
| 12 | 1.324718 | ≈ 0 |
Desvantagens
O método exige em todo passo. Se a derivada for zero ou muito próxima de zero, a divisão explode e o método diverge.
A convergência também não é garantida globalmente. O teorema diz que existe um intervalo em torno de tal que, para qualquer , o método convergel, mas não especifica o tamanho desse intervalo. Em funções com muitos zeros ou regiões planas, um chute inicial ruim pode levar o método para longe da raiz que você quer encontrar.
Para esses casos, a estratégia comum é usar a bissecção primeiro para isolar a raiz num intervalo pequeno, e então entregar esse intervalo para Newton refinar rapidamente.