Linearni sistemi enačb
Rešujemo linearni sistem enačb $A x = b$ z LU razcepom
\[ x + y -2z = 1 x -y + z = 2 2x -2z = 3\]
Za reševanje sistema z računalnikom, je najbolje prikladno, če sistem prevedemo v matrično obliko:
\[ Ax = b,\]
kjer je $A$ matrika sistema, $b$ je vektor desnih strani, $x$ pa vektor spremenljivk, ki jih iščemo
A = [1 1  -2; 1 -1 1; 2 0 -2]3×3 Matrix{Int64}:
 1   1  -2
 1  -1   1
 2   0  -2Numerično lahko poiščemo rešitev sistema na različne načine:
- z gaussovo eliminacijo razširjene matrike in obratnim vstavljanjem
 - z LU razcepom in nato z direktnim in obratnim vstavljanjem
 - z množenjem z inverzno matriko (ni priporočljivo)
 - z iterativnimi metodami
 - ...
 
Z LU razcepom lahko povsem nadomestimo potrebo po računanju inverzne matrike. Faktorja $L$ in $U$ iz razcepa lahko uporabimo, da učinkovito implementiramo operacije, ki jih sicer formalno zapišemo z inverzom matrike. Najbolj uporabna je operacija množenja z inverzno matriko. Računanje produkta $x = A^{-1}b$ je ekvivalentno iskanju rešitve sistema $Ax = b$. Če poznamo LU razcep matrike $A$, lahko enako učinkovito rešimo sistem $Ax = LUx = b$, kot če bi poznali inverz matrike $A^{-1}$ in računali produkt inverzne matrike z vektorjem.
Rešitev sistema $Ax = b$ lahko formalno zapišemo kot $x = A^{-1}b$.   Množenje z inverzom je ekvivalentno deljenju s številom (formalno deljenje definiramo kot   množenje z inverznim elementom). Ker pa matrično množenje ni komutativno (v splošnem $AB \not= BA$),   moramo razlikovati med množenjem z inverzom z leve strani in množenjem z inverzom z desne   strani. Tako lahko definiramo dve operaciji matričnega deljenja. Deljenje z matriko z desne   deljenje z matriko z leve. Za deljenje z leve uporabimo operator \:   math       A\b := A^{-1}b.
Poglejmo si, kako uporabimo LU razcep za reševanje sistema linearnih enačb. V programskem jeziku julia je LU implementiran v knjižnici
using LinearAlgebraLU razcep izračunamo s funkcijo lu:
L, U, p = lu(A)LinearAlgebra.LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
3×3 Matrix{Float64}:
 1.0   0.0  0.0
 0.5   1.0  0.0
 0.5  -1.0  1.0
U factor:
3×3 Matrix{Float64}:
 2.0   0.0  -2.0
 0.0  -1.0   2.0
 0.0   0.0   1.0Julia pozna poseben podatkovni tip za LU razcep matrike, ki shrani razcep v kompaktni obliki   in ga lahko uporabimo z operatorjem \ za reševanje sistema.
Da bi rešili sistem, definiramo še vektor desnih strani linearnih enačb:
b = [1, 2, 3]3-element Vector{Int64}:
 1
 2
 3rešimo sistem
x = U \ (L \ b[p])3-element Vector{Float64}:
  1.5
 -0.5
  0.0Preverimo rezultat
A*x - b3-element Vector{Float64}:
 0.0
 0.0
 0.0Če uporabimo rezultat LU razcepa v kompaktni obliki (kot vrednost tipa LU), lahko uporabimo operator \ direktno z vektorjem desnih strani, saj julia uporabi specializirano metodo prilagojeno prav za podatkovni tip LU.
F = lu(A)
x = F\b3-element Vector{Float64}:
  1.5
 -0.5
  0.0Preverimo, če je dobljena rešitev zadošča prvotnemu sistemu enačb
A*x - b3-element Vector{Float64}:
 0.0
 0.0
 0.0Razlika med A\b in F\b (oziroma U\(L\b[p])?
x = A\b
A*x - b3-element Vector{Float64}:
 0.0
 0.0
 0.0Razlika med A\b in F\b je v časovni zahtevnosti. Reševanje splošnega sistema je o(n^3), medtem, ko je reševanje sistema, če poznamo LU razcep le o(n^2).
This page was generated using Literate.jl.