10. Dekomposisi LU#

Pada prinsipnya Eliminasi Gauss adalah teknik yang secara umum digunakan untuk menyelesaikan Sistem Persamaan Linear (SPL). Namun, waktu komputasi yang dibutuhkan oleh Eliminasi Gauss cenderung lama seiring bertambahnya ukuran matriks atau dapat dinotasikan \(O(n^3 /3)\). Hal ini banyak dipengaruhi oleh operasi aritmatika dari proses eliminasi yang terjadi di dalam Eliminasi Gauss. Dengan demikian, kita memerlukan suatu cara agar dapat meminimalkan waktu komputasi, salah satunya dengan melakukan dekomposisi matriks.

Diberikan suatu SPL yang dapat dibentuk dalam bentuk matriks-vektor sebagai berikut

\[ A\vec{x} = \vec{b} \]

dimana \(A \in \mathbb{R}^{n \times n}\) dan \(\vec{x}, \vec{b} \in \mathbb{R}^n\). Kemudian untuk menyelesaikan SPL tersebut, kita gunakan eliminasi Gauss tanpa pivoting dan kita asumsikan juga bahwa elemen pivot di \(A\) tak nol seiring berjalannya proses eliminasi pada setiap iterasinya, atau dapat ditulis \(a_{ii}^{(k)}\), untuk \(k = 1,2, ..., n\) dan \(i = 1,2,...,n\). Proses eliminasi pada iterasi pertama dilakukan dengan cara

\[ (E_j - m_{j1}E_1) \rightarrow (E_j), \hspace{1.5em} m_{j1} = \frac{a_{j1}^{(1)}}{a_{11}^{(1)}} \]

atau operasi ini dapat direpresentasikan sebagai matriks transformasi Gaussian pertama

\[\begin{split} M^{(1)} = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ -m_{21} & 1 & & 0 \\ \vdots & & \ddots & \vdots \\ -m_{n1} & 0 & \cdots & 1 \\ \end{bmatrix} \end{split}\]

Sehingga, hasil perkalian matriks antara \(M^{(1)}\) dan \(A^{(1)}\) adalah

\[ A^{(2)}\vec{x} = M^{(1)}A\vec{x} = M^{(1)} \vec{b} = \vec{b}^{(2)}. \]

Secara umum, ketika kita melakukan perkalian matriks A dengan matriks transformasi Gaussian pada iterasi ke \(k\) akan menghasilkan

\[ A^{(k+1)} \vec{x} = M^{(k)} A^{(k)} \vec{x} = M^{(k)} \cdots M^{(1)} A \vec{x} = M^{(k)}\vec{b}^{(k)} = \vec{b}^{(k+1)} = M^{(k)} \cdots M^{(1)} \vec{b}. \]

Proses ini akan berhenti pada \(A^{(n)} \vec{x} = \vec{b}^{(n)}\), dimana \(A^{(n)}\) menjadi matriks segitiga atas

\[\begin{split} A^{(n)} = \begin{bmatrix} a_{11}^{(1)} & a_{12}^{(1)} & \cdots & a_{1n}^{(1)} \\ 0 & a_{22}^{(2)} & & a_{2n}^{(2)} \\ \vdots & & \ddots & \vdots \\ 0 & 0 & \cdots & a_{nn}^{(n)} \\ \end{bmatrix} \end{split}\]

diberikan oleh

\[ A^{(n)} = M^{(n-1)} M^{(n-1)} \cdots M^{(1)} A. \]

Kemudian kita panggil kembali

\[ A^{(k+1)} \vec{x} = M^{(k)} A^{(k)} \vec{x} = M^{(k)} \cdots M^{(1)} A \vec{x} = M^{(k)}\vec{b}^{(k)} = \vec{b}^{(k+1)} \]

dimana \(M^{(k)}\) dihasilkan dari operasi baris

\[ (E_j - m_{jk}E_k) \rightarrow (E_j), \hspace{1.5em} j=k+1, \cdots, n. \]

Jika kita ingin mengembalikan nilai dari matriks \(A^{(k+1)} ke A^{(k)}\), maka kita perlu operasi balikan

