Hello,

J'essaye de tracer la trajectoire de 2 planètes dans l'infini du cosmos, selon les lois de la mécanique newtonienne.

Je prend le Principe fondamental de la dynamique (Somme des forces = masse*accélération), la seule force appliquée sur chaque astre est la gravitation exercée par l'autre soit : (G*mA*mB)/d^2 où mA et mB sont les masses respectives des deux astres, G la constante de gravitation et d la distance séparant les deux astres.
J'ai essayé d'implémenter l'algorithme de Verlet décrit dans le menu "Help" de ce petit programme en flash très bien fait.

Voici mon code sous Octave :

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
% Effacement de la fenêtre
clf
 
% Constante de gravitation universelle
G=6.673*10^-11;
 
% Masse Terre
mk=10^25;
% Position initiale Terre
xk=0;
yk=0;
% Vitesse initiale Terre
vxk=-5;
vyk=0;
 
% Masse Lune
ml=10^22;
% Position initiale Lune
xl=10;
yl=10;
% Vitesse initiale Lune
vxl=3;
vyl=3;
 
% Distance Terre-Lune
d=sqrt((xl-xk)^2+(yl-yk)^2);
% Angle Terre-Lune
cosAlpha=(xl-xk)/d;
sinAlpha=(yl-yk)/d;
 
% Accélération Terre
axk=-G*cosAlpha*(ml/d^2);
ayk=-G*sinAlpha*(ml/d^2);
% Accélération Lune
axl=-axk;
ayl=-ayk;
 
deltaT=0.0001;
 
for n=1:10
 
	% Distance Terre-Lune
	d=sqrt((xl-xk)^2 +(yl-yk)^2);
	% Angle Terre-Lune
	cosAlpha=(xl-xk)/d;
	sinAlpha=(yl-yk)/d;
 
	% Position Terre
	xk=xk+vxk*deltaT+(1/2)*axk*deltaT^2;
	yk=yk+vyk*deltaT+(1/2)*ayk*deltaT^2;
 
	% Position Lune
	xl=xl+vxl*deltaT+(1/2)*axl*deltaT^2;
	yl=yl+vyl*deltaT+(1/2)*ayl*deltaT^2;
 
	% Mise en mémoire des anciennes accélérations
	axk0=axk;
	ayk0=ayk;
	axl0=axl;
	ayl0=ayl;
 
	% Accélération Terre
	axk=-G*cosAlpha*(ml/d^2);
	ayk=-G*sinAlpha*(ml/d^2);
	% Accélération Lune
	axl=-axk;
	ayl=-ayk;
 
	% Vitesse Terre
	vxk=vxk+(1/2)*(axk+axk0)*deltaT;
	vyk=vyk+(1/2)*(ayk+ayk0)*deltaT;
	% Vitesse Lune
	vxl=vxl+(1/2)*(axl+axl0)*deltaT;
	vyl=vyl+(1/2)*(ayk+ayl0)*deltaT;
 
	% Dessin de la Terre
	plot(xk,yk,'*');
	% Dessin de la Lune sur la même figure
	hold on
	plot(xl,yl,'+');
 
endfor
A chaque pas, je prends accélérationLune = -accélérationTerre (principe d'action/réaction).

Le souci est que j'obtiens deux nuages de point divergents, les deux planètes n'ont aucune action l'une sur l'autre .

Je pense qu'il s'agit plus d'un problème de calcul que de langage, mais j'ai beau retourner mon code dans tous les sens, je ne vois vraiment pas où j'ai bien pu faire une erreur.

Help me please !

Si vous avez besoin d'éclaircissements sur une partie du code, n'hésitez pas à me demander.

Merci d'avance