Résolution équation differentielle du pendule par la methode de runge kutta ordre 4

Soyez le premier à donner votre avis sur cette source.

Snippet vu 21 978 fois - Téléchargée 27 fois

Contenu du snippet

Ce programme permet de résoudre numeriquement une équation differentielle par la methode Runge Kutta ordre 4. Cette methode de résolution numerique donne une meilleur precision que l'algorithme d'Euler.
Vous pouvez changer dans le programme le pas TAU et les conditions initiales. Les résultats sont enregistrés dans le fichier output.
Vous pouvez vous amusez à changer les paramètres X0, MU, A et OM.
Ici dans le code source du programme XO, MU, A et OM definissent un cas chaostique pour le pendule (essayer de tracer à l'aide d'un tableur l'espace des phases xy).

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI acos(-1.0)
#define A 3.0
#define OM 1.0
#define TAU 0.01
#define MU 0.3
#define X0 1.0
#define PI 2*acos(-1.0)

/* Fonction Runge kutta ordre 4 */
void rk4(double *x, double *y , double *z)
{
	double f(double x, double y, double z);
	double g(double x, double y, double z);
	double h(double x, double y, double z);
        double k1x,k2x,k1y,k2y,xi,yi,xi2,yi2,xi3,yi3;
	double k3x,k3y,k4x,k4y;

  • / Condition pour empêcher le pendule de faire un tour sur lui même */
if(*x>PI)(*x)=*x-DPI; else if (*x<-PI)(*x)=DPI+*x; /* ALGORITHME RUNGE KUTTA 4 */ xi = *x; yi = *y; zi = *z; k1x = TAU * f(xi,yi,zi); k1y = TAU * g(xi,yi,zi); k1z = TAU * h(xi,yi,zi); xi = *x + 0.5*k1x; yi = *y + 0.5*k1y; zi = *z + 0.5*k1z; k2x = TAU * f(xi,yi,zi); k2y = TAU * g(xi,yi,zi); k2z = TAU * h(xi,yi,zi); xi2 = *x + 0.5*k2x; yi2 = *y + 0.5*k2y; zi2 = *z + 0.5*k2z; k3x = TAU * f(xi2,yi2,zi2); k3y = TAU * g(xi2,yi2,zi2); k3z = TAU * h(xi2,yi2,zi2); xi3 = *x + k3x; yi3 = *y + k3y; zi3 = *z + k3z; k4x = TAU * f(xi3,yi3,zi3); k4y = TAU * g(xi3,yi3,zi3); k4z = TAU * h(xi3,yi3,zi3); /* INTEGRATION */
  • x = *x + (1.0/6.0) * (k1x + k4x) + (1.0/3.0) * (k2x + k3x);
  • y = *y + (1.0/6.0) * (k1y + k4y) + (1.0/3.0) * (k2y + k3y);
  • z = *z + (1.0/6.0) * (k1z + k4z) + (1.0/3.0) * (k2z + k3z);
} double f(double x, double y,double z) { return y; } double g(double x, double y,double z) { return A*cos(z) - sin(x) - MU*y; } double h(double x, double y, double z) { return OM; } /* PROGRAMME PRINCIPAL */ void main(void) { int nbrIT, i; double cn1,cn2,cn3; FILE *output; output=fopen("donnees","w"); printf("\nEntrer le nombre d'itérations:); scanf("%d", &nbrIT); /* Conditions initiales */ cn1 = X0; cn2 = 0.0; cn3 = OM; for(i=1;i<=nbrIT;i++) { rk4(&cn1, &cn2, &cn3); /* On appel la fonction rk4 */ fprintf(output,"%f %lf %lf %lf \n", i*TAU, cn1,cn2, cn3); /* On sauve périodiquement les résultats */ } fclose(output); /* On ferme le fichier */ } /* fin programme */

Conclusion :


-

A voir également

Ajouter un commentaire

Commentaires

cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2 -
J'aime bien cette source, elle montre des bonnes methodes en programmation pour resoudre des equa. diff..

Deux-tois petites choses cependant :
- pour avoir la la valeur de PI, il ne vaut pas faire l'arccos, tu met directmeent la valeur 3.1415926535 (par coeur !)
- verifier que le fichier a bien ete ouvert
- ouvir le ficheir en mode "wt" et non "w", tu ecris en texte donc ...
skone007
Messages postés
166
Date d'inscription
mercredi 24 avril 2002
Statut
Membre
Dernière intervention
23 juin 2009
-
Il me semble que pour PI arccos est mieu enfin si il renvoi un double. Puisque ici il boss avec des double et 3.1415926535 est pas assez précis contrairement à 3.1415926535897932. Puisque un double à 15 chiffres significatif dans l'ANSI. Corrigés moi si je me trompes.
mdrr , je connais 200 chiffres de PI, 15 chiffres ce n'est pas precis. Votre programme est donc faux ! C'est écrit dans l'ANSI , revoyer vos cours de math SVP.
Whismeril
Messages postés
13514
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 juillet 2019
288 > NobelDeMath -
Bonsoir NobelDeMath.
Connaitre 200 chiffres de PI (199 décimales donc?) ne sert à rien pour ce codes sources, en effet le format de codage des réels appelé "double" ne permet pas d'atteindre une telle précision, donc le programme n'en tient tout simplement pas compte.
Voir ici https://www.commentcamarche.net/forum/affich-35846831-erreur-de-calcul#3

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.