Model Dynamics
This module defines two classes used to compute the accelerations of a satellite in polar and spherical coordinate systems.
These accelerations are used in numerical solvers such as RK45 for trajectory simulation.
PolarAccelerations: Provides acceleration functions in polar coordinates.SphericalAccelerations: Inherits fromPolarAccelerationsand extends the model to spherical coordinates (radial, polar, and azimuthal), enabling 3D orbital dynamics modeling.
@staticmethod
def comb_velocity(rad, radVel, angVel):
return np.sqrt(radVel**2 + (rad * angVel)**2)
Purpose: Computes the total velocity magnitude in polar coordinates from radial and angular components.
Parameters:
rad: Radial position (distance from Earth’s center), in meters.radVel: Radial velocity (ṙ), in m/s.angVel: Angular velocity (θ̇), in rad/s.
Implementation:
Computes total velocity as the Euclidean norm of radial and tangential velocity: √(ṙ² + (rθ̇)²).
@staticmethod
def drag_start(C_d, A, m, r):
Re = 6371e3
h = r - Re
result = 0.5 * atmospheric_density(h) * C_d * A / m
return result
Purpose: Calculates the atmospheric drag force.
Parameters:
C_d: Drag coefficient (dimensionless).A: Cross-sectional area of the satellite (in m²).m: Mass of the satellite (in kg).r: Radial position from Earth’s center (in m).
Implementation:
Computes the altitude above Earth’s surface:
h = r - Re.Queries the atmospheric density at altitude
h.Returns the constant multiplier part of the drag force expression.
@staticmethod
def accelerations(u1, u2, u3, u4):
...
return np.array([u1_dot, u2_dot, u3_dot, u4_dot])
Purpose: Computes the time derivatives of the satellite’s state in polar coordinates.
Parameters:
u1: Radial position (r)u2: Radial velocity (ṙ)u3: Angular position (θ)u4: Angular velocity (θ̇)
Implementation:
Computes the drag using
drag_start().Computes total velocity with
comb_velocity().Uses Newton’s second law and angular motion equations to derive accelerations.
Returns
[ṙ, r̈, θ̇, θ̈].
@staticmethod
def comb_velocity(rad, radVel, polAng, polVel, aziVel):
return np.sqrt(
radVel**2 + rad**2 * (polVel**2 + np.sin(polAng)**2 * aziVel**2))
Purpose: Computes the total velocity magnitude in spherical coordinates using radial, polar, and azimuthal components.
Parameters:
rad: Radial distance.radVel: Radial velocity.polAng: Polar angle.polVel: Polar angular velocity.aziVel: Azimuthal angular velocity.
Implementation:
Calculates velocity magnitude using the spherical velocity formula:
√(ṙ² + r²(φ̇² + sin²(φ)·λ̇²)).
@staticmethod
def accelerations(u1, u2, u3, u4, u5, u6):
...
return np.array([u1_dot, u2_dot, u3_dot, u4_dot, u5_dot, u6_dot])
Purpose: Computes the full state derivatives of a satellite in spherical coordinates, suitable for high-fidelity simulations.
Parameters:
u1: Radial position (r)u2: Radial velocity (ṙ)u3: Polar angle (φ)u4: Polar angular velocity (φ̇)u5: Azimuthal angle (λ)u6: Azimuthal angular velocity (λ̇)
Implementation:
Calculates drag coefficient using
drag_start().Computes velocity magnitude with
comb_velocity().Applies equations of motion in spherical coordinates.
Returns
[ṙ, r̈, φ̇, φ̈, λ̇, λ̈].