Anda di halaman 1dari 19

A. PENDAHULUAN 1.

Latar Belakang Persamaan diferensial parsial khusus digunakan untuk menggambarkan kelakuan dari medium kontinu seperti fluida dan medan elektromagnetik. Medan listrik E untuk distribusi densitas muatan statis (x,y,z) biasanya ditentukan oleh Hukum Gauss:

Dimana

adalah konstanta permitivitas. Sebuah medan listrik statis dapat

diperoleh dari potensial skalar

Yang menurut persamaan Poisson: ( )

Persamaan ini dapat diselesaikan dengan metode multigrid. Metode multigrid pertama kali diperkenalkan oleh Brandt, dan secara independen oleh Hackbusch, pada tahun 1970. Mereka dapat memecahkan persamaan diferensial parsial berbentuk elips pada sebuah kisi-kisi (pola-pola geometris dari molekul-molekul) dengan N poin dalam operasi O(N). Metode ini pada dasarnya merupakan metode iterasi yang jarak grid disesuaikan dengan setiap langkah, sebagai contoh yaitu peningkatan dan penurunan bilangan dari poin-poin dalam setiap dimensi oleh sebuah faktor dari 2. Ada beberapa metode iterasi yang dapat digunakan, yaitu metode Jacobi, metode Gauss-seidel dan metode Relaksasi.

2. Rumusan Masalah Rumusan masalah dari tulisan ini adalah bagaimana menyelesaikan persamaan Poison dengan metode iterasi Jacobi, Gauss-Seidel dan Relaksasi? 3. Tujuan 1. Tujuan penulisan ini adalah untuk menyelesaikan persamaan Poison dengan metode iterasi Jacobi, Gauss-Seidel, dan Relaksasi. 2. Melihat tampilan program pada octave.

B. TINJAUAN PUSTAKA 1. Metode Jacobi Metode Iterasi Jacobi merupakan salah satu bidang analisis numerik yang digunakan untuk menyelesaikan permasalahan persamaan linear dan sering dijumpai dalam berbagai disiplin ilmu. Metode Iterasi Jacobi merupakan salah satu metode tak langsung, yaitu bermula dari suatu hampiran penyelesaian awal dan kemudian berusaha memperbaiki hampiran dalam tak berhingga namun langkah konvergen. Metode Iterasi Jacobi ini digunakan untuk menyelesaikan persamaan linear berukuran besar dan proporsi koefisien nolnya besar. Metode ini ditemukan oleh matematikawan yang berasal dari Jerman,Carl Gustav Jakob Jacobi. Penemuan ini diperkirakan pada tahun 1800-an. Sistem persamaan linear yang terdiri dari n persamaan dengan n variabel x1, x2, ..., xn dinyatakan dengan

Persamaan ke-i dalam sistem persamaan (1.1) dinyatakan sebagai

Persamaan (4.1) dapat diekspresikan sebagai

Dari (4.2) dapat diperoleh penyelesaian persamaan ke-i yaitu

Dengan demikian, algoritma metode Jacobi diekspresikan sebagai

Untuk menyelesikan sistem persamaan linear dengan metode Jacobi (maupun

metode Gauss-Seidel) diperlukan suatu nilai pendekatan awal yaitu x(0). Nilai x(0) biasanya tidak diketahui dan dipilih x(0) = 0.

2. Metode Gauss-Seidel Metode Iterasi Gauss-Seidel merupakan modifikasi dari metode Iterasi Jacobi. Modifikasi tersebut terletak pada rumus berikut:

dimana i=1,2,3,...,n. Untuk lebih jelasnya, marilah kita perhatikan contoh berikut, diketahui sistem persamaan linear Ax = b yaitu

Lalu, sistem persamaan tersebut diubah susunannya menjadi seperti ini

Misalnya kita tentukan nilai-nilai awal x(0) sebagai berikut

dan

Atau dinyatakan seperti ini x(0) = (0; 0; 0; 0)t. Maka pada k = 1 kita akan memperoleh nilai-nilai x(1) sebagai berikut:

Lalu proses perhitungan diulangi lagi dengan k = 2. Begitu seterusnya proses ini diulang-ulang lagi untuk nilai-nilai k berikutnya sampai x(k) mendekati solusi yang sesungguhnya, yaitu

3. Metode Relaksasi Metode Iterasi Relaksasi (Relaxation method ) dinyatakan dengan rumus berikut:

dimana i=1,2,3,...,n.

Untuk lebih jelasnya, marilah kita perhatikan contoh berikut, diketahui sistem persamaan linear Ax = b yaitu:

memiliki solusi (3, 4,5)t. Metode Gauss-Seidel dan Relaksasi dengan = 1, 25 akan digunakan untuk menyelesaikan sistem persamaan linear di atas dengan x(0)= (1, 1, 1)t. Untuk setiap nilai k = 1, 2, 3, ..., persamaan Gauss-Seidelnya adalah

