Struct DDEProblem

Source
pub struct DDEProblem<const L: usize, T, V, D, F, H>
where T: Real, V: State<T>, D: CallBackData, F: DDE<L, T, V, D>, H: Fn(T) -> V,
{ pub dde: F, pub t0: T, pub tf: T, pub y0: V, pub phi: H, /* private fields */ }
Expand description

Initial Value Problem for Delay Differential Equations (DDEs)

The Initial Value Problem takes the form: y’(t) = f(t, y(t), y(t-tau1), …), t ∈ [t0, tf], y(t) = phi(t) for t <= t0

§Overview

The DDEProblem struct provides a simple interface for solving DDEs:

§Example

use differential_equations::prelude::*;
use differential_equations::dde::methods::BS23;
use nalgebra::{Vector2, vector};

let mut bs23 = BS23::new()
   .rtol(1e-6)
   .atol(1e-6);

let t0 = 0.0;
let tf = 10.0;
let y0 = vector![1.0, 0.0];
let phi = |t| {
    y0
};
struct Example;
impl DDE<1, f64, Vector2<f64>> for Example {
    fn diff(&self, t: f64, y: &Vector2<f64>, yd: &[Vector2<f64>; 1], dydt: &mut Vector2<f64>) {
       dydt[0] = y[1] + yd[0][0];
       dydt[1] = -y[0] + yd[0][1];
    }

    fn lags(&self, _t: f64, _y: &Vector2<f64>, lags: &mut [f64; 1]) {
       lags[0] = 1.0; // Fixed delay of 1.0
    }
}
let solution = DDEProblem::new(Example, t0, tf, y0, phi).solve(&mut bs23).unwrap();

let (t, y) = solution.last().unwrap();
println!("Solution: ({}, {})", t, y);

§Fields

  • dde - DDE implementing the differential equation
  • t0 - Initial time
  • tf - Final time
  • y0 - Initial state vector at t0
  • phi - Initial history function phi(t) for t <= t0

§Basic Usage

  • new(dde, t0, tf, y0, phi) - Create a new DDEProblem
  • 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).

Fields§

§dde: F§t0: T§tf: T§y0: V§phi: H

Implementations§

Source§

impl<const L: usize, T, V, D, F, H> DDEProblem<L, T, V, D, F, H>
where T: Real, V: State<T>, D: CallBackData, F: DDE<L, T, V, D>, H: Fn(T) -> V + Clone,

Source

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

Create a new Initial Value Problem for DDEs

§Arguments
  • dde - DDE containing the Differential Equation and Optional Terminate Function.
  • t0 - Initial Time.
  • tf - Final Time.
  • y0 - Initial State Vector at t0.
  • phi - Initial History Function phi(t) for t <= t0.
§Returns
  • DDEProblem Problem ready to be solved.
Source

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

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

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

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

Returns a DDEProblem DDENumericalMethod with the provided solout function for outputting points.

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

pub fn even( &self, dt: T, ) -> DDEProblemSoloutPair<'_, L, T, V, D, F, H, 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
  • DDEProblem DDENumericalMethod with Even Solout function ready for .solve() method.
Source

pub fn dense( &self, n: usize, ) -> DDEProblemSoloutPair<'_, L, T, V, D, F, H, 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
  • DDEProblem DDENumericalMethod with Dense Output function ready for .solve() method.
Source

pub fn t_eval( &self, points: Vec<T>, ) -> DDEProblemSoloutPair<'_, L, T, V, D, F, H, 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
  • DDEProblem DDENumericalMethod with Custom Time Evaluation function ready for .solve() method.
Source

pub fn crossing( &self, component_idx: usize, threshhold: T, direction: CrossingDirection, ) -> DDEProblemSoloutPair<'_, L, T, V, D, F, H, 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
  • DDEProblem DDENumericalMethod with CrossingSolout function ready for .solve() method.
Source

pub fn hyperplane_crossing<V1>( &self, point: V1, normal: V1, extractor: fn(&V) -> V1, direction: CrossingDirection, ) -> DDEProblemSoloutPair<'_, L, T, V, D, F, H, 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
  • DDEProblem DDENumericalMethod with HyperplaneCrossingSolout function ready for .solve() method.

Trait Implementations§

Source§

impl<const L: usize, T, V, D, F, H> Clone for DDEProblem<L, T, V, D, F, H>
where T: Real + Clone, V: State<T> + Clone, D: CallBackData + Clone, F: DDE<L, T, V, D> + Clone, H: Fn(T) -> V + Clone,

Source§

fn clone(&self) -> DDEProblem<L, T, V, D, F, H>

Returns a duplicate 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<const L: usize, T, V, D, F, H> Debug for DDEProblem<L, T, V, D, F, H>
where T: Real + Debug, V: State<T> + Debug, D: CallBackData + Debug, F: DDE<L, T, V, D> + Debug, H: Fn(T) -> V + Debug,

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<const L: usize, T, V, D, F, H> Freeze for DDEProblem<L, T, V, D, F, H>
where F: Freeze, T: Freeze, V: Freeze, H: Freeze,

§

impl<const L: usize, T, V, D, F, H> RefUnwindSafe for DDEProblem<L, T, V, D, F, H>

§

impl<const L: usize, T, V, D, F, H> Send for DDEProblem<L, T, V, D, F, H>
where F: Send, V: Send, H: Send, D: Send,

§

impl<const L: usize, T, V, D, F, H> Sync for DDEProblem<L, T, V, D, F, H>
where F: Sync, V: Sync, H: Sync, D: Sync,

§

impl<const L: usize, T, V, D, F, H> Unpin for DDEProblem<L, T, V, D, F, H>
where F: Unpin, T: Unpin, V: Unpin, H: Unpin, D: Unpin,

§

impl<const L: usize, T, V, D, F, H> UnwindSafe for DDEProblem<L, T, V, D, F, H>

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,