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 UnwindSafe for LinearSystemSolver
Blanket Implementations§
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§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