Sedangkan persamaan untuk metode Relaksasi dengan = 1, 25 adalah

Tabel berikut ini menampilkan perhitungan dari masing-masing metode hingga iterasi ke-7.

Dari kasus ini, bisa kita simpulkan bahwa iterasi Relaksasi memerlukan proses iterasi yang lebih singkat dibandingkan iterasi Gauss-Seidel. Jadi, pada kasus ini (dan juga secaraumum), Relaksasi lebih efektif dibandingkan Gauss-Seidel. Pertanyaannya sekarang,bagaimana menentukan nilai yang optimum? Metode Relaksasi dengan pilihan nilai yang berkisar antara 0 dan 1 disebut metode underrelaxation, dimana metode ini berguna agar sistem persamaan linear mencapai

kondisi konvergen walaupun sistem tersebut sulit mencapai kondisi konvergen dengan metode Gauss-Seidel. Sementara bila nilainya lebih besar dari angka 1, maka disebut metode successive over-relaxation (SOR), yang mana metode ini berguna untuk mengakselerasi atau mempercepat kondisi konvergen dibandingkan dengan Gauss-Seidel. Metode SOR ini juga sangat berguna untuk menyelesaikan sistem persamaan linear yang muncul dari persamaan diferensial-parsial tertentu.

C. HASIL DAN PEMBAHASAN Program ini disusun untuk menyelesaikan persamaan Poison dalam menentukn nilai potensial dengan tiga metode iterasi, yaitu metode Jacobian, metode Gauss-Seidel, metode relaksasi. Berikut adalah listing program untuk mennyelesaikan persamaan Poison tiga dimensi dengan metode iterasi Jacobi, Gauss-Seidel, dan Relaksasi.

Dan berikut ini adalah hasil dari program di atas.

Dari ketiga metode tersebut diperoleh hasil yang berberda-beda dengan akkurasi yang sama yaitu 0.005. Pada metode Jacobian diperoleh nilai CPU time 0,063 sec, metode Gauss-Seidel 0,078 sec, dan metode relaksasi 0,109 sec. Untuk metode relaksasi nilai omega yang diberikan adalah 5. Nilai ini lebih dari satu sehingga disebut metode successive over-relaxation (SOR), yang mana metode ini berguna untuk mengakselerasi atau mempercepat kondisi konvergen dibandingkan dengan Gauss-Seidel. Metode SOR ini juga sangat berguna untuk menyelesaikan sistem persamaan linear yang muncul dari persamaan diferensial-parsial tertentu.

Program pada Octave

octave-3.2.0.exe:1:C:\Octave\3.2.0_gcc-4.3.0\bin > cd d: octave-3.2.0.exe:2:d:\ > data=load('poison.data'); octave-3.2.0.exe:4:d:\ > x=data(:,1); octave-3.2.0.exe:5:d:\ > y=data(:,2); octave-3.2.0.exe:6:d:\ > z=data(:,3); octave-3.2.0.exe:7:d:\ > plot(x,y,z) octave-3.2.0.exe:8:d:\ tampilan pada octave

Kalau kita melihat dari tampilan kita dapat lihat bahwa hasil dari program ini adalah gelombang sinusoidal yang sangat kecil dan terliahat berimpit hal ini di karenakan data yang diperoleh sangat banyak yakni 10400 data.

D. PENUTUP Kesimpulan Dari ketiga metode tersebut diperoleh hasil yang berberda-beda dengan akkurasi yang sama. Tampialn pada octave membentuk gelombang sinusoidal yang sangat kecil dan terlihat sangat berimpit karena datanya mencapai 10400.

E. DAFTAR PUSTAKA

