Struct ODEProblem

Source
pub struct ODEProblem<T, V, D, F>
where T: Real, V: State<T>, D: CallBackData, F: ODE<T, V, D>,
{ pub ode: F, pub t0: T, pub tf: T, pub y0: V, /* private fields */ }
Expand description

Initial Value Problem for Ordinary Differential Equations (ODEs)

The Initial Value Problem takes the form: y’ = f(t, y), a <= t <= b, y(a) = alpha

§Overview

The ODEProblem struct provides a simple interface for solving differential equations:

§Example

use differential_equations::prelude::*;

struct LinearEquation {
   pub a: f32,
   pub b: f32,
}

impl ODE<f32, f32> for LinearEquation {
   fn diff(&self, _t: f32, y: &f32, dydt: &mut f32) {
       *dydt = self.a + self.b * y;
  }
}

// Create the ode and initial conditions
let ode = LinearEquation { a: 1.0, b: 2.0 };
let t0 = 0.0;
let tf = 1.0;
let y0 = 1.0;
let mut solver = DOP853::new().rtol(1e-8).atol(1e-6);

// Basic usage:
let problem = ODEProblem::new(ode, t0, tf, y0);
let solution = problem.solve(&mut solver).unwrap();

// Advanced output control:
let solution = problem.even(0.1).solve(&mut solver).unwrap();

§Fields

  • ode - ODE implementing the differential equation
  • t0 - Initial time
  • tf - Final time
  • y0 - Initial state vector

§Basic Usage

  • new(ode, t0, tf, y0) - Create a new ODEProblem
  • solve(&mut solver) - Solve using default output (solver step points)

§Output Control Methods

These methods configure how solution points are generated and returned:

  • even(dt) - Generate evenly spaced output points with interval dt
  • dense(n) - Include n interpolated points between each solver step
  • t_eval(points) - Evaluate solution at specific time points
  • solout(custom_solout) - Use a custom output handler

Each returns a solver configuration that can be executed with .solve(&mut solver).

§Example 2

use differential_equations::prelude::*;
use nalgebra::{SVector, vector};

struct HarmonicOscillator { k: f64 }

impl ODE<f64, SVector<f64, 2>> for HarmonicOscillator {
    fn diff(&self, _t: f64, y: &SVector<f64, 2>, dydt: &mut SVector<f64, 2>) {
        dydt[0] = y[1];
        dydt[1] = -self.k * y[0];
    }
}

let ode = HarmonicOscillator { k: 1.0 };
let mut method = DOP853::new().rtol(1e-12).atol(1e-12);

// Basic usage with default output points
let problem = ODEProblem::new(ode, 0.0, 10.0, vector![1.0, 0.0]);
let results = problem.solve(&mut method).unwrap();

// Advanced: evenly spaced output with 0.1 time intervals
let results = problem.dense(4).solve(&mut method).unwrap();

Fields§

§ode: F§t0: T§tf: T§y0: V

Implementations§

Source§

impl<T, V, D, F> ODEProblem<T, V, D, F>
where T: Real, V: State<T>, D: CallBackData, F: ODE<T, V, D>,

Source

pub fn new(ode: F, t0: T, tf: T, y0: V) -> Self

Create a new Initial Value Problem

§Arguments
  • ode - ODE containing the Differential Equation and Optional Terminate Function.
  • t0 - Initial Time.
  • tf - Final Time.
  • y0 - Initial State Vector.
§Returns
  • ODEProblem Problem ready to be solved.
Source

pub fn solve<S>(&self, solver: &mut S) -> Result<Solution<T, V, D>, Error<T, V>>
where S: ODENumericalMethod<T, V, D> + Interpolation<T, V>,

Solve the ODEProblem using a default solout, e.g. outputting solutions at calculated steps.

§Returns
  • Result<Solution<T, V, D>, Status<T, V, D>> - Ok(Solution) if successful or interrupted by events, Err(Status) if an errors or issues such as stiffness are encountered.
Source

pub fn solout<'a, O: Solout<T, V, D>>( &'a self, solout: &'a mut O, ) -> ODEProblemMutRefSoloutPair<'a, T, V, D, F, O>

