Komputasi Numeris: Iterasi Jacobi
Pendahuluan:
Metode Jacobi merupakan salah satu metode penyelesaian sistem persamaan linear (baca: matriks) berdimensi banyak (baca: lebih dari 2). Untuk matriks dengan dimensi kecil (kurang atau sama dengan dua), lebih efektif diselesaikan dengan aturan eliminasi atau metode Cramer.
Sistem persamaan linear dapat di-representasikan (dimodelkan) dalam bentuk matriks sebagai berikut:
Sebagai contoh:
3x1 + x2 - x3 = 5
4x1 + 7x2 - 3x3 = 20
2x1 - 2x2 + 5x3 = 10
dapat di-representasikan sebagai:
Iterasi Jacobi memiliki rumus persamaan sebagai berikut:
Jika inisialisasi nilai awal x1, x2 dan x3 = 0, maka:
Iterasi berikutnya ditunjukkan pada tabel berikut ini:
Jika diperhatikan pada tabel di atas, nilai x1, x2 dan x3 semakin stabil (perbedaan nilai saat ini dengan nilai sebelumnya semakin kecil). Proses ini dapat diteruskan sesuka hati sampai diperoleh toleransi error yang diinginkan.
Menulis Kode Program
Setelah kita mengetahui algoritma Methode Jacobi, saatnya menulis kode program supaya kita dapat mengganti-ganti persamaannya secara mudah. Saya menggunakan C++ sebagai contoh.
Step #1 : Menulis identitas program
//--------JACOBI Iteration
//--------Haruno Sajati, S.T., M.Eng
//--------jati@stta.ac.id
//--------Teknik Informatika
//--------Sekolah Tinggi Teknologi Adisutjipto
Step #2 : Deklarasi header dan inisialisasi variabel
#include<iostream.h>
void main()
{
int i, j, k, l, ukuran, iterasi;
float f[10], a[10][10],b[10],x[10], toleransi, sigma[10];
Step #3 : Input ukuran matriks
//input ukuran matrik
cout << "Masukkan besar matriks : ";
cin >> ukuran;
Step #4 : Input matriks A dan matriks B
//masukkan matrik a
for (i=1;i<=ukuran;i++){
for (j=1;j<=ukuran;j++){
cout << "Masukkan elemen matrik a[" << i << "][" << j << "] = ";
cin >> a[i][j];
}
}
//masukkan matrik b
for (i=1;i<=ukuran;i++){
cout << "Masukkan elemen matrik b[" << i << "] = ";
cin >> b[i];
}
Step #5 Inisialisasi nilai awal
//inisialisasi nilai awal
for (i=1;i<=ukuran;i++){
x[i]=0;
}
toleransi = 10;
iterasi = 0;
Step #6 Iterasi Jacobi
while (toleransi > 0.00001)
{
iterasi++;
cout << "---------------------------------------\n";
cout << "iterasi ke " << iterasi << endl;
if (iterasi > 50)
break;
//menghitung jumlah total sigma
for (k=1;k<=ukuran;k++) {
sigma[k] = 0;
for (l=1;l<=ukuran;l++)
{
if (k != l) {
sigma[k] = sigma[k] + (a[k][l]*x[l]);
} // tutup if k != l
} // tutup for l
f[k] = (b[k] - sigma[k])/a[k][k];
cout << "x[" << k << "] = " << f[k] << endl;
} // tutup for k
toleransi = (f[1]-x[1])+(f[2]-x[2])+(f[3]-x[3]);
if (toleransi < 0) {
toleransi *= -1;
}
for (i=0;i<=ukuran;i++) {
x[i] = f[i];
}
} //tutup while
} //tutup void
Uji Coba Program
1. Proses input matriks:
2. Iterasi 1 -5
3. Iterasi 15 - 19
Selamat mencoba
Metode Jacobi merupakan salah satu metode penyelesaian sistem persamaan linear (baca: matriks) berdimensi banyak (baca: lebih dari 2). Untuk matriks dengan dimensi kecil (kurang atau sama dengan dua), lebih efektif diselesaikan dengan aturan eliminasi atau metode Cramer.
Sistem persamaan linear dapat di-representasikan (dimodelkan) dalam bentuk matriks sebagai berikut:
3x1 + x2 - x3 = 5
4x1 + 7x2 - 3x3 = 20
2x1 - 2x2 + 5x3 = 10
dapat di-representasikan sebagai:
Tujuannya supaya mudah untuk diselesaikan secara matematis.
Aturan Jacobi:
atau
Iterasi berakhir jika:
Atau perhitungan saat ini tidak berbeda jauh (baca: mirip) dengan perhitungan sebelumnya.
Jika di-implementasikan ke contoh di atas menjadi:
Jika inisialisasi nilai awal x1, x2 dan x3 = 0, maka:
Iterasi berikutnya ditunjukkan pada tabel berikut ini:
Jika diperhatikan pada tabel di atas, nilai x1, x2 dan x3 semakin stabil (perbedaan nilai saat ini dengan nilai sebelumnya semakin kecil). Proses ini dapat diteruskan sesuka hati sampai diperoleh toleransi error yang diinginkan.
Menulis Kode Program
Setelah kita mengetahui algoritma Methode Jacobi, saatnya menulis kode program supaya kita dapat mengganti-ganti persamaannya secara mudah. Saya menggunakan C++ sebagai contoh.
Step #1 : Menulis identitas program
//--------JACOBI Iteration
//--------Haruno Sajati, S.T., M.Eng
//--------jati@stta.ac.id
//--------Teknik Informatika
//--------Sekolah Tinggi Teknologi Adisutjipto
Step #2 : Deklarasi header dan inisialisasi variabel
#include<iostream.h>
void main()
{
int i, j, k, l, ukuran, iterasi;
float f[10], a[10][10],b[10],x[10], toleransi, sigma[10];
Step #3 : Input ukuran matriks
//input ukuran matrik
cout << "Masukkan besar matriks : ";
cin >> ukuran;
Step #4 : Input matriks A dan matriks B
//masukkan matrik a
for (i=1;i<=ukuran;i++){
for (j=1;j<=ukuran;j++){
cout << "Masukkan elemen matrik a[" << i << "][" << j << "] = ";
cin >> a[i][j];
}
}
//masukkan matrik b
for (i=1;i<=ukuran;i++){
cout << "Masukkan elemen matrik b[" << i << "] = ";
cin >> b[i];
}
Step #5 Inisialisasi nilai awal
//inisialisasi nilai awal
for (i=1;i<=ukuran;i++){
x[i]=0;
}
toleransi = 10;
iterasi = 0;
Step #6 Iterasi Jacobi
while (toleransi > 0.00001)
{
iterasi++;
cout << "---------------------------------------\n";
cout << "iterasi ke " << iterasi << endl;
if (iterasi > 50)
break;
//menghitung jumlah total sigma
for (k=1;k<=ukuran;k++) {
sigma[k] = 0;
for (l=1;l<=ukuran;l++)
{
if (k != l) {
sigma[k] = sigma[k] + (a[k][l]*x[l]);
} // tutup if k != l
} // tutup for l
f[k] = (b[k] - sigma[k])/a[k][k];
cout << "x[" << k << "] = " << f[k] << endl;
} // tutup for k
toleransi = (f[1]-x[1])+(f[2]-x[2])+(f[3]-x[3]);
if (toleransi < 0) {
toleransi *= -1;
}
for (i=0;i<=ukuran;i++) {
x[i] = f[i];
}
} //tutup while
} //tutup void
Uji Coba Program
1. Proses input matriks:
2. Iterasi 1 -5
3. Iterasi 15 - 19
Selamat mencoba
mas/mbak itu yang masukkan matriks b nya illegal structure gitu terus inisialisasinya malah undefined kenapa ya tolong pencerahannya
ohh lagi mau tanya nih ini kenapa waktu di run kok malah cuma menghitung iterasi 1 iterasi selanjutnya malah error kenapa ya tolong pencerahannya
Pakai apa nih nulisnya? Kalau pakai visual studio, coba tambahkan using namespace std;
Script di atas, saya tulis pakai Turbo C++ 4.5.
saya pakai aplikasi code blocks. berhasil ketika di run kan. tapi, ingin melihat nilai dari iterasi 1, pas diarahkan keatas kok malah langsung terkeluar ya...?