Roche Limit is the point of no return. If a moon gets too close to its planet, the side facing the planet is pulled much harder than the side facing away. Eventually, this "stretch" (tidal force) becomes stronger than the gravity holding the moon together.
The Math: Why the Cube Root?
Since we live in a 3D universe, gravitational influence spreads out over a volume. When we convert that volume back into a linear distance (radius), we use the cube root.
Real-World Examples:
Saturn's Rings: These are basically "failed moons" or shattered debris that live inside Saturn's Roche limit. They can never clump together to form a moon because Saturn's gravity keeps shredding them.
The Moon: Briefly mention that the Moon is safely outside our Roche limit and is actually moving away from us at about 3.8 cm per year.
Python Code:
Code is based on NASA problem which calculates tidal force radii for Earth, Saturn, and Black holes. Respective targets are Moon, Pan and a supermassive star. It uses formulas based on densities or masses. We used dictionaries of tuples, and two functions. Code is given below:
import math
def calculate_roche_limit(primary_val, target_val, target_radius, is_density=True, fluid=True):
"""
Calculates the Roche Limit (Tidal Radius).
Args:
primary_val: Density or Mass of the primary body.
target_val: Density or Mass of the target (satellite).
target_radius: Physical radius of the target body.
is_density: Boolean, True if using density, False if using mass.
fluid: Boolean, True for 2.44 coefficient, False for 1.26 (rigid).
"""
# The fluid constant (2.44) assumes the satellite deforms before breaking.
# The rigid constant (1.26) is for solid, rocky bodies.
multiplier = 2.44 if fluid else 1.26
# Mathematically, the ratio of masses or densities works the same
# under the cube root when calculating the disruption distance.
ratio = primary_val / target_val
return multiplier * target_radius * math.pow(ratio, 1/3)
# --- Dataset for the Blog ---
# Format: "Primary Name": (Target Name, Primary Density/Mass, Target Density/Mass, Target Rad, Actual Dist)
planets_density = {
"Earth": ("Moon", 5514, 3340, 1737, 384400),
"Saturn": ("Pan", 687, 400, 14, 133584),
}
stars_mass = {
"Blackhole A": ("Sun-like Star", 10, 1, 695700, 50e6), # Mass in Solar Masses
"Blackhole B": ("Sun-like Star", 3, 1, 695700, 50e6),
}
def run_simulation():
print("-" * 50)
print("ROCHE LIMIT SIMULATION: WILL IT DISRUPT?")
print("-" * 50)
# 1. Density Analysis (Planetary)
print("\n[Section 1: Planetary Systems (Density Based)]")
for primary, (target, p_den, t_den, t_rad, dist) in planets_density.items():
limit = calculate_roche_limit(p_den, t_den, t_rad, is_density=True)
status = "DISRUPTED" if dist < limit else "STABLE"
print(f"{primary} vs {target}:")
print(f" Distance: {dist:,.0f} km | Roche Limit: {limit:,.0f} km")
print(f" Result: {status}")
# 2. Mass Analysis (Astrophysical)
print("\n[Section 2: High Gravity Systems (Mass Based)]")
for primary, (target, p_mass, t_mass, t_rad, dist) in stars_mass.items():
limit = calculate_roche_limit(p_mass, t_mass, t_rad, is_density=False)
status = "DISRUPTED" if dist < limit else "STABLE"
print(f"{primary} vs {target}:")
print(f" Distance: {dist:,.0f} km | Roche Limit: {limit:,.0f} km")
print(f" Result: {status}")
if __name__ == "__main__":
run_simulation()

No comments:
Post a Comment