7.9 Solving Systems of Equations

► |  | Math Library

1 | Constants and Elementary Functions
2 | Flonums
3 | Special Functions
4 | Number Theory
5 | Arbitrary-Precision Floating-Point Numbers (Bigfloats)
6 | Arrays
7 | Matrices and Linear Algebra
8 | Statistics Functions
9 | Probability Distributions
10 | Stuff That Doesn’t Belong Anywhere Else

▼ | 7 | Matrices and Linear Algebra

7.1 | Introduction
7.2 | Types, Predicates and Accessors
7.3 | Construction
7.4 | Conversion
7.5 | Entrywise Operations and Arithmetic
7.6 | Polymorphic Operations
7.7 | Basic Operations
7.8 | Inner Product Space Operations
7.9 | Solving Systems of Equations
7.10 | Row-Based Algorithms
7.11 | Orthogonal Algorithms
7.12 | Operator Norms and Comparing Matrices

On this page:

matrix-solve
matrix-inverse
matrix-invertible?
matrix-determinant

top ← prev up next →

#### 7.9`` Solving Systems of Equations

> procedure (matrix-solve M B [fail]) → (U F (Matrix Number))
> M : (Matrix Number)
> B : (Matrix Number)
> fail : (-> F) = (λ () (error ...))

Returns the matrix X for which (matrix* M X) is B. M and B must have the same number of rows.

It is typical for B (and thus X) to be a column matrix, but not required. If B is not a column matrix, matrix-solve solves for all the columns in B simultaneously.

Examples:

> > (define M (matrix [[7 5] [3 -2]]))
> > (define B0 (col-matrix [3 22]))
> > (define B1 (col-matrix [19 4]))
> > (matrix-solve M B0)
> - : (Array Real)
> (array #[#[4] #[-5]])
> > (matrix* M (col-matrix [4 -5]))
> - : #(struct:Array
> (Indexes Index (Boxof Boolean) (-> Void) (-> Indexes Integer)))
> (array #[#[3] #[22]])
> > (matrix-solve M B1)
> - : (Array Real)
> (array #[#[2] #[1]])
> > (matrix-cols (matrix-solve M (matrix-augment (list B0 B1))))
> - : (Listof (Array Real))
> (list (array #[#[4] #[-5]]) (array #[#[2] #[1]]))

matrix-solve does not solve overconstrained or underconstrained systems, meaning that M must be invertible. If M is not invertible, the result of applying the failure thunk fail is returned.

matrix-solve is implemented using matrix-gauss-elim to preserve exactness in its output, with partial pivoting for greater numerical stability when M is not exact.

See vandermonde-matrix for an example that uses matrix-solve to compute Legendre polynomials.

> procedure (matrix-inverse M [fail]) → (U F (Matrix Number))
> M : (Matrix Number)
> fail : (-> F) = (λ () (error ...))

Wikipedia: Invertible Matrix Returns the inverse of M if it exists; otherwise returns the result of applying the failure thunk fail.

Examples:

> > (matrix-inverse (identity-matrix 3))
> - : (Array Real)
> (array #[#[1 0 0] #[0 1 0] #[0 0 1]])
> > (matrix-inverse (matrix [[7 5] [3 -2]]))
> - : (Array Real)
> (array #[#[2/29 5/29] #[3/29 -7/29]])
> > (matrix-inverse (matrix [[1 2] [10 20]]))
> matrix-inverse: contract violation
> expected: matrix-invertible?
> given: (array #[#[1 2] #[10 20]])
> > (matrix-inverse (matrix [[1 2] [10 20]]) (λ () #f))
> - : (U False (Array Real))
> #f

> procedure (matrix-invertible? M) → Boolean
> M : (Matrix Number)

Returns #t when M is a square-matrix? and (matrix-determinant M) is nonzero.

> procedure (matrix-determinant M) → Number
> M : (Matrix Number)

Wikipedia: Determinant Returns the determinant of M, which must be a square-matrix?.

Examples:

> > (matrix-determinant (diagonal-matrix '(1 2 3 4)))
> - : Real
> 24
> > (* 1 2 3 4)
> - : Integer [more precisely: Positive-Integer]
> 24
> > (matrix-determinant (matrix [[1 2] [10 20]]))
> - : Real
> 0
> > (matrix-determinant (col-matrix [1 2]))
> square-matrix-size: contract violation
> expected: square-matrix?
> given: (array #[#[1] #[2]])

top ← prev up next →