Bonjour les gens
Je suis en prépa et dans le cadre de mon TIPE, je bosse sur la simulation numérique des équations de propagation d'ondes.
J'ai donc fait mon appli, et ca marche bien, sauf que ca a un comportement bizarre. Je suis donc remonté à la racine du problème et ai créé une appli console simulant le problème en une dimension.
L'équation différentielle discrétisée qui régit l'évolution du problème est :
t3[i] = 2 * t2[i] - t1[i] + pasTemps² * v² / pas²(t2[i + 1] + t2[i - 1] - 2 * t2[i])
Où t3 représente le tableau à l'instant t+dt, t2 celui à l'instant t et t1 celui à l'instant t-dt.
Le point intéressant de cette formule est qu'elle est symétrique pour i : il n'y a aucune raison pour que l'onde parte plutôt à droite ou à gauche. C'est pourtant ce qui se produit.
Voici mon code :
Voici les résultats :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 //les constantes, simplifiées au max pour pouvoir faire les calculs à la main const int nbre = 5; //sachant que deux n'interviendront pas dans les calculs mais seront toujours nuls const double pasTemps = 0.1; const double v = 1; const double pas = 1; double[] t1 = new double[nbre]; double[] t2 = new double[nbre]; double[] t3 = new double[nbre]; t1[nbre/2] = 1; t2[nbre/2] = 1;//initialisation for (int j = 0; j < 5; j++) { Console.WriteLine("Etape " +j); for (int i = 1; i <nbre-1; i++) //on laisse tomber les extrémités, qui vaudront toujours 0 { t3[i] = 2 * t2[i] - t1[i] + pasTemps * pasTemps * v * v / pas / pas * (t2[i + 1] + t2[i - 1] - 2 * t2[i]); Console.WriteLine(t3[i]); } t1 = t2; t2 = t3;//on échange et on recommence }
Etape 0
0
0
0,01
0,98
0,01
0
0
Jusque là c'est normal
Etape 1
0
0,0001
0,029601
0,94079601
0,0292079601
0,000292079601
2,92079601E-06
Là par contre c'est pas normal du tout. D'une part c'est dissymétrique, d'autre part le calcul à la main ne donne pas les mêmes résultats (pour la partie en bas). Et en plus, la dernière valeur n'a aucune raison de ne pas être nulle, vu que ses voisines aux deux rangs précédents sont nulles
Le résultat attendu serait :
0
0,0001
0,029601
0,94079601
0,029601
0,0001
0
Je m'interroge donc, est ce que les problèmes viennent du calcul numérique fait par le runtime ? Pourquoi favoriser ainsi une direction ?
Si quelqu'un avait une idée du pourquoi du comment du problème, ca m'arrangerait bien, pasque ca fait deux soirs que je m'arrache les cheveux dessus
Smeuuh
Partager