Planar Entry Dynamics
Also known as canonical entry dynamics!
Overview
The Planar Entry model assumes a spacecraft moving in an exponential atmosphere about a spherical planet. Acceleration due to gravity is ignored. The equations of motion are shown below.
\[\begin{aligned} \dot{\gamma} &= \frac{1}{v} \left( L_m - (1 - \frac{v^2}{v_c^2}) g \cos{\gamma} \right) \\ \dot{v} &= -D_m - g \sin{\gamma} \\ \dot{r} &= v \sin{\gamma} \\ \dot{\theta} &= \frac{v}{r} \cos{\gamma} \\ \end{aligned}\]
Examples
julia> model = PlanarEntrySystem()
Model PlanarEntry with 4 equations States (4): γ(t): flight path angle in degrees v(t): airspeed in meters per second r(t): polar distance relative to planet center in meters θ(t): polar angle relative to planet horizontal in degrees Parameters (7): R: spherical planet radius P: atmospheric density at sea level in kilograms per meter cubed H: scale factor for exponential atmosphere in meters m: entry vehicle mass in kilograms ⋮
Let's compute the Jacobian for these dynamics.
julia> J = calculate_jacobian(PlanarEntrySystem())
4×4 Matrix{Num}: (sin(γ(t))*((R / r(t))^2)*(1 - ((v(t) / sqrt(μ / r(t)))^2))*μ) / ((R^2)*v(t)) … 0 (-((R / r(t))^2)*cos(γ(t))*μ) / (R^2) 0 v(t)*cos(γ(t)) 0 (-sin(γ(t))*v(t)) / r(t) 0
Finally, let's construct a Julia function which implements these dynamics!
julia> f = PlanarEntryFunction()
(::ODEFunction{true, SciMLBase.FullSpecialize, ModelingToolkit.var"#k#545"{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x510be63b, 0x5375dd43, 0x02383486, 0x537f71a3, 0x878b2e96), Nothing}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xba97c8c8, 0xbca3bd0a, 0xd551efee, 0x49ce5ec8, 0x7921545c), Nothing}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, ModelingToolkit.var"#___jac#551"{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xb736dc56, 0x5f8c4599, 0xd86410d6, 0x8139d429, 0xb1d95b54), Nothing}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xf9d68983, 0x99e2bc90, 0x11795c0a, 0x1d37149f, 0xedb90c33), Nothing}}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Vector{Symbol}, Symbol, Vector{Symbol}, ModelingToolkit.var"#630#generated_observed#555"{Bool, ODESystem, Dict{Any, Any}, Vector{SymbolicUtils.BasicSymbolic{Real}}}, Nothing, ODESystem}) (generic function with 1 method)
julia> let u = abs.(randn(4)), p = abs.(randn(7)), t = 0 f(u, p, t) end
4-element Vector{Float64}: 4.521159689425291 -0.37666511412162096 0.9749285590613717 0.2785620346557619