Bonjour a tous,
dans le cadre d'un projet en informatique nous devons "résoudre" l'equation de diffusion de chaleur dans une barre metalique. Pour se faire on resout l'equation qui en discrétisant la barre metalique en N petit bout auxquelles on associe la temperature (je passe tout le bla bla on nous donne directement la matrice a resoudre). C'est une matrice tridiagonale assez simple la 1er diagonal il n'y a que des la seconde des (coefficient propre au système) et la 3eme encore des . Donc j'ai realise le programme suivant :
mais la probleme j'obtiens toujours une espece de courbe qui va de la température initiale a la température ambiante alors que je devrais obtenir une courbe (avec mes données numériques) qui va de ma température initial a une temperture superieur a la temperature ambiante... j'ai l'impression que mon code foire a cause du "double balayage" je m'embrouille avec les indices qui sont décalés de 1 entre le main et le void. J'espere avoir reussi a faire comprendre mon probleme et si quelqu'un vois où je me suis planté je suis tout ouïe ! J'ai conscience qu'il manque en revanche beaucoup de donné pour comprendre le problème a résoudre donc si quelqu'un a le temps de m'aider je reposterai le "sujet"... merci d'avance pour vos reponses !Code:#include <stdio.h> #include <math.h> void doublebalayage(int N, double a[], double b[], double c[], double d[], double x[]) { double E[N], F[N]; int i; E[0]=c[0]/b[0]; F[0]=d[0]/b[0]; for (i=1 ; i<=N-2 ; i++) { E[i]=c[i]/(b[i]-a[i]*E[i-1]); F[i]=(d[i]-a[i]*F[i-1])/(b[i]-a[i]*E[i-1]); } F[N-1]=(d[N-1]-a[N-1]*F[N-2])/(b[N-1]-a[N-1]*E[N-2]); x[N-1]=F[N-1]; for (i=N-2 ; i>0 ; i--) { x[i]=F[i]-E[i]*x[i+1]; } } int main() { double x[500], h, L; int N, i; FILE *fp; printf("Saisir le nombre de points desire pour la modelisation : "); scanf("%i", &N); if (N>=500) { printf("vous avez saisi un nombre trop grand, modifie la dimension des tableaux dans le code source !"); return 0; } printf("Saisir la longueur de l'ailette : "); scanf("%lf", &L); h=L/N; for (i=0 ; i<=N ; i++) { x[i]=i*h; } double theta[500]={0}, a[500]={0}, b[500]={0}, c[500]={0}, d[500]={0}, T[500]; double H, l, T_0, T_e, k, hc=200, z; printf("Saisir le coefficient de conduction k : "); scanf("%lf",&k); printf("Saisir la largeur de la section S de l'ailette : "); scanf("%lf", &l); printf("Saisir la hauteur de la section S de l'ailette : "); scanf("%lf",&H); printf("Entrer la temperature du processeur (en degres celsius): "); scanf("%lf", &T_0); printf("entrer la temperature ambiante autour de l'ailette (en degres celsius): "); scanf("%lf", &T_e); z=hc*(2*l+2*H)/(k*(l*H)); for (i=0 ; i<=N ; i++) { a[i]=-1; c[i]=-1; } for (i=0 ; i<=N ; i++) { b[i]=2+h*h*z; } d[0]=T_0-T_e; doublebalayage(N,a,b,c,d,theta); theta[0]=T_0-T_e; theta[N]=theta[N-1]; fp=fopen("chaleur","w"); for(i=0 ; i<=N ; i++) { T[i]=theta[i]+T_e; printf("%lf\n",T[i]); fprintf(fp,"%lf %lf\n",x[i],T[i]); } fclose(fp); return 0;}
-----