pub struct DaeProblem<S: Scalar, F, M>{
pub f: F,
pub mass: M,
pub t0: S,
pub tf: S,
pub y0: Vec<S>,
pub alg_indices: Vec<usize>,
}Expand description
DAE (Differential-Algebraic Equation) problem.
Represents: M * y’ = f(t, y)
where M is a (possibly singular) mass matrix.
- When M is nonsingular, this is equivalent to y’ = M⁻¹ f(t, y)
- When M is singular (index-1 DAE), some equations are algebraic constraints
§Example: Pendulum DAE
The pendulum in Cartesian coordinates:
x'' = -λx (x-component of constraint force)
y'' = -λy - g (y-component + gravity)
x² + y² = L² (constraint: pendulum length)Written as first-order DAE with y = [x, y, vx, vy, λ]:
x' = vx (differential)
y' = vy (differential)
vx' = -λx (differential)
vy' = -λy - g (differential)
0 = x² + y² - L² (algebraic)Fields§
§f: FRight-hand side function
mass: MMass matrix function
t0: SInitial time
tf: SFinal time
y0: Vec<S>Initial state (must be consistent!)
alg_indices: Vec<usize>Indices of algebraic variables (where M[i,i] = 0)
Implementations§
Source§impl<S: Scalar, F, M> DaeProblem<S, F, M>
impl<S: Scalar, F, M> DaeProblem<S, F, M>
Sourcepub fn new(
f: F,
mass: M,
t0: S,
tf: S,
y0: Vec<S>,
alg_indices: Vec<usize>,
) -> Self
pub fn new( f: F, mass: M, t0: S, tf: S, y0: Vec<S>, alg_indices: Vec<usize>, ) -> Self
Create a new DAE problem.
§Arguments
f- RHS functionmass- Mass matrix function (fills row-major array)t0- Initial timetf- Final timey0- Initial state (must satisfy algebraic constraints!)alg_indices- Indices of algebraic equations
Trait Implementations§
Source§impl<S: Scalar, F, M> OdeSystem<S> for DaeProblem<S, F, M>
impl<S: Scalar, F, M> OdeSystem<S> for DaeProblem<S, F, M>
Source§fn has_mass_matrix(&self) -> bool
fn has_mass_matrix(&self) -> bool
Does this system have a mass matrix?
Source§fn mass_matrix(&self, mass: &mut [S])
fn mass_matrix(&self, mass: &mut [S])
Get the mass matrix M for the DAE: M * y’ = f(t, y) Read more
Source§fn is_singular_mass(&self) -> bool
fn is_singular_mass(&self) -> bool
Is the mass matrix singular? (i.e., is this a DAE?)
Source§fn algebraic_indices(&self) -> Vec<usize>
fn algebraic_indices(&self) -> Vec<usize>
Return indices of algebraic variables (where
M[i,i] = 0). Read moreSource§fn jacobian(&self, t: S, y: &[S], jac: &mut [S])
fn jacobian(&self, t: S, y: &[S], jac: &mut [S])
Optionally compute the Jacobian:
J = ∂f/∂y, row-major
(jac[i*n + j] = ∂f_i/∂y_j, length n²). Read moreSource§fn is_autonomous(&self) -> bool
fn is_autonomous(&self) -> bool
Is the system autonomous? (f does not depend on t explicitly)
Auto Trait Implementations§
impl<S, F, M> Freeze for DaeProblem<S, F, M>
impl<S, F, M> RefUnwindSafe for DaeProblem<S, F, M>
impl<S, F, M> Send for DaeProblem<S, F, M>
impl<S, F, M> Sync for DaeProblem<S, F, M>
impl<S, F, M> Unpin for DaeProblem<S, F, M>
impl<S, F, M> UnsafeUnpin for DaeProblem<S, F, M>
impl<S, F, M> UnwindSafe for DaeProblem<S, F, M>
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
Mutably borrows from an owned value. Read more
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>
Converts
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>
Converts
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 more