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.