pub struct LinearSystemSolver;Expand description
Linear system of ODEs solver
Solves systems dx/dt = Ax where A is a constant coefficient matrix.
Implementations§
Source§impl LinearSystemSolver
impl LinearSystemSolver
Sourcepub fn solve(
&self,
coefficient_matrix: &Matrix,
independent_var: &Symbol,
initial_conditions: Option<Vec<Expression>>,
) -> Result<Vec<Expression>, ODEError>
pub fn solve( &self, coefficient_matrix: &Matrix, independent_var: &Symbol, initial_conditions: Option<Vec<Expression>>, ) -> Result<Vec<Expression>, ODEError>
Solve linear system dx/dt = Ax
Uses eigenvalue-eigenvector method. For an n×n system:
- Compute eigenvalues λ₁, λ₂, …, λₙ and eigenvectors v₁, v₂, …, vₙ
- General solution: x(t) = c₁e^(λ₁t)v₁ + c₂e^(λ₂t)v₂ + … + cₙe^(λₙt)vₙ
§Complexity
- Time: O(n³) for eigenvalue decomposition of n×n matrix
- Space: O(n²) for storing eigenvectors and intermediate results
§Arguments
coefficient_matrix- The constant coefficient matrix Aindependent_var- The independent variable (typically t)initial_conditions- Optional initial state vector x(t₀) = x₀
§Returns
Vector of expressions representing the solution [x₁(t), x₂(t), …, xₙ(t)]
§Examples
use mathhook_core::calculus::ode::systems::LinearSystemSolver;
use mathhook_core::matrices::Matrix;
use mathhook_core::{symbol, expr};
let t = symbol!(t);
// 2×2 system: dx/dt = [1 0; 0 2]x
let matrix = Matrix::diagonal(vec![expr!(1), expr!(2)]);
let solver = LinearSystemSolver;
let solution = solver.solve(&matrix, &t, None);Sourcepub fn solve_2x2(
&self,
a11: &Expression,
a12: &Expression,
a21: &Expression,
a22: &Expression,
independent_var: &Symbol,
) -> Result<Vec<Expression>, ODEError>
pub fn solve_2x2( &self, a11: &Expression, a12: &Expression, a21: &Expression, a22: &Expression, independent_var: &Symbol, ) -> Result<Vec<Expression>, ODEError>
Solve 2×2 linear system dx/dt = Ax
Specialized solver for 2×2 systems with explicit formulas.
§Complexity
- Time: O(1) for 2×2 eigenvalue computation (quadratic formula)
- Space: O(1) for storing solution components
§Arguments
a11,a12,a21,a22- Matrix coefficients [a11 a12; a21 a22]independent_var- The independent variable (typically t)
§Returns
Vector [x₁(t), x₂(t)] representing the solution
§Examples
use mathhook_core::calculus::ode::systems::LinearSystemSolver;
use mathhook_core::{symbol, expr};
let t = symbol!(t);
// dx/dt = [1 0; 0 2]x
let solver = LinearSystemSolver;
let solution = solver.solve_2x2(
&expr!(1), &expr!(0),
&expr!(0), &expr!(2),
&t
);Sourcepub fn solve_3x3(
&self,
matrix_entries: &[Expression; 9],
independent_var: &Symbol,
) -> Result<Vec<Expression>, ODEError>
pub fn solve_3x3( &self, matrix_entries: &[Expression; 9], independent_var: &Symbol, ) -> Result<Vec<Expression>, ODEError>
Solve 3×3 linear system dx/dt = Ax
Specialized solver for 3×3 systems.
§Complexity
- Time: O(1) for 3×3 eigenvalue computation (cubic formula)
- Space: O(1) for storing solution components
§Arguments
matrix_entries- Flattened 3×3 matrix entries [a11, a12, a13, a21, a22, a23, a31, a32, a33]independent_var- The independent variable (typically t)
§Returns
Vector [x₁(t), x₂(t), x₃(t)] representing the solution
§Examples
use mathhook_core::calculus::ode::systems::LinearSystemSolver;
use mathhook_core::{symbol, expr};
let t = symbol!(t);
// dx/dt = [1 0 0; 0 2 0; 0 0 3]x (diagonal)
let solver = LinearSystemSolver;
let solution = solver.solve_3x3(
&[expr!(1), expr!(0), expr!(0),
expr!(0), expr!(2), expr!(0),
expr!(0), expr!(0), expr!(3)],
&t
);Auto Trait Implementations§
impl Freeze for LinearSystemSolver
impl RefUnwindSafe for LinearSystemSolver
impl Send for LinearSystemSolver
impl Sync for LinearSystemSolver
impl Unpin for LinearSystemSolver
impl UnsafeUnpin for LinearSystemSolver
impl UnwindSafe for LinearSystemSolver
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