Nugroho,susilo.penyelesaian system persamaan linear dengan metode iterasi. (http://www.asimtot.files.wordpress.com) di unggah januari 2012 Supryanto.metode iterasi gauss-seiddel dalam sistem persamaan linier (http:// www.infometrik.com) di unggah januari 2012 Supriyanto.metode iterasi relaksasi dalam system persamaan linear. ( http:// www.infometrik.com) di unggah januari 2012

PROJECT FISIKA KOMPUTASI

MENYELESAIKAN PERSAMAAN POISSON DENGAN METODE ITERASI JACOBI, GAUSS-SEIDDEL DAN RELAKSASI

O L E H
KELOMPOK 5 ZAHID RAMDHAN (GIB 009 053) MALJAUSSALFI IYOEGA (G1B 009 048) MAESARAH (G1B 009 022) SITI FITRI JALILAH (G1B 008 014) JUMRATUL WUSTHA (G1B 009 001)

PROGRAM STUDI FISIKA FAKULTAS MIPA UNIVERSITAS MATARAM 2012

lampiran //project fisika komputer

#include<cmath> #include<cstdlib> #include<ctime> #include<iostream> #include<fstream> #define N 102

using namespace std;

int L=100; double psi [N][N][N]; float rho [N][N][N];

double h; double psiNew [N][N][N]; int steps; double accuracy; double omega;

void initialize() { for (int i=0; i<L; i++) for (int j=0; j<L; j++) for (int k=0; k<L; k++) psi [i][j][k]=psiNew [i][j][k]=rho [i][j][k]=0.5;

h=1/double(L+1); double q=10; int i=L/2; int j=L/2;

int k=L/2; rho [i][j][k]=q/(h*h); //rho [i][j]=q/(h*h); steps=0; }

void jacobi() { for (int i=1; i<=L; i++){ for (int j=1; j<=L; j++){ for (int k=1; k<=L; k++){ psiNew[i][j][k]=0.17*(psi[i-1][k][j]+psi[i+1][k][j]+psi[i][k][j1]+psi[i][k][j+1]+psi[i][j][k-1]+psi[i][j][k+1]+h*h*rho [i][j][k]); }}} }

double relativeError() { double error =0; int n=0;

for (int i=1; i<=L; i++) for (int j=1; j<=L; j++) for (int k=1; k<=L; k++) { if (psiNew [i][j][k] !=0) if (psiNew [i][j][k] !=psi [i][j][k]) { error +=abs(1-psi [i][j][k]/psiNew [i][j][k]); ++n; } }

if (n !=0) error /=n; return error; }

void gaussSeidel () { //kopi nilai psi ke psiNew for (int i=1; i<=L; i++) for (int j=1; j<=L; j++) for (int k=1; k<=L; k++)

psiNew [i][j][k]=psi [i][j][k]; //gaus-seidel update for (int i=1; i<=L; i++){ for (int j=1; j<=L; j++){ for (int k=1; k<=L; k++){ psiNew [i][j][k]=0.17*(psiNew[i-1][j][k]+psiNew[i+1][j][k]+psiNew[i][k][j1]+psiNew[i][k][j+1]+psiNew[i][j][k-1]+psiNew[i][j][k+1]+h*h*rho[i][j][k]); }}} }

void SuccessiveOverRelaxtion() { //update even sites for (int i=1; i<=L; i++) for (int j=1; j<=L; j++) for (int k=1; k<=L; k++) if ((i+j+k) %2==0) psiNew [i][j][k]=(1-omega)*psi [i][j][k]+omega/6*(psi[i-1][j][k]+psi[i+1][j][k]+psi[i][k][j1]+psi[i][k][j+1]+psi[i][j][k-1]+psi[i][j][k+1]+h*h*rho[i][j][k]); //update odd sites for (int i=1; i<=L; i++)

for (int j=1; j<=L; j++) for (int k=1; k<=L; k++) if ((i+j+k) %2 !=0) psiNew [i][k][k]=(1-omega)*psi [i][j][k]+omega/6*(psiNew[i-1][j][k]+psiNew[i+1][j][k]+omega/6*(psiNew[i1][j][k]+psiNew[i+1][j][k]+psiNew[i][k][j-1]+psiNew[i][k][j+1]+psiNew[i][j][k1]+psiNew[i][j][j+1]+h*h*rho[i][j][k])); }

void iterate (void(*method)()) { while (true) { method(); ++ steps; double error=relativeError(); if (error<accuracy) break;

} cout <<"Number of steps="<<steps<<endl; }

int main() { cout <<"Iterative solution of poisson's equation\n"; cout <<"Iterative solution of poisson's equation\n"; cout <<"Enter desited accuracy in solution:"; cin >> accuracy;

clock_t t0=clock(); cout << "Enter 1 for jacobi, 2 for Gauss Seidel, 3 for SOR:"; int choice; cin >> choice;

switch (choice) { tahap 1: iterate (jacobi); break; tahap 2: iterate (gaussSeidel); break; tahap 3: cout <<"Enter overrelaxation parameter omega:"; cin >> omega; iterate (SuccessiveOverRelaxtion); break; default: cout <<"jacobi:" <<endl; iterate (jacobi); cout <<"gaussSeidel:" <<endl; initialize (); iterate (gaussSeidel); omega=2/(1+4*atan(1.0)/double (L)); cout <<"Successive Over Relaxtion with theoretical optimum omega="<< omega<<endl; initialize (); iterate (SuccessiveOverRelaxtion); break; } clock_t t1=clock(); cout << "CPU time= "<< endl << double (t1-t0)/CLOCKS_PER_SEC << "sec" << endl;

// write potensial to file cout << "potensial in file poison.data" << endl; ofstream file ("poison.data"); //int k = L/2;

for (int i=0; i<L+2; i++) {

double x=i*h; for (int j=0; j<L+2; j++){ double y=j*h; for (int k=0; k<L+2; k++){ double z=k*h; file << x <<"\t" << y <<"\t" << k << "\t" << psi[i][j][k]<< '\n'; //file << x <<"\t" << y <<"\t" << "\t" << psi[i][j]<< '\n';

} //file << '\n';

file.close ();

} } //main

Anda mungkin juga menyukai