Romberg integration

Soyez le premier à donner votre avis sur cette source.

Vue 10 901 fois - Téléchargée 510 fois

Description

Il s'agit d'une méthode (si ce n'est la méthode) d'intégration numéric de fonction, dans le cas univarié(f(x)dx)

Source / Exemple :


#include "iostream.h"
#include "math.h"
#include "Romberg.h"

int main()
{
        // tableau contenant des paramêtres qui n'entre pas dans l'intégration
	double * Tab;
	Tab = new double[2];

  • Tab=2.0;
  • (Tab+1)=1.0;
//constructeur Romberg R(1,2,Tab); cout << endl <<R.RI(); cout << endl; delete [] Tab; return 0; } //voila pour le .h qui contient la définition de la classe #ifndef Romberg_H #define Romberg_H #include "math.h" #define Tol 0.000000001 class Romberg { public: double a; //borne inf double b; //borne sup double * para; //pointeur de tableau contenant les paramétres additionnelles de la fonction Romberg(double A, double B, double *Para) { a=A; b=B; para=Para; //ici il n'y a qu'1 paramétre } //fonction à intégrer et à editer (ici f(x)=1/(x^k) + g //on intégre par rapport à x, k et g sont des paramêtres additionnelles double ff(double i) {return pow(i,- *para)+ *(para+1);} //fin de la fonction double TR(double n) { double i, temp, H; temp=0; H = (b - a) / n; for(i=a; i<=b; i+=H) { if(i==a || i==b ) {temp +=ff(i) / 2;} else {temp +=ff(i);} } return temp * H; } double Ink(double R1,double R2,int k) { return (pow(4,k) * R1 - R2) / (pow(4,k) - 1); } double RI() { const int MaxIter = 11; double temp; double Mresult[MaxIter][MaxIter]; int n, k, i, m; m = 0; for(k=0;k<MaxIter;k++) { n = static_cast<int>(pow(2,k)); if(n==1) {Mresult[m][0] = TR(n);} else {Mresult[m][0] = TR(n);} for(i=1;i<=k;i++) {Mresult[m][i] = Ink(Mresult[m][i-1], Mresult[m - 1][i-1], i);} temp= fabs(Mresult[m-1][m-1] - Mresult[m][m]); if(temp<Tol && m>=2){k = 10;} temp= Mresult[m][m]; m++; } return temp; } }; #endif

Conclusion :


Le zip contient le document qui m'a servit a creer ce code.
De plus vous pouvez trouvez un alpgorithme de Romberg dans "Numerical Recepices" mais sensiblement différent. Il utilise notament une interpolation polynomial pour une raison qui m'échape (cf: pdf)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

20 déc. 2005 à 14:16
Moui, tu peux faire un interpéteur d'expressions mathématiques, c'est pas la mort à programmer (faut faire un arbre), mais ça sera assez lent ...
rambc
Messages postés
224
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
29 mars 2009

20 déc. 2005 à 13:29
A mon avis, ton problème est TRES proche de celui de la fabrication d'une calculatrice. Tu peux gérer ta formule comme une chaîne de caractères puis remplacer la variable par la valeur numérique qui t'intéresse. Ainsi ton module acceptera tout type de fonction et de variable.

Etant une "quiche" en C++, je ne peux que lancer tes idées très théoriques.

Si tu arrives à faire quelques chose d'intéressant, je suis preneur car je voudrais créer une DLL de calcul numérique.
cs_Kirua
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

20 déc. 2005 à 12:56
Faire un pointeur de fonction c'est une question syntaxique, je sais pas te dire comme ça mais ça se trouve. Par contre si tu veux pouvoir avoir, comme je le comprends, des fonctions qui dépendent de variables différentes selon les cas ... ce n'est pas possible de manière directe. Tu devras bidouiller.
cs_hitcher
Messages postés
21
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
15 septembre 2009

20 déc. 2005 à 09:46
Je voudrait améliorer un peu ce code avec votre aide, si vous le voulez bien. Le problême principale est de type ergonomique. Je voudrait utiliser quelque chose comme un pointeur de fonction qui fait que si m'a fonction dépend d'autre variable je n'ai pas à réécrire tous le code (le trapezoide rule en fait).
rambc
Messages postés
224
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
29 mars 2009

20 déc. 2005 à 09:24
Commentaire 1 : Pourquoi interpoler la fonction par des polynômes ?
L'évaluation des polynômes peut être faite très rapidement, ainsi qu'une interpolation. Cela peut être un moyen d'accélérer l'intégration.
De plus, l'interpolation est bien aimée en pratique car on n'a pas toujours la formule d'une fonction mais simplement certaines de ses valeurs.

Commentaire 2 : Qu'est-ce que la méthode de Runge-Kutta ?
Cette méthode sert à trouver des solutions d'équations différentielles ordianires du type F(x,y',y'',..)=0

Sinon bon code.
Afficher les 9 commentaires

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.