pub struct GeodesicSRI {
pub eps: f64,
}Expand description
Geodesic SRI: strong order 1.5 approximation for manifold SDEs.
Extends GeodesicMilstein with the dZ iterated-integral correction term.
Full step: v = f(x)dt + g(x)dW + 0.5nabla_g(g)(dW^2 - dt) + nabla_g(g)*dZ x_new = exp_x(v)
where nabla_g(g) is approximated by finite-difference parallel transport: nabla_g g(x) ≈ (1/eps) * [PT_{y->x}(g(y)) - g(x)], y = exp_x(eps*g(x))
§Single-FD note
This uses nabla_g g for both the Milstein correction and the dZ term. Full SRI1 would require a second PT-based FD for nabla_g(nabla_g g). This approximation is O(dt^{3/2}) accurate for smooth diffusion fields.
Fields§
§eps: f64Finite-difference step size for covariant derivative approximation.
Implementations§
Source§impl GeodesicSRI
impl GeodesicSRI
Sourcepub fn step<M, D, G>(
&self,
sde: &ManifoldSDE<M, D, G>,
x: &M::Point,
t: f64,
dt: f64,
inc: &Increment<f64>,
) -> M::Point
pub fn step<M, D, G>( &self, sde: &ManifoldSDE<M, D, G>, x: &M::Point, t: f64, dt: f64, inc: &Increment<f64>, ) -> M::Point
Advance x by one SRI step on the manifold.
Computes the Milstein and dZ corrections via finite-difference parallel transport:
- Walk eps along g(x) to get y = exp_x(eps * g(x)).
- Evaluate g at y.
- Transport g(y) back from y to x via ParallelTransport.
- Approx covariant deriv: nabla_g g ≈ (PT(g(y)) - g(x)) / eps.
- Milstein correction: 0.5 * nabla_g(g) * (dW^2 - dt).
- SRI correction: nabla_g(g) * dZ.
- Apply exp to the full tangent displacement.
If transport fails (cut locus), falls back to Euler step.
Trait Implementations§
Source§impl Default for GeodesicSRI
impl Default for GeodesicSRI
Source§impl<M, D, G> GeoScheme<M, D, G> for GeodesicSRI
impl<M, D, G> GeoScheme<M, D, G> for GeodesicSRI
Auto Trait Implementations§
impl Freeze for GeodesicSRI
impl RefUnwindSafe for GeodesicSRI
impl Send for GeodesicSRI
impl Sync for GeodesicSRI
impl Unpin for GeodesicSRI
impl UnsafeUnpin for GeodesicSRI
impl UnwindSafe for GeodesicSRI
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.