Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 2015
-
1 mars 2005 à 16:36
cs_spirit31
Messages postés1Date d'inscriptionsamedi 16 décembre 2006StatutMembreDernière intervention13 janvier 2008
-
13 janv. 2008 à 20:06
Salut tout le monde,
Je voudrais savoir si quelqu'un peut me donner un coup de main sur un programme concernant l'algorithme Runge Kutta ordre 4.
Voilà, en fait, j'ai fais deux programmes permettant de résoudre l'équation differentielle du pendule amortie avec mon algo rk4 et les données sont sauvegardées dans un fichier.
Cependant, les données qui sont sauvegardées par les 2 progs sont differentes. Je ne vois pas du tout où est mon erreur. Je voulais savoir si quelqu'un peut me dire
où est ce que ça cloche; si c'est dans mon 1er prog? ou dans le 2ème ?
Si ca vient de mon 1er prog comment faire pour arranger ce problème. Je développe avec Dev-Cpp.
Merci.
Voici mon 1er programme:
#include <stdio.h>
#include <math.h>
#define NMAX 65536
#define Y0 2.0
#define pi 3.1415926535
#define OM 2.0/3.0
#define TAU (2*pi)/(128.0*(2.0/3.0))
double q,b,w;
double f(double x, double y, double z)
{
return y;
}
double g(double x, double y, double z)
{
return -q*y-sin(x)+b*cos(z);
}
double h(double x, double y, double z)
{
return OM;
}
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,k1y,k1z,k2x,k2y,k2z,k3x,k3y,k3z,k4x,k4y,k4z;
double xi,yi,zi;
int np;
xi=*x;
yi=*y;
zi=*z;
k1x = TAU * f(xi,yi,zi);
k1y = TAU * g(xi,yi,zi);
k1z = TAU * h(xi,yi,zi);
k2x = TAU * f(xi+k1x/2.0,yi+k1y/2.0,zi+k1z/2.0);
k2y = TAU * g(xi+k1x/2.0,yi+k1y/2.0,zi+k1z/2.0);
k2z = TAU * h(xi+k1x/2.0,yi+k1y/2.0,zi+k1z/2.0);
k3x = TAU * f(xi+k2x/2.0,yi+k2y/2.0,zi+k2z/2.0);
k3y = TAU * g(xi+k2x/2.0,yi+k2y/2.0,zi+k2z/2.0);
k3z = TAU * h(xi+k2x/2.0,yi+k2y/2.0,zi+k2z/2.0);
k4x = TAU * f(xi+k3x,yi+k3y,zi+k3z);
k4y = TAU * g(xi+k3x,yi+k3y,zi+k3z);
k4z = TAU * h(xi+k3x,yi+k3y,zi+k3z);
Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 20152 1 mars 2005 à 18:28
Salut JCDjcd,
Merci pour ta réponse. En fait, les valeurs diffèrent dès la première ligne. Par exemple les 4 premières valeurs imprimées avec le second programme donne:
En fait, j'ai l'impression que mes 2 conditions initiales ne figurent pas dans le fichier de données généré par le premier programme. Je ne comprend pas où est mon erreur de programmation. Je suis pourtant persuadé que l'algo dans le premier prog est bon. Si tu as une idée ou quelqu'un n'hésitez pas parce que moi je ne sais plus quoi faire.
Jarod_Delaware
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 1 mars 2005 à 18:36
Si ca foire des la premiere boucle il suffit de faire soi-meme le calul a la main et voir plus precisement ou dans le code ca bug, en plus le code n'est pas tres long. verifies d'abord que tu pars avec les memes donnees.
Pourquoi faire simple quand on peut faire compliqué ?
Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 20152 2 mars 2005 à 10:23
Salut,
TAU et h ont la même valeur. C'est vrai que dans la seconde version j'ai définis l juste après son utilisation. J'ai corrigé cette erreur mais c'est toujours pareil. Je ne sais plus trop quoi faire. Si tu as une idée elle sera la bien venue.
Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 20152 10 mars 2005 à 10:45
Salut,
En fait ce qui est bizarre c'est que si je met 1024 itérations les valeurs sont les mêmes, mais au dela de 1024 ça part en sucette. Si tu as une idée du pourquoi.
Jarod1980
Messages postés273Date d'inscriptionsamedi 5 juillet 2003StatutMembreDernière intervention31 mars 20152 13 mars 2005 à 13:02
Salut,
En fait, tu veux que j'essais de mettre comme conditions initiales des valeurs multiples de 1000 sur x et y? ou bien dans le nombre d'itérations ?
Ca change pas grand chose. En fait, je voulais avoir comme nombre d'itérations des multiples de 2^N afin d'effectuer une FFT sur mes points. J'aurais aimer savoir pourquoi les valeurs sont differentes au delà de 1024. J'ai essayé plusieurs trucs mais ça n'a rien donné.
cs_spirit31
Messages postés1Date d'inscriptionsamedi 16 décembre 2006StatutMembreDernière intervention13 janvier 2008 13 janv. 2008 à 20:06
salut je suis débutant en c++ et je serai trés reconnaissant si quelqu'un me donne un coup de mains pour programmer rk4 pour x=f(t,x,y) et y=g(t,x,y)
merci