Método das secantes

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

Em análise numérica, o método das secantes é um algoritmo de busca de raízes que usa uma sequência de raízes de linhas secantes para aproximar cada vez melhor a raiz de uma função f.
O método da secante pode ser pensado como uma aproximação por diferenças finitas do método de Newton. No entanto, foi desenvolvido independentemente do método de Newton, e antecedeu-o por mais de 3.000 anos[1] .

O método[editar | editar código-fonte]

As duas primeiras iterações do método das secantes. A curva vermelha mostra a função f e as linhas azuis são as secantes.

O método das secantes é definido pela relação de recorrência

x_{n+1} = x_n - \frac{x_n-x_{n-1}}{f(x_n)-f(x_{n-1})} f(x_n)

ou

x_{n+1} = \frac{x_{n-1}f(x_n)-x_nf(x_{n-1})}{f(x_n)-f(x_{n-1})}

Como pode ser visto da relação de recorrência, o método das secantes requer dois valores iniciais, x0 e x1, que devem ser preferencialmente escolhidos próximos da raiz.

Derivação do método[editar | editar código-fonte]

Dados xn−1 e xn, construímos uma reta passando pelos pontos (xn−1, f(xn−1)) e (xn, f(xn)), como ilustrado na figura à direita. Note que essa reta é uma secante ou corda do gráfico da função f.
Na forma ponto-declividade, ela pode ser definida como

 y - f(x_n) = \frac{f(x_n)-f(x_{n-1})}{x_n-x_{n-1}} (x-x_n).

Agora escolhemos xn+1 como zero dessa reta, então xn+1 é escolhido de modo que

 f(x_n) + \frac{f(x_n)-f(x_{n-1})}{x_n-x_{n-1}} (x_{n+1}-x_n) = 0.

Resolvendo essa equação, obtém-se a relação de recorrência para o método das secantes.

Convergência[editar | editar código-fonte]

As iterações xn do método das secantes convergem para uma raiz de f, se os valores iniciais x0 e x1 estiverem suficientemente próximas da raiz. A ordem de convergência do método é α, onde

 \alpha = \frac{1+\sqrt{5}}{2} \approx 1.618

é a razão áurea. Em particular, a convergência é superlinear.

Esse resultado só vale sob certas condições técnicas; a saber, f deve ser duas vezes continuamente diferenciável e a raiz em questão deve ser simples (isto é, não deve ser uma raiz múltipla).

Se os valores iniciais não estiverem próximos da raiz, não se pode garantir que o método das secantes convergirá.

Exemplos Computacionais[editar | editar código-fonte]

Eis implementações do método das secantes em algumas linguagens de programação.

Matlab[editar | editar código-fonte]

Neste exemplo o método das secantes é aplicado para encontrar uma raiz da função f(x) = x3 −10x2 -400.
Os valores iniciais são x0=20 e x1=30; o número de iterações é n=8.
Espera-se que a iteração irá convergir para x=12,5426 após um número suficiente de iterações.

f=@(x) x^3 -10*x^2 -400;
x(1)=20;
x(2)=30;
n=8;
j=n+3;
for i=3:j
    x(i) = x(i-1) - (f(x(i-1)))*((x(i-1) - x(i-2))/(f(x(i-1)) - f(x(i-2))));
end
root=x(j)

Linguagem C[editar | editar código-fonte]

Uso do método das secantes para encontrar uma raíz da função func cujo valor acredita-se estar próximo de x1 e x2.
A raíz, a ser retornada por secantes(), é aprimorada até atingir uma acurácia próxima de tolerancia.

#include <math.h>
#define MAX_ITERACOES 30
float secantes(float (*func)(float), float x0, float x1, float tolerancia) {
    void nrerror(char error_text[]);
    int j;
    float x2,f0,f1;
    f0=(*func)(x0);
    for (j=1; j<=MAX_ITERACOES; j++) {
        fl=(*func)(x1);
        x2=x1-(xl-x0)*f1/(f1-f0);
        if (fabs(x2-x1) < tolerancia || f == 0.0) return x2;
        x0=x1;
        x1=x2;
        f0=f1;
    }
    nrerror("Número máximo de iterações excedido!");
    return 0.0; //não é executado
}

Scilab[editar | editar código-fonte]

A função Secante recebe como parâmetro uma função f e procura uma raíz próxima de x0 e x1, até que seja atingida uma tolerância tol ou um número máximo de iterações N.
A variável controle evita que reduções temporárias na tolerância sejam consideradas.

function x2=Secante(f,x0,x1,tol,N)
    if f(x0)==f(x1) then
        mprintf('A primeira secante é horizontal')
        pause;
    end
    k=0
    controle=0
    f0=f(x0)
    f1=f(x1)
    while controle<3 &k<N  &x0~=x1
        k=k+1
        x2=(x0*f1-x1*f0)/(f1-f0)
        delta=abs(x2-x1)
        if delta<tol*abs(x2) then
            controle=controle+1
        else
            controle=0
        end
        x0=x1
        x1=x2
        f0=f1
        f1=f(x1)
        mprintf('k=%d,\ x=%.12f\n',k,x2)
    end
endfunction

Notas[editar | editar código-fonte]

Ver Também[editar | editar código-fonte]

Método da posição falsa

Referências[editar | editar código-fonte]

Ligações Externas[editar | editar código-fonte]