begin process at 2012 05 27 19:06:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > ROMBERG INTEGRATION

ROMBERG INTEGRATION


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :romberg, integration, numeric Niveau :Débutant Date de création :18/12/2005 Date de mise à jour :09/05/2006 22:39:31 Vu / téléchargé :6 760 / 293

Auteur : hitcher

Ecrire un message privé
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 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

  • #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
#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)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • romberg.pdfTélécharger ce fichier [Réservé aux membres club]66 007 octets

Télécharger le zip


 Historique

26 décembre 2005 22:59:13 :
J'étais ennuyé par le fais qu'à chaque fois que l'on changait la focntion à intégrer, on devait réécrire toutes les fonctions pour tenir comptes des nouveaux paramêtres de celle ci . Ce code encapsule donc tous les paramétres dans une classe pour profiter de l'accessibilité de la propriété publique des variables d'une classe. Le constructeur nécessite que trois paramétres: les bornes d'intégration et un pointeur sur un tableau contenant les paramétres additionnelles.
09 mai 2006 22:39:31 :
J'ai fixer un bug par rapport au nombre d'itération maximum (k<=Maxiter -> k<Maxiter)

 Sources du même auteur

OPTIMISATION PAR GOLDEN SECTION SEARCH À UNE DIMENSION
DAUBCHIES D4 WAVELET : TRANSFORM ET INVERSE TRANSFORM
Source avec Zip ESTIMATION LOI STABLE (MC KULLOCH) POUR UN DLL POUR EXCEL

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de luhtor le 18/12/2005 20:41:23

J'ai la flemme de déchivrer le pdf :) tu saurais me dire la différence fondamentale avec l'approximation d'Euler (simples trapèzes) ?

Sinon rien que de savoir que cette intégration existe, c'est utile.

++

Commentaire de Kirua le 19/12/2005 07:40:52

Qu'est-ce que tu appelles le cas "univarié"?

Quand faut-il utiliser Euler, Runge-Kutta ou Romberg? Pour RK je pense que l'ordre d'approximation est équivalent au pas du découpage élevé à la puissance 5, tandis que pour Euler c'est puissance 2 ou 3. Mais avec un pas adaptatif on atteint déjà d'excellents résultats en pratique.

Commentaire de hitcher le 19/12/2005 22:13:57

alors en la différence entre le simple trapéze et romberg est relativement fine.Romberg est une combinaison linéaire de trapèze qui permet de faire "sauter" une des erreurs d'approximation du trapèze.

Sinon je ne connais pas la méthode de Runge-Kutta, mais comme je viens de l'indiquer Romberg étant une version améliorer du trapèze (Euler) il vaut mieux, utiliser Romberg. Mais lisez le pdf, il est très simple (je suis économètre pas mathématicien).

Commentaire de Kirua le 19/12/2005 23:30:21

en effet, le pdf vaut vraiment la peine. je viens de le lire calmement et c'est très clair, merci!

Commentaire de rambc le 20/12/2005 09:24:27

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.

Commentaire de hitcher le 20/12/2005 09:46:09

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).  

Commentaire de Kirua le 20/12/2005 12:56:17

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.

Commentaire de rambc le 20/12/2005 13:29:37

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.

Commentaire de Kirua le 20/12/2005 14:16:43

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 ...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

integration des biliothèques Qt à vc++6 [ par rderdouri ] j'arrive pas à faire compiler un client (sockets) Qt sous vc++6, pourtant le serveur compile!!!!!!si vous avez des idées je serai ravi. ok::::)))) Choix de base de données pour integration sur cd [ par bmwe21 ] Bonjour, je suis entrain de developper un logiciel pour ma boite. ce logiciel sera distribuer sur cd et ne devra pas laissé de trace a part dans les d Integration de fenetre OpenGL dans fenetre C# ? [ par Thilde ] Bonjour&nbsp;J aimerais bien savoir si il est possible ou non d integrer une fenetre OpenGL via la SDl ou glut dans une fenetre c# ?&nbsp;La je commen integration TCP [ par tarek93250 ] je vais essayer d'etre bref et precis.j'ai cr&#233;er un syst&#232;me client/serveur, et un automate TCP sur UNIX. chacun a part.le C/S marche en r&#2 Integration.. [ par gdpasmini ] Hello, j'ai un petit probleme. je cherche a faire un logiciel destiné a comporter une IHM. Ce logiciel comporte un module permettant d'effectuer diff Integration DLL [ par Quazar ] SalutJe cherche a encapsuler une librairie (dll) dans mon exe.J'ai une application utilisant une dll. Je voudrais faire en sorte que la dll ne soit pa integration d'une fonction elliptique [ par prisen ] bonjour,j'aimerais calculer l'orbite de mercure. Le probléme apres calcul analytique deja faite, je me ramene a une euation elliptique, qui la suivant Integration de mon filtre directshow [ par pilulu ] Bonjour,Je travaille sur un filtre de transformation directshow que je veux integrer à mon application de lecture de flux video venant d'un module d'e Utiliser QT sous Eclipse avec Qt Eclipse Integration (Linux) [ par Chatbour ] Salut à tous et à toutes, Je galère pour installer Qt Eclipse Integration sous Eclipse sur mon Fedora 12 en appliquant les instructions dans [url=htt


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales