Integration numerique par methode de simpson

Contenu du snippet

En fait, c'est un programme que j'ai écrit au départ en langage C que j'ai d'ailleurs publié sur cppfrance.com. J'ai décidé de me mettre au Java. Il se peut que mon code ne soit pas trop optimisé pour ce langage. Donc je suis ouvert à toutes remarques.
Description de l'algorithme:
METHODE DE SIMPSON:
C'est une méthode de Newton-Cotes: on subdivise l'intervalle d'intégration [a,b] en n sous-intervalles de longueur égale h.

h=(b-a)/n
xi = a+i*h avec : i=0,...,n

Sur chaque sous-intervalle [xi, xi+2], avec i pair, on remplace f par son polynôme d'interpolation de degré 2 (arc de la parabole) passant par les points (xi, f(xi)), (xi+1, f(xi+1)) et (xi+2, f(xi+2)). Conséquence n doit être pair.
Notation: I(a,b)=>f(x): integrale de a à b de f(x).
S(i=1,n): Somme de i=1 à n.

FORMULE DE BASE:
I(xi, xi+2)=>f(x) = h/3*[f(xi) + 4*f(xi+1) + f(xi+2) ]; i= 0,..., n-2, i pair.

FORMULE COMPOSITE:
I(a,b)=>f(x) = h/3*[f(a) + f(b) + 2*S(i=1, n/2-1)f(a+2*i*h) + 4*S(i=1,n/2)f(a + (2*i-1)*h)]

Source / Exemple :


public class integrale {

public static double F(double x) {
double val = Math.exp(-x*x/2.0);
return val;
}

public static double simpson(int N, double A, double B) {
double X, h, Iapp0, Iapp1, Iapp2, Iapp;
  int NN, i;

  // Etape 1
  h = (B - A) / N;

  // Etape 2
  Iapp0 = F(A) + F(B);
  Iapp1 = 0.0;
  Iapp2 = 0.0;

  // Etape 3
  NN = N -1;
  for (i=1; i<=NN; i++)
    {
      // Etape 4
      X = A + i*h;
      // Etape 5
      if ((i%2) == 0)
        Iapp2 = Iapp2 + F(X);
      else
        Iapp1 = Iapp1 + F(X);
    }

  // Etape 6
  Iapp = (Iapp0 + 2.0 * Iapp2 + 4.0 * Iapp1) * h / 3.0;

  // Etape 7
  return (Iapp);
}

public static void main(String args[] ) {
    int i,n;
    double a,b,spmthd;

    a=1.0; /* Borne inferieure */
    b=2.0; /* Borne superieure */
    n=10; /* Nombre d'iteration */

    simpson(n,a,b);
    spmthd=simpson(n,a,b);  /* on stock dans une variable tampon */

	System.out.println("L'integrale vaut:"+spmthd);
}
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.