mirror of
https://codeberg.org/Yael-II/MSc2-Project-Chaos.git
synced 2026-03-15 04:16:26 +01:00
74 lines
1.8 KiB
Python
74 lines
1.8 KiB
Python
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
from scipy.integrate import quad
|
|
|
|
import potentials as pot
|
|
import integrator as itg
|
|
import initial_conditions as init
|
|
|
|
DEFAULT_N_iter = 30000
|
|
DEFAULT_N_part = 100
|
|
DEFAULT_h = 0.01
|
|
DEFAULT_c = 1.7
|
|
|
|
E_all = np.array([1/100, 1/12, 1/10, 1/8, 1/6])
|
|
|
|
|
|
|
|
def compute_coordinates(E: float,
|
|
N_iter: int = DEFAULT_N_iter,
|
|
N_part: int = DEFAULT_N_part,
|
|
h: float = DEFAULT_h) -> tuple:
|
|
W_part = init.n_energy_part(pot.hh_potential, N_part, E)
|
|
|
|
# Perform integration
|
|
t_part, coord_part = itg.rk4(0, W_part, h, N_iter, pot.hh_evolution)
|
|
|
|
# Extract positions and velocities
|
|
x_part = coord_part[:, 0, 0]
|
|
y_part = coord_part[:, 0, 1]
|
|
u_part = coord_part[:, 1, 0]
|
|
v_part = coord_part[:, 1, 1]
|
|
|
|
return t_part, x_part, y_part, u_part, v_part
|
|
|
|
def x(t: float,
|
|
x_part: np.ndarray,
|
|
h: float = DEFAULT_h):
|
|
return x_part[t//h]
|
|
|
|
def theta(t: float,
|
|
x,
|
|
x_part: np.ndarray,
|
|
c: float = DEFAULT_c,
|
|
h: float = DEFAULT_h,
|
|
ds: float = DEFAULT_h):
|
|
"""theta(t) = c*t + int_0^t phi(x(s)) ds"""
|
|
I = quad(lambda s: x(s, x_part), 0, t)
|
|
return c*t + I
|
|
|
|
def p(t: float,
|
|
x,
|
|
theta,
|
|
x_part: np.ndarray,
|
|
h: float = DEFAULT_h,
|
|
ds: float = DEFAULT_h):
|
|
I = quad(lambda s: x(s, x_part)*cos(theta(s, x, x_part)), 0, t)
|
|
return I
|
|
|
|
def M(t,
|
|
p,
|
|
x_part: np.ndarray,
|
|
h: float = DEFAULT_h,
|
|
dtau: float = DEFAULT_h):
|
|
I = quad(lambda tau: (p(t+tau, x, theta, x_part)
|
|
- p(tau, x, theta, x_part)))**2, 0, np.max(t))
|
|
return I
|
|
|
|
if __name__ == "__main__":
|
|
for i in range(len(E_all)):
|
|
E = E_all[i]
|
|
t_part, x_part, y_part, v_part, u_part = compute_coordinates(E)
|
|
I = M(t_part, x_part)
|
|
|