Solusi Numerik untuk Sistem Persamaan Linear
Contents
8. Solusi Numerik untuk Sistem Persamaan Linear#
Suatu sistem persamaan linear (SPL) adalah kumpulan dari sejumlah \(n\) persamaan atau secara matematis dapat ditulis
Di dalam (1), terdapat koefisien \(a_{ij}\), untuk \(i,j = 1,2, \cdots, n\), dan \(b_i\), dan kita perlu untuk mencari unknowns \(x_1, x_2,\cdots, x_n\). SPL (1) juga dapat ditulis dalam bentuk matriks-vektor yaitu
dimana \(A \in \mathbb{R}^{n \times n}\), \(\textbf{x} \in \mathbb{R}^n\), dan \(\textbf{b} \in \mathbb{R}^n\).
Terdapat dua cara untuk menyelesaikan (1) menggunakan solusi numerik:
Metode Langsung (Naive) (fokus pada analisa error pembulatan)
Metode Iteratif
Selain mencari \(\vec{x}\), permasalahan yang ada di dalam SPL meliputi:
Determinan dari matriks
Invers dari matriks
Tipe-tipe khusus dari matriks:
Matriks Definit Positif
Matriks Tridiagonal
Beberapa metode yang akan dipelajari antara lain:
Eliminasi Gauss
Partial Pivoting
Faktorisasi Matriks
Dekomposisi LU
Matriks Permutasi
Cholesky
Faktorisasi Crout
8.1. Sistem Persamaan Linear#
Kita menggunakan tiga operasi baris untuk menyederhanakan SPL (1):
Persamaan \(E_i\) dapat dikali oleh suatu konstanta \(\lambda\) yang tak nol,yang hasilnya ditempatkan di \(E_i\). Operasi tersebut dinotasikan sebagai \((\lambda E_i) \rightarrow (E_i)\).
Persamaan \(E_j\) dapat dikali oleh suatu konstanta \(\lambda\) dan ditambahkan ke persamaan \(E_i\), yang hasilnya ditempatkan di \(E_i\). Operasi ini dapat dinotasikan sebagai \((E_i + \lambda E_j) \rightarrow (E_i)\).
Persamaan \(E_i\) dan \(E_j\) dapat ditukar urutannya atau dapat ditulis \((E_i) \leftrightarrow (E_j)\).
8.1.1. Contoh 1:#
Diberikan SPL
Tujuannya adalah mencari nilai dari \(x_1, x_2, x_3\), dan \(x_4\).
Pertama, kita eliminasi \(x_1\) dari persamaan \(E_2, E_3\), dan \(E_4\) dengan cara:
\((E_2-2E_1)\rightarrow(E_2)\)
\((E_3-3E_1)\rightarrow(E_3)\)
\((E_4+E_1)\rightarrow(E_4)\)
akan menghasilkan sistem persamaan baru
Di dalam sistem persamaan baru ini, kemudian, kita eliminasi \(x_2\) dari \(E_3\) dan \(E_4\) dengan cara:
\((E_3-4E_2)\rightarrow(E_3)\)
\((E_4+3E_2)\rightarrow(E_4)\),
sehingga menghasilkan
SPL (2) sudah menjadi bentuk tereduksi dan untuk mencari nilai unknowns tersebut digunakan proses subtitusi mundur. Karena \(E_4\) bernilai \(x_4 = 1\), kita selesaikan \(E_3\) untuk mencari \(x_3\)
Dilanjutkan untuk \(E_2\)
dan \(E_1\)
Jadi solusinya adalah \(x_1 = -1, x_2 = 2, x_3 = 0\), dan \(x_4 = 1\).
8.2. Desain Algoritma untuk Eliminasi Gauss#
Agar dapat mempermudah pengimplementasiannya ke dalam bahasa pemrograman, SPL(1) diubah ke dalam bentuk augmented,
atau dapat ditulis dalam bentuk augmented matrix \(C\)
Untuk menyelesaikan SPL tersebut, kita gunakan Eliminasi Gauss yang desain algoritmanya adalah sebagai berikut:
Buat sistem segitiga atas menggunakan eliminasi maju.
Kita lakukan eliminasi \(x_1\) dari persamaan \(E_2\), \(E_3\), \(E_4, ..., E_n\) menghasilkan SPL baru, lakukan eliminasi \(x_2\) dari persamaan \(E_3, E_4, ..., E_n\), dst. sampai \(x_{n-1}\) dari persamaan \(E_n\) atau dapat ditulis dalam bentuk algoritma
for i=1 to n for j=i+1 to n (E_j) <- (E_j) - (a_{ji}/a_{ii})*(E_i)
Maka algoritma ini akan menghasilkan sistem segitiga atas
Catatan bahwa nilai dari koefisien \(a_{i,j+1}\) di (4) berbeda dari (3).
Subtitusi mundur
Lakukan subtitusi mundur untuk mendapatkan solusinya.
x_n = a_{n, n+1} / a_{nn}
for i = n-1 to 1
x_i = 1/a_{ii} (a_{i, n+1} - sum(a_{ij}*x_j))
function eliminasi_gauss(A, b)
A_c = hcat(A, b)
# jumlah baris dari A
n = size(A_c, 1)
# eliminasi maju
for i in 1:n-1
pivot = A_c[i, i]
for j in i+1:n
faktor = A_c[j, i] / pivot
A_c[j, :] -= faktor .* A_c[i, :]
end
end
# subtitusi mundur
b = A_c[:, end]
b[end] /= A_c[end, end-1]
for i in n-1:-1:1
pivot = A_c[i, i]
b[i] -= sum(A_c[i, i+1:end-1] .* b[i+1:end])
b[i] /= pivot
end
return b
end
eliminasi_gauss (generic function with 1 method)
8.2.1. Contoh 2#
A = [1e-17 -1; 1 2]
b = [-1; 3]
sol = eliminasi_gauss(A, b)
2-element Vector{Float64}:
0.0
1.0
# plot SPL
using Plots
using LaTeXStrings
x = LinRange(-2., 2., 100)
f1(x) = 1 .+ 1e-17 .* x
f2(x) = (3 .- x) ./ 2
plot(x, f1(x), label=L"E_1", xlabel=L"x_1", ylabel=L"x_2")
plot!(x, f2(x), label=L"E_2")
# solusi eliminasi
scatter!((sol[1], sol[2]), markershape=:circle, markercolor=:black, label="")
annotate!([(sol[1], sol[2]+0.1, ("($(sol[1]), $(sol[2]))", 8, 0.0, :bottom, :black))])
# solusi eksak
scatter!((1, 1), markershape=:circle, markercolor=:red, label="")
annotate!([(1, 1+0.1, ("(1.0, 1.0)", 8, 0.0, :bottom, :red))])
using LinearAlgebra
condition_number = cond(A) # Condition Number A
determinan = det(A)
print("condition number A: $(condition_number), |A| = $(determinan)")
condition number A: 5.828427124746189, |A| = 1.0
Dari Contoh 2 terlihat bahwa condition number dari A adalah 5.8284 mengindikasikan bahwa matriks tersebut ill-condition atau hampir singular. Matriks yang ill-condition dapat terjadi karena error pembulatan, sehingga solusi numerik yang dihasilkan salah. Walaupun kita tahu bahwa determinan dari A tak nol artinya SPL pada Contoh 2 memiliki solusi tunggal.
If the condition number is not too much larger than one, the matrix is well-conditioned, which means that its inverse can be computed with good accuracy. If the condition number is very large, then the matrix is said to be ill-conditioned. Practically, such a matrix is almost singular, and the computation of its inverse, or solution of a linear system of equations is prone to large numerical errors. A matrix that is not invertible has condition number equal to infinity.