UNPKG

keplerian-core

Version:

High-performance TypeScript library for orbital mechanics calculations, providing numerical integration, state propagation, and perturbation modeling for Keplerian orbits.

33 lines (32 loc) 1.72 kB
// Leapfrog integrator implementation import { vectorAdd, vectorScale, vectorCross2D } from '../../utils/vector'; import { calculateRungeLenzVector, calculateOrbitalEnergy } from '../forces'; export const leapfrogIntegrator = { name: 'leapfrog', displayName: 'Leapfrog', description: 'Second-order symplectic integrator. Good energy conservation.', order: 2, recommended: false, function: (state, params, accelerationFn, time, dt) => { const acceleration = accelerationFn(state.position, state.velocity, params); const halfVelocity = vectorAdd(state.velocity, vectorScale(acceleration, 0.5 * params.timeStep)); const newPosition = vectorAdd(state.position, vectorScale(halfVelocity, params.timeStep)); const newAcceleration = accelerationFn(newPosition, halfVelocity, params); const newVelocity = vectorAdd(halfVelocity, vectorScale(newAcceleration, 0.5 * params.timeStep)); const momentum = vectorScale(newVelocity, params.orbitingMass); const angularMomentum = vectorCross2D(newPosition, momentum); const rungeLenzVector = calculateRungeLenzVector(newPosition, newVelocity, params); const energy = calculateOrbitalEnergy(newPosition, newVelocity, params); const k = params.gravitationalConstant * params.centralMass * params.orbitingMass; const eccentricity = Math.sqrt(rungeLenzVector.x * rungeLenzVector.x + rungeLenzVector.y * rungeLenzVector.y) / (params.orbitingMass * k); return { position: newPosition, velocity: newVelocity, momentum, angularMomentum, rungeLenzVector, energy, eccentricity }; } };