Méthode de la sécante

Un article de Wikipédia, l'encyclopédie libre.

En analyse numérique, la méthode de la sécante est un algorithme de recherche de racines d'une fonction f.

Sommaire

[modifier] La méthode

La méthode de la sécante est une méthode dérivée de celle de Newton où l'on remplace f'(x_n)\, par \frac{f(x_n)-f(x_{n-1})}{x_n-x_{n-1}} On obtient la relation de récurrence

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

L'initialisation nécessite 2 points x0 et x1, proches, si possible, de la solution recherchée.

[modifier] Démonstration

La courbe rouge représente la fonction f et le segment en bleu, la sécante.
La courbe rouge représente la fonction f et le segment en bleu, la sécante.

Étant donné a et b, on construit le segment reliant (a, f(a)) et (b, f(b)). La droite peut être définie ainsi :

 y - f(b) = \frac{f(b)-f(a)}{b-a} (x-b).

On choisit c de telle sorte que c soit la racine de cette droite (c'est-à-dire, f(c)=0).

 f(b) + \frac{f(b)-f(a)}{b-a} (c-b) = 0.

Si on extrait c de cette équation, on retrouve la relation de récurrence citée plus haut.

[modifier] Convergence

Si les valeurs initiales de x0 et de x1 sont suffisamment proches de la solution, la méthode aura un ordre de convergence de

 \varphi = \frac{1+\sqrt{5}}{2} \simeq 1,618 qui est le nombre d'or.

Toutefois, la fonction f doit être 2 fois continuement différentiable et ce doit être une racine simple.

[modifier] Exemple d'implémentation

Ce programme en C résout le problème f(x) = cos(x) - x3 = 0. Les tests d'arrêts sont les suivants :

  • | xn + 1xn | < e
  • n > m

m et e étant donnés.

#include <stdio.h>
#include <math.h>
  
double f(double x)
{
    return cos(x) - x*x*x;
}
 
double SecantMethod(double xn_1, double xn, double e, int m)
{
    int n;
    double d;
    for (n = 1; n <= m; n++)
    {
        d = (xn - xn_1) / (f(xn) - f(xn_1)) * f(xn);
        if (fabs(d) < e)
            return xn;
        xn_1 = xn;
        xn = xn - d;
    }
    return xn;
}
 
int main(void)
{
    printf("%0.15f\n", SecantMethod(0, 1, 5E-11, 100));
    return 0;
}

On obtient les résultats suivants :

 x_0 = 0\,\!
 x_1 = 1\,\!
 x_2 = 0,685073357326045\,\!
 x_3 = 0,841355125665652\,\!
 x_4 = 0,870353470875526\,\!
 x_5 = 0,865358300319342\,\!
 x_6 = 0,865473486654304\,\!
 x_7 = 0,865474033163012\,\!
 x_8 = 0,865474033101614\,\!

[modifier] Voir aussi