From 43bcb02a740d8191ff839c127dafadebfcb456e8 Mon Sep 17 00:00:00 2001 From: lbj-cmd Date: Tue, 4 Nov 2025 23:01:25 +0800 Subject: [PATCH] Add files via upload Real-Time Resonance and Chaos Dynamical Map --- FinalProjectCode.py | 355 ++++++++++++++++++++++++++++++++++++++++--- histograms_final.png | Bin 15806 -> 14467 bytes 2 files changed, 335 insertions(+), 20 deletions(-) diff --git a/FinalProjectCode.py b/FinalProjectCode.py index 9622a65..026b3b4 100644 --- a/FinalProjectCode.py +++ b/FinalProjectCode.py @@ -2,7 +2,7 @@ #Phys305 #Final Project: Asteroid Version -#run by "python final_project_asteroids_bodin" +#run by "python FinalProjectCode.py" #Goal of Project: #Recreate the threebody problem we did for homework, for Jupiter the Sun and asteroids. @@ -10,6 +10,321 @@ #Plot and animate each in different colors #Add code to take the data for the asteroids and use it to plot a histogram showing the Kirkwood Gaps +import math +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.animation import FuncAnimation +import matplotlib.gridspec as gridspec + +G = 6.674e-11 +GMs = 4*(math.pi**2) +m_sun = 1.989e30 + +# Jupiter parameters +ecc_jup = 0.0489 +semimajor_jup = 5.2044 +a_jup = semimajor_jup +perihelion_jup = a_jup*(1-ecc_jup) +m_jup = 1.8982e27 +vp_jup = math.sqrt(GMs) * math.sqrt((1+ecc_jup) / (a_jup*(1-ecc_jup)) * (1+(m_jup/m_sun))) + +# Calculate MMR positions for Jupiter +# Formula: a = a_jup * (p/q)^(2/3) +def calculate_mmr_positions(): + mmr_ratios = [(3, 1), (5, 2), (7, 3), (2, 1)] # p:q ratios + mmr_positions = [] + for p, q in mmr_ratios: + a = a_jup * (p/q)**(2/3) + mmr_positions.append((p, q, a)) + return mmr_positions + +# Fast Lyapunov Indicator (FLI) calculation +def calculate_fli(a, e, t_integration=100, h=1e-2): + """ + Calculate FLI for a test particle with given semi-major axis and eccentricity + """ + # Initial conditions for the test particle + perihelion = a * (1 - e) + vp = math.sqrt(GMs) * math.sqrt((1 + e) / (a * (1 - e))) + x = -perihelion + y = 0 + vx = 0 + vy = vp + + # Initial conditions for a nearby particle (1e-10 AU difference in x) + x_near = x + 1e-10 + y_near = y + vx_near = vx + vy_near = vy + + # Jupiter initial conditions + vx2 = 0 + vy2 = vp_jup + x2 = -perihelion_jup + y2 = 0 + + t = 0 + max_fli = 0 + + while t < t_integration: + # Calculate distances + r2 = math.sqrt(x2**2 + y2**2) + r = math.sqrt(x**2 + y**2) + rrel = math.sqrt((x - x2)**2 + (y - y2)**2) + + r_near = math.sqrt(x_near**2 + y_near**2) + rrel_near = math.sqrt((x_near - x2)**2 + (y_near - y2)**2) + + # Update velocities for test particle + vx = vx + h * (-GMs * x / r**3 - GMs * (m_jup/m_sun) * (x - x2) / rrel**3) + vy = vy + h * (-GMs * y / r**3 - GMs * (m_jup/m_sun) * (y - y2) / rrel**3) + + # Update velocities for nearby particle + vx_near = vx_near + h * (-GMs * x_near / r_near**3 - GMs * (m_jup/m_sun) * (x_near - x2) / rrel_near**3) + vy_near = vy_near + h * (-GMs * y_near / r_near**3 - GMs * (m_jup/m_sun) * (y_near - y2) / rrel_near**3) + + # Update velocities for Jupiter + vx2 = vx2 + h * (-GMs * x2 / r2**3) + vy2 = vy2 + h * (-GMs * y2 / r2**3) + + # Update positions for test particle + x = x + vx * h + y = y + vy * h + + # Update positions for nearby particle + x_near = x_near + vx_near * h + y_near = y_near + vy_near * h + + # Update positions for Jupiter + x2 = x2 + vx2 * h + y2 = y2 + vy2 * h + + # Calculate distance between test particle and nearby particle + delta_x = x_near - x + delta_y = y_near - y + delta = math.sqrt(delta_x**2 + delta_y**2) + + # Normalize the nearby particle position to keep delta small + if delta > 1e-5: + factor = 1e-10 / delta + x_near = x + delta_x * factor + y_near = y + delta_y * factor + vx_near = vx + (vx_near - vx) * factor + vy_near = vy + (vy_near - vy) * factor + delta = 1e-10 + + # Update FLI + if delta > 0: + current_fli = math.log10(delta / 1e-10) + if current_fli > max_fli: + max_fli = current_fli + + t += h + + return max_fli + +# Precompute chaos map on (a, e) grid +def precompute_chaos_map(a_min=2.0, a_max=3.6, e_min=0.0, e_max=0.4, grid_size=50): + """ + Precompute FLI values for a grid of (a, e) points + """ + a_grid = np.linspace(a_min, a_max, grid_size) + e_grid = np.linspace(e_min, e_max, grid_size) + fli_grid = np.zeros((grid_size, grid_size)) + + print("Precomputing chaos map...") + for i in range(grid_size): + for j in range(grid_size): + a = a_grid[i] + e = e_grid[j] + fli = calculate_fli(a, e) + fli_grid[i, j] = fli + print(f"Progress: {i+1}/{grid_size}") + + return a_grid, e_grid, fli_grid + +# Generate real asteroids with initial positions and velocities +def generate_asteroids(n_asteroids=100): + """ + Generate real asteroids with random semi-major axes and eccentricities, + and calculate initial positions and velocities + """ + semimajor_a = 1.5 * np.random.random(n_asteroids) + 2.0 # between 2 and 3.5 AU + ecc_a = 0.3 * np.random.random(n_asteroids) # between 0 and 0.3 + + x = np.array([]) + y = np.array([]) + vx = np.array([]) + vy = np.array([]) + + m_a = 1e10 # mass of asteroids (arbitrary since << Msun) + + for i in range(n_asteroids): + a_a = semimajor_a[i] + e_a = ecc_a[i] + perihelion = a_a * (1 - e_a) + + # Initial parameters for asteroid (perihelion at x=-perihelion, y=0) + vp = math.sqrt(GMs) * math.sqrt((1 + e_a) / (a_a * (1 - e_a)) * (1 + (m_a / m_sun))) + astr_vx = 0 + astr_vy = vp + astr_x = -perihelion + astr_y = 0 + + x = np.append(x, astr_x) + y = np.append(y, astr_y) + vx = np.append(vx, astr_vx) + vy = np.append(vy, astr_vy) + + return semimajor_a, ecc_a, x, y, vx, vy + +def main(): + """ + Main function to run the real-time resonance and chaos dynamics map + """ + # Precompute chaos map + a_grid, e_grid, fli_grid = precompute_chaos_map() + + # Generate real asteroids with initial conditions + semimajor_a, ecc_a, x, y, vx, vy = generate_asteroids(n_asteroids=100) + + # Calculate MMR positions + mmr_positions = calculate_mmr_positions() + + # Simulation parameters + h = 1e-2 + t = 0 + t_final = 200 + count = 0 + + # Jupiter's initial conditions + vx2 = 0 + vy2 = vp_jup + x2 = -perihelion_jup + y2 = 0 + + # Create UI with two side-by-side windows + fig = plt.figure(figsize=(15, 7)) + gs = gridspec.GridSpec(1, 2, width_ratios=[1, 1]) + + # Left: Real-time histogram + ax_hist = plt.subplot(gs[0]) + ax_hist.set_title('Real-time Asteroid Semi-major Axis Distribution') + ax_hist.set_xlabel('Semi-major Axis (AU)') + ax_hist.set_ylabel('Number of Asteroids') + ax_hist.set_xlim(2.0, 3.6) + + # Plot MMR positions as vertical dashed lines + for p, q, a in mmr_positions: + ax_hist.axvline(x=a, color='r', linestyle='--', alpha=0.7) + ax_hist.text(a + 0.01, 0.95, f'{p}:{q}', transform=ax_hist.get_xaxis_transform(), + rotation=90, va='top', ha='left', color='r') + + # Right: Chaos map + ax_chaos = plt.subplot(gs[1]) + ax_chaos.set_title('Chaos Map (a vs e)') + ax_chaos.set_xlabel('Semi-major Axis (AU)') + ax_chaos.set_ylabel('Eccentricity') + ax_chaos.set_xlim(2.0, 3.6) + ax_chaos.set_ylim(0.0, 0.4) + + # Plot chaos map + im = ax_chaos.pcolormesh(a_grid, e_grid, fli_grid.T, cmap='hot', shading='auto') + cbar = plt.colorbar(im, ax=ax_chaos) + cbar.set_label('Fast Lyapunov Indicator (FLI)') + + # Overlay real asteroids on chaos map + scat = ax_chaos.scatter(semimajor_a, ecc_a, color='blue', s=10, alpha=0.8) + + # Update histogram and chaos map in real-time + def update_hist(frame): + nonlocal t, count, x, y, vx, vy, x2, y2 + + current_semimajor_a = np.copy(semimajor_a) + current_ecc_a = np.copy(ecc_a) + + if t < t_final: + # Run one time step of the simulation + + # Calculate distances for Jupiter + r2 = math.sqrt(x2**2 + y2**2) + + # Update velocities for asteroids + for i in range(len(x)): + r = math.sqrt(x[i]**2 + y[i]**2) + rrel = math.sqrt((x[i] - x2)**2 + (y[i] - y2)**2) + + vx[i] += h * (-GMs * x[i] / r**3 - GMs * (m_jup/m_sun) * (x[i] - x2) / rrel**3) + vy[i] += h * (-GMs * y[i] / r**3 - GMs * (m_jup/m_sun) * (y[i] - y2) / rrel**3) + + # Update velocities for Jupiter + vx2 += h * (-GMs * x2 / r2**3) + vy2 += h * (-GMs * y2 / r2**3) + + # Update positions for asteroids + for i in range(len(x)): + x[i] += vx[i] * h + y[i] += vy[i] * h + + # Update positions for Jupiter + x2 += vx2 * h + y2 += vy2 * h + + # Update time and count + t += h + count += 1 + + # Calculate current semimajor axis and eccentricity for each asteroid + for i in range(len(x)): + # Calculate orbital energy E + v = math.sqrt(vx[i]**2 + vy[i]**2) + r = math.sqrt(x[i]**2 + y[i]**2) + E = 0.5 * v**2 - GMs / r + + # Calculate semimajor axis a + a = -GMs / (2 * E) + current_semimajor_a[i] = a + + # Calculate angular momentum h + h_orb = x[i] * vy[i] - y[i] * vx[i] + + # Calculate eccentricity e + e = math.sqrt(1 + (2 * E * h_orb**2) / (GMs**2)) + current_ecc_a[i] = e + + # Update histogram + ax_hist.clear() + ax_hist.set_title('Real-time Asteroid Semi-major Axis Distribution') + ax_hist.set_xlabel('Semi-major Axis (AU)') + ax_hist.set_ylabel('Number of Asteroids') + ax_hist.set_xlim(2.0, 3.6) + + # Plot histogram with current a values + ax_hist.hist(current_semimajor_a, bins=50, histtype='bar', color='b', alpha=0.7) + + # Replot MMR positions + for p, q, a in mmr_positions: + ax_hist.axvline(x=a, color='r', linestyle='--', alpha=0.7) + ax_hist.text(a + 0.01, 0.95, f'{p}:{q}', transform=ax_hist.get_xaxis_transform(), + rotation=90, va='top', ha='left', color='r') + + # Update chaos map title with current time + ax_chaos.set_title(f'Chaos Map (a vs e) - Time: {t:.2f} years') + + # Update scatter plot on chaos map + scat.set_offsets(np.c_[current_semimajor_a, current_ecc_a]) + + return ax_hist, scat + + # Animation + ani = FuncAnimation(fig, update_hist, frames=100, interval=1000, blit=False) + + plt.tight_layout() + plt.show() + +if __name__ == "__main__": + main() + def Asteroids(): import math import numpy as np @@ -153,25 +468,25 @@ def Asteroids(): plt.show() #Asteroids() #uncomment to run code and add data to histogram -def histogram(): #time to plot the histogram - import matplotlib.pyplot as plt - import numpy as np - import matplotlib +# def histogram(): #time to plot the histogram +# import matplotlib.pyplot as plt +# import numpy as np +# import matplotlib - f= open('asteroid_datafile.txt','r') - a=np.array([]) - for line in f: - s=line.split() - a = np.append(a,float(s[0])) - f.close() +# f= open('asteroid_datafile.txt','r') +# a=np.array([]) +# for line in f: +# s=line.split() +# a = np.append(a,float(s[0])) +# f.close() - bins = np.linspace(2, 3.6, 500) +# bins = np.linspace(2, 3.6, 500) - fig, ax = plt.subplots() - plt.hist(a, bins, histtype='bar', color='b') - plt.xlabel('AU') - plt.ylabel('Number of Asteroids') - plt.title('Kirkwood Gaps') - fig.savefig('histograms_final.png') - plt.show() -histogram() +# fig, ax = plt.subplots() +# plt.hist(a, bins, histtype='bar', color='b') +# plt.xlabel('AU') +# plt.ylabel('Number of Asteroids') +# plt.title('Kirkwood Gaps') +# fig.savefig('histograms_final.png') +# plt.show() +# histogram() diff --git a/histograms_final.png b/histograms_final.png index f981aba86ab669f0150ec128d70db5ef8048658d..08c3d53598b1f8cbd8b1e74c49ad2e85b894b99b 100644 GIT binary patch literal 14467 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 Te)lSb45E5P^K!A0)&2hka-NTm literal 15806 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
BR%HkqLa;2&gg2P}LTIE%CHsky{NDCj|-wFACtN z`pE~mRvEui1fDcXo?&Cuo`hosH}K0K2KZYw724vO&=Hm<-9j7dCwrNhhG)OkM9v(B z#)19dv167;c(nIdd|Uh6IRg#A*F5Xa)>4SgM6jDC0@ZOPHEX=|Xg_F)wJ;mjeELQE z|AdPpXZEm2c6HfTGcP9spB4$65FJsxJQ)_;z5k`K`1f4{>*RqK$BeJU<^_FKYh1eO z&hjRyNZ`q=WL4lL>U%U`Q`xeJ9r;AvH8F%f3z$xtCHQ*f}Y`h!3 z^6I?1{Em-eqIfPgctU64+GaFq=oa&7Xekmk85t9 zZFQl2{|$&~<~eYTGa28yx!zk`Xl&J0l#Se`Kn@Fn)8_(=;3DuqLcrzHt0pA$lRf9r z;SF>f*v%L4H9)(rvZ`x~f{Jk-{PTi9>I9n1CT4?8Tly{$Lnv>62Ju zP&PO9`^NywY%)t{g9-O^-u0@g~b*~ zTc*FF6*g+q&GRrRlTXP5=lR0Okn19V$lacDr+0al$pt+3PH+;SHxK5HQTB|On3ytq z=yU%55;*%+3mWEY+YUY3G7~ue1VXOjd%5{Y&@IDHUVGve#qeU4K?#C4TDhb8ka{x; zUNvQV!tJw@#^V8w7%zBuje{f-p%b?NtqOQLpXX#amv#d=nMmePv1V4h!i>0Tm)OjK zV)U3S9zrw?q;jqbjnHU9za^YWL1rg#h*A2%3fBtlStk4dwTLdoVG0~GR^XRjoa!Zj zftZp9nKT79*ozl0cHS+PEZ zTPiP@a4_B%s$G_ha;tA&8JVm&rOL2)H~(1;extFrNZ^J)u3v&V?+(*?*(Y9ufBTwoWupD3p{2H1l3aRzLirI65;Lq)t-@(y1+t7%@P z^{Tr(nzNR%98Mgdtb%Z4E*!DQ1xqM8iL?RdNpuAs-3c-E0*P1{^a<03IO##yn1dj~ zoktdIc+C7e^p#8(OaoBrss-AuHq)S_1~Oy-tT3FPdo6G#kHYWn#cX_b!Z={Y+l%gp zH;Zw=6iWKH&az^YXA`_twL0 zdu~B9eG6*R(Ti4ZMc`P#^mgS3ATLCK&=3K~e$?PRM^lO#2SqBi>e1pq>yki%=N^7D zig$oO!ZG9IapSA^$#3^BO+wMdd_He^?f#!nlpeQ+^a-4bI`9K?3J{59AfZ7ZYupP5 zN*U4QAGr=-Yk?SjMZ@6tcWF{E&25EYZKO*&G6V2dXfNr++`U~jcc2WETp<93!{wr=;KchDi# zgN?<)UIW|jhCUb_vPnoxL^}i@kL+}C(xwG+J#Xf2jG6$hKFseh8Wpq?AZs;9)G~em zDFKPDV5P&y2L$X!h^jXSPLZg3d3h<1(P6&7=vlGqVmL{G{G^tkW`N_!Q3|F43p6!C9`pBP8_i<8&xDapq?a*eQ}k?2ATlHD223iCAU`;_ z;N7iZI3IK*1u2B6l!NLK4+t>@p3egUNu$iec^B7qZ1W$^;4O~wzv3;#Ap8%wg14L7 ZM?a;X^rRLmhj7AVr4_GdUNw5~e*kqCkk9}C