// =============================================================================
// Ce programme resoud l'equation differentielle ordinaire y'+y=0 avec commme // condition initiale y(0)=1 pour un nombre de pas d'integration donné.
// =============================================================================
#include<stdio.h>
#include<math.h>
// Fonction f telle que y'=f(y,x) (ici y'+y=0) double f(double y,double x){return -y;}
// Conditions initiales (les * permettent de changer la valeur de x et y) void init(double *x, double *y){*x=0; *y=1;}
// Fonctions qui avancent d'un pas la valeur de y avec chacune des 3 methodes double dy_euler(double dx, double x, double y);
double dy_heun (double dx, double x, double y);
double dy_rk4 (double dx, double x, double y);
// =============================================================================
// Programme principal
// =============================================================================
main(){
int i;
// Fichier pour stocker les résultats FILE *fichier;
fichier = fopen("edo.dat","w");
// Conditions initiales
double x; // valeur courante
double y1,y2,y4; // valeur courante par chacune des 3 méthodes init(&x,&y1);
init(&x,&y2);
init(&x,&y4);
fprintf(fichier,"%10.6f %10.6f %10.6f %10.6f %10.6f \n"
,x,y1,y2,y4,exp(-x)) ; // Choix du pas d'integration
double xmax=10.; // valeur finale
int n=25 ; // nombre de pas d'intégation double dx=(xmax-x)/n; // pas d'intégration
// Boucle pour integrer de proche en proche depuis x0 et jusqu'a xmax for(i=0;i<n;i++){
// On calcule la nouvelle valeur de y
y1 += dy_euler(dx,x,y1); // Methode de Euler (ordre 1) y2 += dy_heun (dx,x,y2); // Methode de Heun (ordre 2) y4 += dy_rk4 (dx,x,y4); // Methode de RK4 (ordre 4)
// On calcule la nouvelle valeur de x x += dx ;
// On enregistre les résultats dans le fichier
fprintf(fichier,"%10.6f %10.6f %10.6f %10.6f %10.6f \n"
,x,y1,y2,y4,exp(-x)) ; }
}
// =============================================================================
// Fin du programme principal
// =============================================================================
// =============================================================================
// Fonctions auxiliaires
// =============================================================================
double dy_euler(double dx, double x, double y){
double k1 ; k1 = dx*f(y,x) ; return k1;
}
double dy_heun(double dx, double x, double y){
double k1,k2;
k1 = dx*f(y ,x );
k2 = dx*f(y+k1,x+dx);
return 0.5*(k1+k2);
}
double dy_rk4(double dx, double x, double y){
double k1,k2,k3,k4,dy;
k1 = dx*f(y ,x ) ; k2 = dx*f(y+0.5*k1,x+0.5*dx) ; k3 = dx*f(y+0.5*k2,x+0.5*dx) ; k4 = dx*f(y+ k3,x+ dx) ; return (k1+2.*k2+2*k3+k4)/6.;
}
// =============================================================================
// =============================================================================