-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathalgoritmo_RK4.py
80 lines (45 loc) · 2.16 KB
/
algoritmo_RK4.py
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
import numpy as np
import modello_fisico as model
#import modello_pendolo as model
import json
from scipy.constants import G
from params import *
#from params_pendolo import *
def conc(x,y):
return np.concatenate((x,y));
def evolve():
with open("valori_RK4.txt" , mode='w' ) as f:
yn_rk = model.condizioni_iniziali()
raggio = np.linalg.norm(yn_rk[0:Ndims]) #raggio dalle varibli lagran..
yn_rk = np.append(yn_rk,raggio) #aggiungo il raggio
json.dump(yn_rk.tolist(), f)
f.write('\n')
for i in range(1,x_intervallo):
t = (i-1)*h_inter # tempo attuale
yn_rk_x = yn_rk[0:Ndims] #posizione attuale
yn_rk_v = yn_rk[Ndims:2*Ndims] #velocita attuale ( sarebbe dx/dt )
pos = yn_rk_x
vel = yn_rk_v
t1 = t
k1v = model.calcola_accelerazioni(conc(pos,vel), t1)*h_inter
k1x = vel*h_inter
t2 = t + h_inter*0.5
k2v = model.calcola_accelerazioni(conc((pos + k1x*0.5),vel), t2)*h_inter
k2x = (vel+k1v*0.5)*h_inter
t3 = t2
k3v = model.calcola_accelerazioni(conc((pos+k2x*0.5),vel), t3)*h_inter
k3x = (vel+k2v*0.5)*h_inter
t4 = t + h_inter
k4v = model.calcola_accelerazioni(conc((pos+k3x),vel), t4)*h_inter
k4x = (vel+k3v)*h_inter
yn_rk_v = yn_rk_v + 1./6.*(k1v+2*k2v+2*k3v+k4v) #vel nuova
yn_rk_x = yn_rk_x + 1./6.*(k1x+2*k2x+2*k3x+k4x) #pos nuova
yn_rk = np.concatenate((yn_rk_x,yn_rk_v))
raggio = np.linalg.norm(yn_rk_x) # raggio
yn_rk = np.append(yn_rk,raggio)
#print(np.linalg.norm(yn_rk[0:Ndims]))
if np.linalg.norm(yn_rk[0:Ndims]) - raggio_terrestre < 0 :
break
json.dump(yn_rk.tolist(), f)
f.write('\n')
return