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
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
L[upper.tri(A, diag=FALSE)]<-0
L
## [,1] [,2] [,3]
## [1,] 27 0 0
## [2,] 6 15 0
## [3,] 1 1 54
U[lower.tri(A, diag=TRUE)]<-0
U
## [,1] [,2] [,3]
## [1,] 0 6 -1
## [2,] 0 0 2
## [3,] 0 0 0
(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