LinearSystemSolver

Struct LinearSystemSolver 

Source
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

Source

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 A
  • independent_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);
Source

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
);
Source

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§

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

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> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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

Performs the conversion.