Integration numerique methode de gauss-legendre

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 387 fois - Téléchargée 36 fois

Contenu du snippet

La methode de Gauss-Legendre de rang k consiste à remplacer la fonction f par son polynôme d'interpolation de degré k en passant par les points d'abscisses qui sont les racines du polynôme de Legendre de degré k+1.

Polynôme de Legendre s'écrit : Pk(x) = 1/(2^k*k!)* dk/dx^k[x²-1]^k; k=0,...
soit:
P0(x) = 1, P1(x)=x, P2(x) = 1/2(3x²-1)... etc

relation de recurrence:
k*Pk(x) = (2k-1)*xPk-1(x)-(k-1)Pk-2(x); k = 2,3...

notons rkj les racines de Pk+1(x); j=0,...,k
L'intégrale I est approchée par :

Gk = (b-a)/2 * Somme(j=0,k)de_Alpha_k_j*[((b-a)/2)*rkj + (a+b)/2] avec:

Alpha_k_j = [ 2*(1-rkj²) / ((k+1)²[Pk(rkj)]²) ]

Source / Exemple :


#include <stdio.h>
#include <math.h>

double f(double x) /*fonction à intégrer */
{
 return(exp(-x*x/2.0));
}

double pol_leg(int k,double x)
{
 int i;
 double p,p1,p2;
 p=1;p1=0;p2=0;
 for(i=1;i<=k;i++)
 {
  p2=p1;p1=p;
  p=((2*i-1)*x*p1-(i-1)*p2)/i;
 }
 return(p);
}

double gauss_legendre(double a,double b,int k)
{
 int j;
 double h,r,alpha,pol,s,t,racine[5];
 switch(k) {
 case 0:racine[0]=0.0;break;
 case 1:racine[0]=1.0/sqrt(3.0);racine[1]=-racine[0];break;
 case 2:racine[0]=sqrt(3.0/5.0);racine[1]=0.0;racine[2]=-racine[0];break;
 case 3:racine[0]=sqrt((15+2*sqrt(30))/35);racine[1]=sqrt((15-2*sqrt(30))/35);
	racine[2]=-racine[1];racine[3]=-racine[0];break;
 case 4:racine[0]=sqrt((35+2*sqrt(70))/63);racine[1]=sqrt((35-2*sqrt(70))/63);
	racine[2]=0.0;racine[3]=-racine[1];racine[4]=-racine[0];break;
 }
 h=b-a;
 t=0;
 s=0.0;
 for(j=0;j<=k;j++)
 {
  r = racine[j];
  pol = pol_leg(k,r);
  alpha = 2.0*(1.0-r*r)/((k+1)*(k+1)*pol*pol);
  s += alpha*f(h/2*(1+r)+a);
 }
 t += h/2*s;
 return(t);
}
int main(int argc, char *argv[])
{
 int k;
 double a,b,t;

 a=1;b=2.0; /* Borne d'intégration [a;b] */

 printf("Méthode de Gauss-Legendre\n");

 printf("\nRang k      Valeur calculee       \n");
 for(k=0;k<=4;k++)
 {
  t=gauss_legendre(a,b,k);
  printf("%4d            %lf  \n",k,t);
 }

  return 0;
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
273
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
31 mars 2015
2
Je crois que c'est l'algorithme primal du simplexe de Dantzig.
De toute façon il y a une rubrique spéciale sur cppfrance qui s'appelle forum où l'on peut poser ce genre de questions.
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
s'il te plait

c'est quoi la maximisation simplexe ?
Messages postés
4
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
23 avril 2005

salut pour tous
j'ai besoin d'un programme en longage c avec algorithme
pour la mehode de maximisation simplexe
Messages postés
1
Date d'inscription
samedi 1 janvier 2005
Statut
Membre
Dernière intervention
1 janvier 2005

hi
je veux la programmation de la methode de gauss en langauge C
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
Huurmmff... pas tres explicite tout ca...

Ca donne l'integrale approchée d'une fonction entres 2 bornes?
Est ce qu'on peut avec ca calculer la surface d'un objet plan ayant n'importe quelle forme?

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.