\[ (E_j + m_{jk}E_k) \rightarrow (E_j), \hspace{1.5em} j=k+1, \cdots, n, \]

berarti ini sama saja mencari invers dari matriks \(M\), \([M^{(k)}]^{-1}\). Dengan demikian, jika kita teruskan operasi invers ini sampai dengan iterasi pertama, maka akan menghasilkan matriks \(A\), dan operasi invers dari matriks \(M\) dapat kita tuliskan ekivalen dengan matriks segitiga bawah \(L\) atau dapat ditulis

\[\begin{split} L = L^{(1)} L^{(2)} \cdots L^{(n-1)} = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ m_{21} & 1 & & 0 \\ \vdots & & \ddots & \vdots \\ m_{n1} & \cdots & m_{n,n-1} & 1 \\ \end{bmatrix} \end{split}\]

Jadi, \(A\) dapat kita dekomposisi menjadi hasil kali dari matriks segitiga bawah \(L\) dan matriks segitiga atas \(U\), atau dapat ditulis

\[\begin{split} \begin{array}{lll} LU &=& L^{(1)}L^{(2)} \cdots L^{(n-3)} L^{(n-2)} L^{(n-1)} . M^{(n-1)} M^{(n-2)} M^{(n-3)} \cdots M^{(2)} M^{(1)} A \\ &=& [M^{(1)}]^{-1} [M^{(2)}]^{-1} \cdots [M^{(n-2)}]^{-1} [M^{(n-1)}]^{-1} . M^{(n-1)} M^{(n-2)} M^{(n-3)} \cdots M^{(2)} M^{(1)} A \\ &=& A. \end{array} \end{split}\]

Teorema

Jika Eliminasi Gauss tanpa penukaran baris dapat digunakan untuk menyelesaikan \(A\vec{x} = \vec{b}\), maka matriks \(A\) dapat didekomposisi ke dalam perkalian matriks antara matriks segitiga bawah \(L\) dan matriks segitiga atas \(U\), \(A = LU\)

\[\begin{split} U = \begin{bmatrix} a_{11}^{(1)} & a_{12}^{(1)} & \cdots & a_{1n}^{(1)} \\ 0 & a_{22}^{(2)} & & a_{2n}^{(2)} \\ \vdots & & \ddots & \vdots \\ 0 & 0 & \cdots & a_{nn}^{(n)} \\ \end{bmatrix} , L = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ m_{21} & 1 & & 0 \\ \vdots & & \ddots & \vdots \\ m_{n1} & \cdots & m_{n,n-1} & 1 \\ \end{bmatrix} , \end{split}\]

dimana \(m_{ji} = \frac{a_{ji}^{(i)}}{a_{ii}^{(i)}}\), untuk \(i,j = 1,2,\cdots, n\).

10.1. Dekomposisi LU untuk menyelesaikan SPL#

Algoritma:

  1. Lakukan dekomposisi matriks \(A\) menjadi \(LU\): eliminasi maju untuk menghasilkan matriks \(U\) dan dalam proses ini juga kita akan mendapatkan matriks \(L\).

  2. SPL \(A\textbf{x} = \textbf{b}\) menjadi \(L(U \textbf{x}) = \textbf{b}\) dan kita misalkan \(U \textbf{x} = y\) sehingga \(L \textbf{y} = \textbf{b}\). Selesaikan \(L \textbf{y} = \textbf{b}\) menggunakan subtitusi maju dan akan menghasilkan \(\textbf{y}\).

  3. Selesaikan \(U \textbf{x} = y\) menggunakan subtitusi mundur dan aka mendapatkan solusi SPL \(\textbf{x}\).

function dekomposisi_lu(A)
    n = size(A, 1)
    L = zeros(n, n)
    U = zeros(n, n)
    
    for i = 1:n
        L[i, i] = 1
        for j = i:n
            sum = 0.0
            for k = 1:i-1
                sum += L[i, k] * U[k, j]
            end
            U[i, j] = A[i, j] - sum
        end

        for j = i+1:n
            sum = 0.0
            for k = 1:i-1
                sum += L[j, k] * U[k, i]
            end
            L[j, i] = (A[j, i] - sum) / U[i, i]
        end
    end
    return L, U
