Dunia ini dikendalikan oleh Algoritma!
Pernyataan tersebut seringkali saya dengar di mana-mana. Pernyataan in juga yang membuat saya ingin berkuliah lagi mengambil studi master sains komputasi.
Namun setelah mengikuti kuliah beberapa minggu belakangan, saya sadar bahwa pernyataan itu salah sepenuhnya. Pernyataan yang tepat adalah:
Dunia ini dikendalikan oleh ALJABAR!
Tidak menyangka bahwa dalam dunia numerik, konsep-konsep di aljabar linear sangat amat digunakan. Sebagai contoh, saat kita hendak menyelesaikan suatu sistem persamaan linear berikut:
Suatu sistem persamaan linear bisa dituliskan dalam bentuk aljabar berupa matriks dan vektor sebagai berikut:
\[Ax = b\]
SPL tersebut akan memiliki solusi saat \(A\) memiliki invers, yakni \(A^{-1}\).
Bagaimana caranya menghitung \(A^{-1}\) dari \(A\)?
Pada aljabar linear elementer, kita bisa melakukan operasi baris elementer (OBE) sebagai berikut:
\[[A | I] \rightarrow [I|A^{-1}]\]
Jika \(A\) merupakan matriks yang berukuran kecil, kita bisa menghitungnya dengan mudah. Namun saat kita berhadapan dengan matriks berukuran sangat amat besar dan kompleks, kita bisa mengandalkan metode aproksimasi.
Ternyata metode aproksimasi juga berlandaskan konsep aljabar linear yang kuat!
Oleh karena itu, sebelum saya lanjut berbicara mengenai metode aproksimasi, saya akan menuliskan beberapa materi refreshment terkait aljabar linear.
Jika \(A\) adalah matriks \(n \times n\) inversible, maka untuk setiap vektor \(b\) \(1 \times n\) pada sistem persamaan linear \(Ax = b\) memiliki tepat satu solusi. Yaitu:
\[x = A^{-1}b\]
Berikut ini kita coba review kembali secara singkat beberapa konsep dalam aljabar yang kelak akan membantu kita memahami bagaimana cara penyelesaian SPL secara numerik.
Dari penjelasan sebelumnya kita telah mengenal apa itu matriks invers. Kita akan mengingat kembali suatu konsep bernama determinan matriks. Di R kita bisa menghitung determinan dari suatu matriks dengan perintah det(matriks).
Jika suatu matriks persegi memiliki determinan = 0, maka matriks tersebut tidak memiliki invers. Matriks yang tidak memiliki invers disebut matriks singular.
Kebalikannya:
Jika suatu matriks memiliki determinan \(\neq 0\), maka matriks memiliki invers. Matriks berinvers disebut matriks tak singular.
Untuk matriks berukuran \(2 \times 2\), cara menghitung determinan matriksnya adalah sebagai berikut:
\[A = \begin{bmatrix} a & b \\ c & d \\ \end{bmatrix}\]
\[|A| = ad - bc\]
Bagaimana dengan matriks berukuran \(3 \times 3\)? Berikut caranya:
Kita perlu memperlebar kolom dari matriks tersebut agar semua elemen terkena.
\[A = \begin{bmatrix} a & b & c\\ d & e & f \\ g & h & i \\ \end{bmatrix}\]
\[|A| = (aei + bfg + cdh) - (ceg + afh + bdi)\]
Misalkan \(A\) adalah matriks yang memiliki determinan, maka:
Jika \(A\) adalah matriks \(n \times n\), maka vektor tak nol \(x \in \mathbb{R}^n\) dinamakan vektor eigen dari \(A\) jika \(Ax\) adalah kelipatan skalar dari \(x\). Yakni:
\[Ax = \lambda x\]
untuk suatu skalar \(\lambda\) tertentu. \(\lambda\) disebut sebagai nilai eigen yang bersesuaian dengan vektor eigen.
Jika \(A\) adalah matriks berukuran \(n \times n\), maka \(\lambda\) adalah nilai eigen dari \(A\) jika dan hanya jika ia memenuhi persamaan:
\[det(\lambda I - A) = 0\]
Persamaan di atas disebut dengan persamaan karakterisktik.
Vektor dan nilai eigen bisa dihitung di R menggunakan function eigen(matriks).
Norm vektor merupakan fungsi pemetaan dari vektor-vektor di \(x \in \mathbb{R}^n\) ke bilangan real \(||x||\) sehingga memenuhi:
Sifat Norm Vektor
Norm matriks merupakan fungsi pemetaan dari matriks-matriks bujur sangkar di \(\mathbb{R}^{n \times n}\) ke \(\mathbb{R}\) sehingga memenuhi:
Sifat Norm Matriks
\[\forall z \neq 0 \text{ dan natural matrix norm } ||.|| \text{ diperoleh } ||Az|| \leq ||A|| . ||z||\]
Beberapa teorema dan definisi yang berguna:
Norm Matriks dan Jari-jari Spektral
Summaries:
Suatu matriks \(A\) dikatakan konvergen ke 0 jika \(\lim_{k \rightarrow \infty} (A^k)_{ij} = 0\).
Pernyataan berikut ini ekivalen:
Perhatikan baik-baik teorema di atas. Terutama pada poin 4 dimana menjadi kunci kekonvergenan dari suatu skema iterasi kelak.
Matriks diagonal adalah matriks yang hanya berisi elemen di diagonalnya saja. Matriks upper triangle adalah matriks yang hanya berisi segitiga di atas. Matriks lower triangle adalah matriks yang hanya berisi segitiga di bawah.
Matriks diagonal dominan kuat adalah matriks yang memiliki elemen harga mutlak diagonal terbesar.
Misalkan:
## [,1] [,2] [,3]
## [1,] "a11" "a12" "a13"
## [2,] "a21" "a22" "a23"
## [3,] "a31" "a32" "a33"
Definisi diagonal dominan kuat adalah:
\[|a_{ii}| > \sum_{i=1,j \neq i}^n |a_{ij}|\]
Contoh:
## [,1] [,2] [,3]
## [1,] 7 2 0
## [2,] 3 5 -1
## [3,] 0 5 -6
\(A\) merupakan matriks diagonal dominan kuat karena:
\[|7| > |2| + |0|\]
\[|5| > |3| + |-1|\]
\[|-6| > |0| + |-5|\]
Matriks diagonal dominan kuat adalah non singular.
Bagaimana jika \(A\) kita bukan matriks diagonal dominan kuat?
Kita harus lakukan pre-processing sehingga menjadi matriks diagonal dominan kuat dengan cara:
Dari semua konsep aljabar yang telah dijelaskan pada bagian sebelumnya, mari kita lihat beberapa function di R-nya:
Misalkan saya definisikan \(v\) suatu vektor sebagai berikut:
v = c(2,4,-1,3)
# menghitung norm 1 dari vektor v
norm_vec_1 = function(x)sum(abs(x))
norm_vec_1(v)## [1] 10
# menghitung norm 2 dari vektor v
norm_vec_2 = function(x)sqrt(sum(abs(x)^2))
norm_vec_2(v)## [1] 5.477226
# menghitung norm infinity dari vektor v
norm_vec_inf = function(x)max(abs(x))
norm_vec_inf(v)## [1] 4
Misalkan saya definisikan matriks \(A\) sebagai berikut:
A = matrix(c(2,4,-1,3,1,5,-2,3,-1),ncol = 3)
A## [,1] [,2] [,3]
## [1,] 2 3 -2
## [2,] 4 1 3
## [3,] -1 5 -1
# transpose matriks
t(A)## [,1] [,2] [,3]
## [1,] 2 4 -1
## [2,] 3 1 5
## [3,] -2 3 -1
# inverse matriks
matlib::inv(A)## [,1] [,2] [,3]
## [1,] 0.22535211 0.09859155 -0.1549296
## [2,] -0.01408451 0.05633803 0.1971831
## [3,] -0.29577465 0.18309859 0.1408451
# menghitung nilai dan vektor eigen
eigen(A)## eigen() decomposition
## $values
## [1] -5.607665 5.148415 2.459250
##
## $vectors
## [,1] [,2] [,3]
## [1,] 0.4119543 0.3651285 -0.4204609
## [2,] -0.5715723 0.7504594 0.4578471
## [3,] 0.7096469 0.5509010 0.7833190
# perkalian matriks
A %*% matlib::inv(A) %>% round()## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
# menghitung norm 1 dari matriks A
norm(A,"1")## [1] 9
# menghitung norm 2 dari matriks A
norm(A,"2")## [1] 6.161479
# menghitung norm infinity dari matriks A
norm(A,"i")## [1] 8
# menghitung rho
rho = function(matriks){
ei = eigen(matriks)
ei = max(abs(ei$values))
return(ei)
}
rho(A)## [1] 5.607665
# norm 2 juga bisa dihitung dengan cara
rho(t(A) %*% A) %>% sqrt()## [1] 6.161479
Perhatikan betul teorema kekonvergenan matriks dan bagaimana cara menghitung \(\rho\).
Demikian refreshment materi aljabar linear. Aplikasinya pada analisa numerik akan saya tuliskan di posts selanjutnya.
Find me at my personal blog ikanx101.com.