No post anterior eu implementei a bissecção, aquele método que divide o intervalo ao meio repetidamente até se aproximar da raiz. Ele é bem útil em muitos casos, pois sempre converge e consegue prever quantas iterações vai precisa.
O único problema dele é ser lento. Cada iteração reduz o erro pela metade, nem mais, nem menos, não importa o formato da função. A curva pode ser quase reta perto da raiz, o que daria pra convergir em 3 passos, mas a bissecção não sabe disso. Ela divide, olha o sinal, e divide de novo.
Para no exemplo do post anterior, precisamos de 17 iterações. Para , seriam 33. O número de iterações cresce com , cada casa decimal a mais custa 3,3 iterações.
O Método do Ponto Fixo é o próximo algoritmo. Troca a garantia de convergencia por velocidade na convergencia.
Método do Ponto Fixo (MPF)
A equação pode ser reescrita como de infinitas formas. Por exemplo, para :
- , ou seja,
- , ou seja,
Ambas são algebricamente equivalentes, porém o comportamento são diferentes.
Se é raiz de , então , logo . A raiz que buscamos é um ponto fixo de , ou seja, o ponto onde a curva cruza a reta .
O algoritmo é: dado um chute inicial , gera-se a sequência pela relação de recorrência
repetindo até o critério de parada:
1# Pseudo-código do Método do Ponto Fixo2
3x = x₀4enquanto verdadeiro:5 x₁ = φ(x)6 se |x₁ - x| / |x₁| < ε:7 retorna x₁8 x = x₁Visualizando geometricamente
Uma forma interessante de ver o que acontece é plotar e a reta no mesmo gráfico. A raiz é o ponto de interseção entre as duas curvas, porque nesse ponto .
A sequência de iterações aparece como um caminho em espiral entre as duas curvas, você sobe até , depois anda horizontalmente até a diagonal , e aí esse ponto é . Se a curva de “aperta” o caminho a cada passo, o método converge. Se ela “abre”, diverge.
Alterne entre as duas funções de iteração para a mesma equação . Com a sequência espirala para . Com ela explode, veja o valor de saltando para fora da região logo na segunda iteração.
Quando converge?
O Teorema do Ponto Fixo dá o critério, se ambas as condições abaixo são satisfeitas:
- para todo em um intervalo contendo
então a sequência converge para .
Ou seja, a derivada de na vizinhança da raiz precisa ser menor que 1 em módulo. Quanto menor , mais rápida a convergência.
Verificando o exemplo:
Para :
A cada iteração o erro cai por um fator de 0,25. Convergência linear com taxa .
Para :
A cada iteração o erro multiplica por 4. Diverge.
A forma geral de toda função de iteração válida é
com .
Implementando em Python
1import math2
3def phi(x):4 return math.sqrt(6 - x)5
6def ponto_fixo(phi, x0, eps=1e-5):7 x = x08 k = 09 while True:10 x_novo = phi(x)11 erro = abs(x_novo - x) / abs(x_novo)12 k += 113 print(f"Iteração {k:2d}: x = {x_novo:.8f}, erro = {erro:.2e}")14 if erro < eps:15 return x_novo16 x = x_novo17
18raiz = ponto_fixo(phi, x0=3)19print(f"\nRaiz encontrada: {raiz:.6f}")1Iteração 1: x = 1.73205081, erro = 7.32e-012Iteração 2: x = 2.06590154, erro = 1.62e-013Iteração 3: x = 1.98345619, erro = 4.16e-024Iteração 4: x = 2.00413168, erro = 1.03e-025Iteração 5: x = 1.99896681, erro = 2.58e-036Iteração 6: x = 2.00025828, erro = 6.46e-047Iteração 7: x = 1.99993543, erro = 1.61e-048Iteração 8: x = 2.00001614, erro = 4.04e-059Iteração 9: x = 1.99999596, erro = 1.01e-0510Iteração 10: x = 2.00000101, erro = 2.52e-0611
12Raiz encontrada: 2.000001O padrão é claro é: o erro cai por um fator de aproximadamente 4 a cada iteração, exatamente o que prevê. São 10 iterações para .
Vantagens e limitações
O método do ponto fixo tem convergência linear com taxa . A bissecção também tem convergência linear com taxa , mas sempre converge.
A vantagem real do MPF não é velocidade por si só, é que ele serve de base para métodos mais rápidos.