end
dekomposisi_lu (generic function with 1 method)
function subtitusi_maju(L, b)
    y = zeros(length(b))
    for i = 1:length(b)
        sum = 0.0
        for j = 1:i-1
            sum += L[i, j] * y[j]
        end
        y[i] = (b[i] - sum) / L[i, i]
    end
    return y
end
subtitusi_maju (generic function with 1 method)
function subtitusi_mundur(U, y)
    n = length(y)
    x = zeros(n)
    for i = n:-1:1
        sum = 0.0
        for j = i+1:n
            sum += U[i, j] * x[j]
        end
        x[i] = (y[i] - sum) / U[i, i]
    end
    return x
end
subtitusi_mundur (generic function with 1 method)

10.2. Contoh 1#

Diberikan

\[ \begin{align}\begin{aligned}\begin{split} A = \begin{bmatrix} 1 & 1 & 0 & 3 \\ 2 & 1 & -1 & 1 \\ 3 & -1 & -1 & 2 \\ -1 & 2 & 3 & -1 \end{bmatrix}\end{split}\\\hspace{1em}\\\begin{split}\textbf{b} = \begin{bmatrix} 8 \\ 7 \\ 14 \\ -7 \end{bmatrix} \end{split}\end{aligned}\end{align} \]
A = [1 1 0 3; 2 1 -1 1; 3 -1 -1 2; -1 2 3 -1]
b = [8; 7; 14; -7];
# Dekomposisi A menjadi LU
L, U = dekomposisi_lu(A)
display(L)
4×4 Matrix{Float64}:
  1.0   0.0  0.0  0.0
  2.0   1.0  0.0  0.0
  3.0   4.0  1.0  0.0
 -1.0  -3.0  0.0  1.0
display(U)
4×4 Matrix{Float64}:
 1.0   1.0   0.0    3.0
 0.0  -1.0  -1.0   -5.0
 0.0   0.0   3.0   13.0
 0.0   0.0   0.0  -13.0
# subtitusi maju untuk Ly = b
y = subtitusi_maju(L,b)
display(y)
4-element Vector{Float64}:
   8.0
  -9.0
  26.0
 -26.0
# subtitusi mundur untuk Ux = y
x = subtitusi_mundur(U, y)
display(x)
4-element Vector{Float64}:
  3.0
 -1.0
  0.0
  2.0

10.3. Matriks Permutasi#

Matriks permutasi adalah matriks \(n \times n\) yang berasal dari matriks identitas dan jika kita tukar suatu baris dari \(I\) kemudian kita kalikan dengan \(A\) maka akan menghasilkan matriks \(A\) yang barisnya sudah tertukar. Misalkan kita punya

\[\begin{split} P = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix} , \hspace{1em} A = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} \end{split}\]

kemdian kita kalikan \(P\) dan \(A\) menghasilkan

\[\begin{split} PA = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{31} & a_{32} & a_{33} \\ a_{21} & a_{22} & a_{23} \end{bmatrix} . \end{split}\]

Matriks permutasi digunakan untuk menangani matriks yang ill-conditioned.

Note

Jika \(P^{-1}\) ada maka \(P^{-1} = P^t\).

10.4. Matriks PLU untuk menyelesaikan SPL#

Diberikan \(A\textbf{x} = \textbf{b}\) dan kita kalikan kedua ruas dengan matriks permutasi \(P\) maka menghasilkan

\[ PA\textbf{x} = P\textbf{b}. \]

Kemudian asumsikan bahwa kita dapat menyelesaikannya tanpa menukar baris, ini berarti \(P = I\) untuk \(I\) adalah matriks identitas. Sehingga ketika \(A\) kita dekomposisi menjadi \(LU\) maka dapat ditulis

\[ PA = LU. \]

Karena \(P^{-1} = P^t\) maka matriks \(A\) dapat ditulis

\[ A = P^{-1}LU = (P^tL)U \]

Note

Matriks \(U\) tetap menjadi matriks segitiga atas, tapi \(P^tL\) bukan matriks segitiga bawah kecuali \(P = I\).

