Dekomposisi pada matriks A dilakukan oleh metode iterasi Gauss-Seidel menjadi matriks segitiga atas U dan matriks segitiga bawah L. Dekomposisi ini berbeda dengan dekomposisi LU pada Bab 6.4.1. Matriks U dalam metode Gauss-Seidel berisi elemen-elemen matriks A di atas diagonal utama, sedangkan matriks L berisi elemen diagonal utama dan elemen-elemen di bawah diagonal utama matriks A. Elemen-elemen lainnya pada kedua matriks ini akan bernilai nol. Persamaan iterasi Gauss-Seidel ditampilkan dalam Persamaan.

Syarat agar suatu sistem persamaan linier dapat diselesaikan menggunakan metode Gauss-Seidel adalah matriks harus memiliki nilai diagonal utama yang dominan.

Contoh penyelesaian soal dengan menggunakan iterasi Gauss-Seidell

  1. Membuat matriks U dan A
A <- matrix(c(27,6,1,6,15,1,-1,2,54), 3)
b <- c(85,72,110)
(L <- U <- A)
##      [,1] [,2] [,3]
## [1,]   27    6   -1
## [2,]    6   15    2
## [3,]    1    1   54
  1. Membuat matriks L dari entri bagian bawah diagonal utama matriks A
L[upper.tri(A, diag=FALSE)]<-0
L
##      [,1] [,2] [,3]
## [1,]   27    0    0
## [2,]    6   15    0
## [3,]    1    1   54
  1. membuat matriks U dari entri bagian atas diagonal utama matriks A
U[lower.tri(A, diag=TRUE)]<-0
U
##      [,1] [,2] [,3]
## [1,]    0    6   -1
## [2,]    0    0    2
## [3,]    0    0    0
  1. Gunakan sintaks solve()
(Linv <- solve(L))
##               [,1]         [,2]       [,3]
## [1,]  0.0370370370  0.000000000 0.00000000
## [2,] -0.0148148148  0.066666667 0.00000000
## [3,] -0.0004115226 -0.001234568 0.01851852

Tentukan nilai perkiraan awal dan ambang batas yang diinginkan. Ambang batas nilai dalam proses ini ditetapkan pada tingkat 10^-7

(x <- rep(0, length(b)))
## [1] 0 0 0

Iterasi 1

(x1 <- Linv %*% (b - U %*% x))
##          [,1]
## [1,] 3.148148
## [2,] 3.540741
## [3,] 1.913169
sqrt(sum(x1-x)^2)
## [1] 8.602058

Iterasi 2

(x2 <- Linv %*% (b - U %*% x1))
##          [,1]
## [1,] 2.432175
## [2,] 3.572041
## [3,] 1.925848
sqrt(sum(x2-x1)^2)
## [1] 0.6719939

Setelah iterasi ke 7 kita akan mendapatkan hasil vektor seperti dibawah :

Untuk melakukan iterasi Gauss-Seidell kita dapat menggunakan sintaks berikut :

gauss_seidel <- function(a, b, tol=1e-7, maxiter=100){
  n <- length(b)
  iter <- 0
  
  
  L <- U <- a
  L[upper.tri(a, diag=FALSE)] <- 0
  U[lower.tri(a, diag=TRUE)] <- 0
  Linv <- solve(L)
  
  x <- rep(0,n)
  x_new <- rep(tol, n)
  
  while(sqrt(sum(x_new-x)^2)>tol){
            if(iter>maxiter){
              warning("iterasi maksimum tercapai")
              break
            }
            x <- x_new
            x_new <- Linv %*% (b - U %*% x)
            iter <- iter+1
  }
      return(list(X = x_new, iter=iter))
}

Dengan menggunakan contoh soal sebelumnya berikut cara penggunaan dari sintaks diatas :

gauss_seidel(A,b)
## $X
##          [,1]
## [1,] 2.425476
## [2,] 3.573016
## [3,] 1.925954
## 
## $iter
## [1] 7

Source : https://bookdown.org/moh_rosidi2610/Metode_Numerik/linearaljabar.html#seideliter