Bonjour,
Je cherche à afficher les trajectoires de trois corps suivant les formules de la loi de la Gravitation.
Le code que j'ai développé est très long, est-il possible d'accélérer le temps de traitement?
Le code:
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| Option Explicit
Sub Chemin()
'On Error GoTo Handler
MA = Range("A2").Value
MB = Range("B2").Value
MC = Range("C2").Value
G = 6.67408 ^ 10 - 11
If Range("A15").Value = "OK" Then
Range("D3:AD100000").Clear
i = 3
jusk = Range("B10").Value
While i <= jusk
Range("B11").Value = ActiveCell.Row / jusk * 100
Range("D" & i).Select
xA = Range("D" & i - 1).Value
yA = Range("E" & i - 1).Value
zA = Range("F" & i - 1).Value
xB = Range("G" & i - 1).Value
yB = Range("H" & i - 1).Value
zB = Range("I" & i - 1).Value
xC = Range("J" & i - 1).Value
yC = Range("K" & i - 1).Value
zC = Range("L" & i - 1).Value
vxA = Range("M" & i - 1).Value
vyA = Range("N" & i - 1).Value
vzA = Range("O" & i - 1).Value
vxB = Range("P" & i - 1).Value
vyB = Range("Q" & i - 1).Value
vzB = Range("R" & i - 1).Value
vxC = Range("S" & i - 1).Value
vyC = Range("T" & i - 1).Value
vzC = Range("U" & i - 1).Value
axA = G * (((MA * MB * (xB - xA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (xC - xA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
ayA = G * (((MA * MB * (yB - yA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (yC - yA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
azA = G * (((MA * MB * (zB - zA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3) + (MA * MC * (zC - zA)) / ((((xB - xA) ^ 2 + (yB - yA) ^ 2 + (zB - zA) ^ 2) ^ 1 / 2) ^ 3)))
axB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (xC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
ayB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (yC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
azB = G * (((MB * MA * (xB - xA)) / ((((xA - xB) ^ 2 + (yA - yB) ^ 2 + (zA - zB) ^ 2) ^ 1 / 2) ^ 3) + (MB * MC * (xC - xB)) / ((((xC - xB) ^ 2 + (yC - yB) ^ 2 + (zC - zB) ^ 2) ^ 1 / 2) ^ 3)))
axC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
ayC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
azC = G * (((MC * MA * (xA - xC)) / ((((xA - xC) ^ 2 + (yA - yC) ^ 2 + (zA - zC) ^ 2) ^ 1 / 2) ^ 3) + (MC * MB * (xB - xC)) / ((((xB - xC) ^ 2 + (yB - yC) ^ 2 + (zB - zC) ^ 2) ^ 1 / 2) ^ 3)))
Range("V" & i).Value = axA
Range("W" & i).Value = ayA
Range("X" & i).Value = azA
Range("Y" & i).Value = axB
Range("Z" & i).Value = ayB
Range("AA" & i).Value = azB
Range("AB" & i).Value = axC
Range("AC" & i).Value = ayC
Range("AD" & i).Value = azC
DEMIT = Range("AE" & i).Value
vxA = vxA + axA * DEMIT
vyA = vyA + ayA * DEMIT
vzA = vzA + azA * DEMIT
vxB = vxB + axB * DEMIT
vyB = vyB + ayB * DEMIT
vzB = vzB + azB * DEMIT
vxC = vxC + axC * DEMIT
vyC = vyC + ayC * DEMIT
vzC = vzC + azC * DEMIT
Range("M" & i + 1).Value = vxA
Range("N" & i + 1).Value = vyA
Range("O" & i + 1).Value = vzA
Range("P" & i + 1).Value = vxB
Range("Q" & i + 1).Value = vyB
Range("R" & i + 1).Value = vzB
Range("S" & i + 1).Value = vxC
Range("T" & i + 1).Value = vyC
Range("U" & i + 1).Value = vzC
T = Range("AE" & i + 1).Value
xA = xA + vxA * T
yA = yA + vyA * T
zA = zA + vzA * T
xB = xB + vxB * T
yB = yB + vyB * T
zB = zB + vzB * T
xC = xC + vxC * T
yC = yC + vyC * T
zC = zC + vzC * T
Range("D" & i + 1).Value = xA
Range("E" & i + 1).Value = yA
Range("F" & i + 1).Value = zA
Range("G" & i + 1).Value = xB
Range("H" & i + 1).Value = yB
Range("I" & i + 1).Value = zB
Range("J" & i + 1).Value = xC
Range("K" & i + 1).Value = yC
Range("L" & i + 1).Value = zC
i = i + 2
Wend
Else
MsgBox Range("A10").Value & " doit être " & Range("A11").Value & " " & Range("A12").Value
Exit Sub
End If
End Sub |
Avec, pour être complet:
- en A13;
- en A14;
-
=SI(ET(A13=1;A14=0);"OK";"NOK")
en A15;
- Une MEFC d'après la valeur de B11, Barre de données.
Merci beaucoup d'avance.
PS: Question subsidiaire: existerait-il un moyen pour estimer un temps de traitement au début du code?????? (Excel peut tout faire a priori ;-)!!!!!)
Partager