Returns an ODEProblem ODENumericalMethod with the provided solout function for outputting points.

§Returns
  • ODEProblem ODENumericalMethod with the provided solout function ready for .solve() method.
Source

pub fn even(&self, dt: T) -> ODEProblemSoloutPair<'_, T, V, D, F, EvenSolout<T>>

Uses the an Even Solout implementation to output evenly spaced points between the initial and final time. Note that this does not include the solution of the calculated steps.

§Arguments
  • dt - Interval between each output point.
§Returns
  • ODEProblem ODENumericalMethod with Even Solout function ready for .solve() method.
Source

pub fn dense( &self, n: usize, ) -> ODEProblemSoloutPair<'_, T, V, D, F, DenseSolout>

Uses the Dense Output method to output n number of interpolation points between each step. Note this includes the solution of the calculated steps.

§Arguments
  • n - Number of interpolation points between each step.
§Returns
  • ODEProblem ODENumericalMethod with Dense Output function ready for .solve() method.
Source

pub fn t_eval( &self, points: Vec<T>, ) -> ODEProblemSoloutPair<'_, T, V, D, F, TEvalSolout<T>>

Uses the provided time points for evaluation instead of the default method. Note this does not include the solution of the calculated steps.

§Arguments
  • points - Custom output points.
§Returns
  • ODEProblem ODENumericalMethod with Custom Time Evaluation function ready for .solve() method.
Source

pub fn crossing( &self, component_idx: usize, threshhold: T, direction: CrossingDirection, ) -> ODEProblemSoloutPair<'_, T, V, D, F, CrossingSolout<T>>

Uses the CrossingSolout method to output points when a specific component crosses a threshold. Note this does not include the solution of the calculated steps.

§Arguments
  • component_idx - Index of the component to monitor for crossing.
  • threshhold - Value to cross.
  • direction - Direction of crossing (positive or negative).
§Returns
  • ODEProblem ODENumericalMethod with CrossingSolout function ready for .solve() method.
Source

pub fn hyperplane_crossing<V1>( &self, point: V1, normal: V1, extractor: fn(&V) -> V1, direction: CrossingDirection, ) -> ODEProblemSoloutPair<'_, T, V, D, F, HyperplaneCrossingSolout<T, V1, V>>
where V1: State<T>,

Uses the HyperplaneCrossingSolout method to output points when a specific hyperplane is crossed. Note this does not include the solution of the calculated steps.

§Arguments
  • point - Point on the hyperplane.
  • normal - Normal vector of the hyperplane.
  • extractor - Function to extract the component from the state vector.
  • direction - Direction of crossing (positive or negative).
§Returns
  • ODEProblem ODENumericalMethod with HyperplaneCrossingSolout function ready for .solve() method.

Trait Implementations§

Source§

impl<T, V, D, F> Clone for ODEProblem<T, V, D, F>
where T: Real + Clone, V: State<T> + Clone, D: CallBackData + Clone, F: ODE<T, V, D> + Clone,

Source§

fn clone(&self) -> ODEProblem<T, V, D, F>

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T, V, D, F> Debug for ODEProblem<T, V, D, F>
where T: Real + Debug, V: State<T> + Debug, D: CallBackData + Debug, F: ODE<T, V, D> + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T, V, D, F> Freeze for ODEProblem<T, V, D, F>
where F: Freeze, T: Freeze, V: Freeze,

§

impl<T, V, D, F> RefUnwindSafe for ODEProblem<T, V, D, F>

§

impl<T, V, D, F> Send for ODEProblem<T, V, D, F>
where F: Send, V: Send, D: Send,

§

impl<T, V, D, F> Sync for ODEProblem<T, V, D, F>
where F: Sync, V: Sync, D: Sync,

§

impl<T, V, D, F> Unpin for ODEProblem<T, V, D, F>
where F: Unpin, T: Unpin, V: Unpin, D: Unpin,

§

impl<T, V, D, F> UnwindSafe for ODEProblem<T, V, D, F>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> CallBackData for T
where T: Clone + Debug,