Jacobi Fields
Jacobi fields measure how nearby geodesics spread apart. integrate_jacobi
solves the Jacobi ODE along a geodesic using RK4 integration, returning field
values at sampled parameter values and detecting conjugate points.
Summary
| Property | Value |
|---|---|
| Function | integrate_jacobi |
| Returns | JacobiResult |
| ODE | |
| Integrator | RK4 with fixed step size |
| Trait requirements | Manifold + Curvature |
The Jacobi ODE
A Jacobi field along geodesic satisfies:
with initial conditions (initial displacement) and (initial derivative). is the Riemann curvature tensor.
Conjugate points: is conjugate to along if there exists a non-zero Jacobi field with and . Past the first conjugate point, the exponential map is no longer a local diffeomorphism; geodesics are no longer locally length-minimizing.
JacobiResult
pub struct JacobiResult {
pub t_values: Vec<f64>, // parameter values
pub field_values: Vec<M::Tangent>, // J(t) at each t
pub norms: Vec<f64>, // ||J(t)|| at each t
pub conjugate_point: Option<f64>, // first t where ||J(t)|| < tol, if any
}Code Examples
Jacobi field on S²
use cartan::prelude::*;
use cartan::manifolds::Sphere;
use cartan_geo::{Geodesic, integrate_jacobi};
use nalgebra::SVector;
let s2 = Sphere::<3>;
let p = [1.0_f64, 0.0, 0.0];
let v = s2.project_tangent(&p, &[0.0_f64, 1.0, 0.0]); // unit speed
let geo = Geodesic::new(&s2, p, v.clone());
// Initial Jacobi field: J(0) = 0, J'(0) = perpendicular to v
let j0 = [0.0_f64; 3].into();
let j0p = s2.project_tangent(&p, &SVector::from([0.0_f64, 0.0, 1.0]));
let result = integrate_jacobi(&s2, &geo, j0, j0p, 100, std::f64::consts::PI);
// On S², conjugate point at t = π (antipodal)
assert!(result.conjugate_point.is_some());
let t_conj = result.conjugate_point.unwrap();
assert!((t_conj - std::f64::consts::PI).abs() < 0.1);Checking geodesic stability
// If no conjugate point before t = 1: geodesic from p to q is minimizing
if result.conjugate_point.map(|t| t > 1.0).unwrap_or(true) {
println!("Geodesic is length-minimizing on [0, 1]");
}Numerical Notes
Step size: use n_steps large enough that the step size
is well below the injectivity radius. For with , n_steps = 100
gives , adequate for most uses.
Conjugate point detection: detected when . Increase
n_steps for sharper localization.
Curvature dependency: high curvature (small injectivity radius) requires smaller step sizes for accurate integration.
Applications
- Conjugate point detection: determine the valid domain of the exponential map
- Geodesic instability analysis: active nematics, volterra defect dynamics
- Sensitivity analysis: how perturbations propagate along trajectories
- Optimal transport: Jacobi fields appear in displacement interpolation