Penerapan Metode Gauss, Gauss Jacobi, Gauss Seidel untuk Sistem Persamaan Linear¶
Eliminasi Gauss¶
Contoh Eliminasi dengan Gauss¶
Selanjutnya kita dapat melakukan Eliminasi Maju (forward elimination) untuk menjadi matriks A menjadi matriks segitiga atas, dengan menjadi nilai dibawah diagonal matriks A menjadi 0. Untuk melakukan eliminasi maju kita dapat menggunakan rumus berikut.
Forward Elimination¶
Setelah menyelesaikan eliminasi sampai $ x_{n-1} $, kita dapat melakukan Subsitusi Mundur (Backward Subsitution) untuk mencari nilai $ x_1 $ sampai $ x_n $ .
Backward Subsitution¶
Setelah melakukan subsitusi mundur, maka ditemukan nilai x_1 = 3, x_2 = 1, x_3 = -2, $x_4 = 1 $
Implementasi Eliminasi Gauss dengan Python¶
from numpy import linalg ##A = [[6, -2, 2, 4], [12, -8, 6, 10], [3, -13, 9, 3], [-6, 4, 1, -18]] ##B = [16, 26, -19, -34] A = [] B = [] n_spl = int(input('masukkan banyak persamaan : ')) for i in range(n_spl): temp = [] for j in range(n_var): temp.append(float(input('masukkan koefisien SPL ke-%i x%i : '%((i+1),(j+1))))) A.append(temp) B.append(float(input('masukkan hasil SPL ke-%i : '%(i+1)))) X = [0] * len(A) def tampil_matrix(matrix): for i in range(len(matrix)): print('|', end=' ') for j in range(len(matrix[0])): print(matrix[i][j], end=' ') print('|') print() print('Matrix A') tampil_matrix(A) print('Matrix B', B) print() if linalg.det(A) != 0: #forward elimination for k in range(len(A)-1): for i in range(k+1, len(A)): factor = A[i][k] / A[k][k] for j in range(k, len(A)): A[i][j]= A[i][j] - factor * A[k][j] B[i] = B[i] - factor * B[k] #backward elimination X[len(A)-1] = B[len(A)-1] / A[len(A)-1][len(A[0])-1] for i in range(len(A)-1, -1, -1): isum = B[i] for j in range(i+1, len(A)): isum = isum - A[i][j] * X[j] X[i] = isum / A[i][i] else: print('tidak ada peneyelesaian untuk persamaan tersebut!') print('hasil eliminasi gauss') print('Matrix A') tampil_matrix(A) print('Matrix B', B, '\n') for i in range(len(X)): print('X'+str(i+1),':', X[i])
Dari program diatas, kita menginisialisasikan matriks A, B, dan X sebagai list, dan membuat inputan yang memita banyaknya persamaan. Dari inputan tersebut kemudian dilakukan looping untuk memberikan inputan yang meminta koefisien dari tiap persamaan dan hasil dari persamaan yang kemudian akan di masukkan pada list masing -masing, sehingga list akan menjadi list 2 dimensi untuk list A.
A = [] B = [] n_spl = int(input('masukkan banyak persamaan : ')) for i in range(n_spl): temp = [] for j in range(n_var): temp.append(float(input('masukkan koefisien SPL ke-%i x%i : '%((i+1),(j+1))))) A.append(temp) B.append(float(input('masukkan hasil SPL ke-%i : '%(i+1)))) X = [0] * len(A)
Kemudian terdapat fungsi tampil_matriks(matriks), yang nantinya digunakan untuk menampilkan list 2 dimensi, agar tampil seperti matrik yang memiliki baris dan kolom
def tampil_matrix(matrix): for i in range(len(matrix)): print('|', end=' ') for j in range(len(matrix[0])): print(matrix[i][j], end=' ') print('|') print()
Dan pada program tersebut terdapat kondisi untuk mengecek determinan matriks A. Ketika determinan matriks A tidak sama dengan 0 maka program akan melakukan proses forward elimination dan backward subsitution. untuk mencari determinan menggunakan fungsi det() yang merupakan fungsi bawaan modul numpy.
if linalg.det(A) != 0: #forward elimination #bacward subsition else: else: print('tidak ada peneyelesaian untuk persamaan tersebut!')
Selanjutnya pada program tersebut terdapat metode forward elimination, yang melakukan komputasi dari rumus berikut $ A_{ij} \leftarrow A_{ij} - \left ( {A_{ik} \over A_{kk}} \right)A_{kj}, b_i \leftarrow b_i - \left ( {A_{ik} \over A_{kk}} \right)b_{k} $
#forward elimination for k in range(len(A)-1): for i in range(k+1, len(A)): factor = A[i][k] / A[k][k] for j in range(k, len(A)): A[i][j]= A[i][j] - factor * A[k][j] B[i] = B[i] - factor * B[k]
#backward elimination X[len(A)-1] = B[len(A)-1] / A[len(A)-1][len(A[0])-1] for i in range(len(A)-1, -1, -1): isum = B[i] for j in range(i+1, len(A)): isum = isum - A[i][j] * X[j] X[i] = isum / A[i][i]
Saat program tersebut dijalankan maka menghasilkan output seperti berikut.
Matrix A | 6 -2 2 4 | | 12 -8 6 10 | | 3 -13 9 3 | | -6 4 1 -18 | Matrix B [16, 26, -19, -34] hasil eliminasi gauss Matrix A | 6 -2 2 4 | | 0.0 -4.0 2.0 2.0 | | 0.0 0.0 2.0 -5.0 | | 0.0 0.0 0.0 -3.0 | Matrix B [16, -6.0, -9.0, -3.0] X1 : 3.0 X2 : 1.0 X3 : -2.0 X4 : 1.0
Metode Gauss Jacobi¶
Perhitungan Gauss Jacobi¶
Dengan menghitung menggunakan metode Gauss Jacobi satu iterasi, maka ditmukan nilai x_1=0,6000, x_2=2,2727, x_3=1,1000, x_4=1.9570.
Implementasi Gauss Jacobi dengan Python¶
import math import copy from numpy import linalg ##A = [[10, -1, 2, 0], [-1, 11, -1, 3], [2, -1, 10, -1], [0, 3, -1, 8]] ##B = [6, 25, -11, 15] A = [] B = [] n_spl = int(input('masukkan banyak persamaan : ')) for i in range(n_spl): temp = [] for j in range(n_var): temp.append(float(input('masukkan koefisien SPL ke-%i x%i : '%((i+1),(j+1))))) A.append(temp) B.append(float(input('masukkan hasil SPL ke-%i : '%(i+1)))) error = float(input('masukkan batas error : ')) max_iterasi = int(input('masukkan maksimal iterasi : ')) X = [0] * len(A) X_temp = copy.copy(X) def tampil_matrix(matrix): for i in range(len(matrix)): print('|', end=' ') for j in range(len(matrix[0])): print(matrix[i][j], end=' ') print('|') print() print('Matrix A') tampil_matrix(A) print('Matrix B', B) print() e = 1 iterasi = 0 while math.sqrt(e) >= error and iterasi < max_iterasi: if linalg.det(A) != 0: for i in range(len(X)): i_sum = 0 for j in range(len(X)): if j!=i: i_sum += A[i][j] * X_temp[j] X[i] = round((B[i] - i_sum) / A[i][i], 4) print('k-'+str(iterasi+1), 'X =', X) e = 0 for i in range(len(X)): e += (X[i] - X_temp[i]) ** 2 X_temp = copy.copy(X) iterasi+=1 else: print('tidak ada peneyelesaian untuk persamaan tersebut!') for i in range(len(X)): print('X'+str(i+1),':', X[i])
error = 0.001 max_iterasi = 100 A = [[10, -1, 2, 0], [-1, 11, -1, 3], [2, -1, 10, -1], [0, 3, -1, 8]] B = [6, 25, -11, 15] X = [0] * len(A) X_temp = copy.copy(X)
e = 1 iterasi = 0 while math.sqrt(e) >= error and iterasi < max_iterasi: if linalg.det(A) != 0: ##Gauss Jacobi Method print('k-'+str(iterasi+1), 'X =', X) e = 0 for i in range(len(X)): e += (X[i] - X_temp[i]) ** 2 X_temp = copy.copy(X) iterasi+=1 else: print('tidak ada peneyelesaian untuk persamaan tersebut!')
for i in range(len(X)): i_sum = 0 for j in range(len(X)): if j!=i: i_sum += A[i][j] * X_temp[j] X[i] = round((B[i] - i_sum) / A[i][i], 4)
Setelah program tersebut dijalankan maka menghasilkan output seperti berikut.
Matrix A | 10 -1 2 0 | | -1 11 -1 3 | | 2 -1 10 -1 | | 0 3 -1 8 | Matrix B [6, 25, -11, 15] k-1 X = [0.6, 2.2727, -1.1, 1.875] k-2 X = [1.0473, 1.7159, -0.8052, 0.8852] k-3 X = [0.9326, 2.0533, -1.0494, 1.1309] k-4 X = [1.0152, 1.9537, -0.9681, 0.9738] k-5 X = [0.989, 2.0114, -1.0103, 1.0213] k-6 X = [1.0032, 1.9923, -0.9945, 0.9944] k-7 X = [0.9981, 2.0023, -1.002, 1.0036] k-8 X = [1.0006, 1.9987, -0.999, 0.9989] k-9 X = [0.9997, 2.0004, -1.0004, 1.0006] k-10 X = [1.0001, 1.9998, -0.9998, 0.9998] k-11 X = [0.9999, 2.0001, -1.0001, 1.0001] X1 : 0.9999 X2 : 2.0001 X3 : -1.0001 X4 : 1.0001
Metode Gauss Seidel¶
Perhitungan Gauss Seidel¶
Setelah menyelesaikan satu iterasi dari metode Gauss Seidel maka ditemukan nilai x_1=0,6000, x_2=2,3273, x_3=-0,9873, dan x_4=0,8789.
Implementasi Gauss Seidel dengan Python¶
import math import copy from numpy import linalg ##A = [[10, -1, 2, 0], [-1, 11, -1, 3], [2, -1, 10, -1], [0, 3, -1, 8]] ##B = [6, 25, -11, 15] A = [] B = [] n_spl = int(input('masukkan banyak persamaan : ')) for i in range(n_spl): temp = [] for j in range(n_var): temp.append(float(input('masukkan koefisien SPL ke-%i x%i : '%((i+1),(j+1))))) A.append(temp) B.append(float(input('masukkan hasil SPL ke-%i : '%(i+1)))) error = float(input('masukkan batas error : ')) max_iterasi = int(input('masukkan maksimal iterasi : ')) X = [0] * len(A) X_prev = copy.copy(X) def tampil_matrix(matrix): for i in range(len(matrix)): print('|', end=' ') for j in range(len(matrix[0])): print(matrix[i][j], end=' ') print('|') print() print('Matrix A') tampil_matrix(A) print('Matrix B', B) print() e = 1 iterasi = 0 while math.sqrt(e) >= error and iterasi < max_iterasi: if linalg.det(A) != 0: for i in range(len(X)): i_sum = 0 for j in range(len(X)): if j!=i: i_sum += A[i][j] * X[j] X[i] = round((B[i] - i_sum) / A[i][i], 4) print('k-'+str(iterasi+1), 'X =', X) e = 0 for i in range(len(X)): e += (X[i] - X_prev[i]) ** 2 X_prev = copy.copy(X) iterasi+=1 else: print('tidak ada peneyelesaian untuk persamaan tersebut!') for i in range(len(X)): print('X'+str(i+1),':', X[i])
Berikut merupakan listing utama dari program tersebut. listing tersebut merupakan tempat komputasi dari metode Gauss Seidel. Program tersebut akan berjalan dan berhenti dalam kondisi seperti program Gauss Jacobi, hanya saja perbedaannya terletak pada proses perhitungan.
e = 1 iterasi = 0 while math.sqrt(e) >= error and iterasi < max_iterasi: if linalg.det(A) != 0: ### Gauss Seidel Method print('k-'+str(iterasi+1), 'X =', X) e = 0 for i in range(len(X)): e += (X[i] - X_prev[i]) ** 2 X_prev = copy.copy(X) iterasi+=1 else: print('tidak ada peneyelesaian untuk persamaan tersebut!')
for i in range(len(X)): i_sum = 0 for j in range(len(X)): if j!=i: i_sum += A[i][j] * X[j] X[i] = round((B[i] - i_sum) / A[i][i], 4)
Setelah program tersebut dijalankan maka menghasilkan output seperti berikut.
Matrix A | 10 -1 2 0 | | -1 11 -1 3 | | 2 -1 10 -1 | | 0 3 -1 8 | Matrix B [6, 25, -11, 15] k-1 X = [0.6, 2.3273, -0.9873, 0.8788] k-2 X = [1.0302, 2.037, -1.0145, 0.9843] k-3 X = [1.0066, 2.0036, -1.0025, 0.9983] k-4 X = [1.0009, 2.0003, -1.0003, 0.9998] k-5 X = [1.0001, 2.0, -1.0, 1.0] X1 : 1.0001 X2 : 2.0 X3 : -1.0 X4 : 1.0
Sekian terimakasih :)