Dengan demikian, bentuk \(PA\textbf{x} = P\textbf{b}\) kita ubah menjadi

\[ LU \textbf{x} = P\textbf{b}. \]

Kita misalkan \(U \textbf{x} = \textbf{y}\) maka

\[ L \textbf{y} = P\textbf{b} \]

dan selesaikan menggunakan subtitusi maju. Selanjutnya kita terapkan subtitusi mundur untuk menyelesaikan \(U \textbf{x} = \textbf{y}.\)

10.5. Contoh 2#

Diberikan

\[\begin{split} A = \begin{bmatrix} 0 & 0 & -1 & 1 \\ 1 & 1 & -1 & 2 \\ -1 & -1 & 2 & 0 \\ 1 & 2 & 0 & 2 \end{bmatrix} \end{split}\]

Kita ingin mendekomposisi \(A\) menjadi bentuk \((P^tL)U\)

using LinearAlgebra

function dekomposisi_plu(A)
    n = size(A, 1)
    L = zeros(n, n)
    U = copy(A)
    P = Matrix{Float64}(I, n, n)

    for k in 1:n
        # Cari baris pivot
        pivot = argmax(abs.(U[k:n, k])) + k - 1

        # Tukar baris di U
        U[[k, pivot], k:n] = U[[pivot, k], k:n]

        # Tukar baris di P
        P[[k, pivot], :] = P[[pivot, k], :]

        # Tukar baris di L
        L[[k, pivot], 1:k-1] = L[[pivot, k], 1:k-1]

        # Dekomposisi LU
        for i in k+1:n
            L[i, k] = U[i, k] / U[k, k]
            U[i, k:n] -= L[i, k] * U[k, k:n]
        end
    end

    # Diagonal L harus 1
    for i in 1:n
        L[i, i] = 1.0
    end

    return P, L, U
end
dekomposisi_plu (generic function with 1 method)
A = [0 0 -1 1; 1 1 -1 2; -1 -1 2 0; 1 2 0 2]
display(A)
4×4 Matrix{Int64}:
  0   0  -1  1
  1   1  -1  2
 -1  -1   2  0
  1   2   0  2
P, L, U = dekomposisi_plu(A)
display(P)
4×4 Matrix{Float64}:
 0.0  1.0  0.0  0.0
 0.0  0.0  0.0  1.0
 0.0  0.0  1.0  0.0
 1.0  0.0  0.0  0.0
display(L)
4×4 Matrix{Float64}:
  1.0  0.0   0.0  0.0
  1.0  1.0   0.0  0.0
 -1.0  0.0   1.0  0.0
  0.0  0.0  -1.0  1.0
display(U)
4×4 Matrix{Int64}:
 1  1  -1  2
 0  1   1  0
 0  0   1  2
 0  0   0  3
transpose(P)*L*U # = A
4×4 Matrix{Float64}:
  0.0   0.0  -1.0  1.0
  1.0   1.0  -1.0  2.0
 -1.0  -1.0   2.0  0.0
  1.0   2.0   0.0  2.0

10.6. Contoh 3#

Dari [](#Contoh 2)

\[\begin{split} A = \begin{bmatrix} 0 & 0 & -1 & 1 \\ 1 & 1 & -1 & 2 \\ -1 & -1 & 2 & 0 \\ 1 & 2 & 0 & 2 \end{bmatrix}, \hspace{1em} \textbf{b} = \begin{bmatrix} 8 \\ 7 \\ 14 \\ -7 \end{bmatrix} \end{split}\]
Pb = P*b
display(Pb)
4-element Vector{Float64}:
  7.0
 -7.0
 14.0
  8.0
y = subtitusi_maju(L, Pb)
display(y)
4-element Vector{Float64}:
   7.0
 -14.0
  21.0
  29.0
x = subtitusi_mundur(U,y)
display(x)
4-element Vector{Float64}:
   5.0000000000000036
 -15.666666666666668
   1.6666666666666679
   9.666666666666666
A*x # = vektor b
4-element Vector{Float64}:
  7.999999999999998
  7.0
 14.0
 -7.0