Oleh:
Drs. Sugeng Rianto, M. Sc.
Ubaidillah, S. Si.
JURUSAN FISIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS BRAWIJAYA
MALANG
2010
MODUL PRAKTIKUM FISIKA KOMPUTASI
DAFTAR ISI
DAFTAR ISI ............................................................................................................... 3
PRACTICE I PENDAHULUAN ................................................................................ 5
1.1. Pendahuluan ............................................................................................... 5
1.2. Perbedaan Kalkulasi Analitis dan Numerik................................................ 5
1.3. Kode Program Komputer ........................................................................... 5
1.4. Requirement ............................................................................................... 6
1.5. Perintah-perintah Dasar .............................................................................. 6
1.6. Compiling Kode Program......................................................................... 13
1.6.1. Turbo Pascal for Windows (TPW) 1.5 ................................................ 13
1.6.2. Python 2.7x .......................................................................................... 15
1.6.3. MATLAB 7.0.1.................................................................................... 17
1.7. Plotting Data ............................................................................................. 17
1.7.1. Plotting GNUPLOT ............................................................................. 18
1.7.2. Plotting Microsoft Excel ...................................................................... 19
PRACTICE II ERROR PENDEKATAN................................................................. 23
PRACTICE III AKAR-AKAR POLINOMIAL ...................................................... 29
PRACTICE IV SOLUSI MATRIKS PERSAMAAN LINIER ............................... 35
PRACTICE V TRENDLINE ................................................................................... 41
PRACTICE VI DIFERENSIASI NUMERIK .......................................................... 47
PRACTICE VII INTEGRASI NUMERIK .............................................................. 53
PRACTICE VIII INTERPOLASI ............................................................................ 57
PUSTAKA ................................................................................................................ 61
PRACTICE I
PENDAHULUAN
1.1. Pendahuluan
Fisika komputasi pada dasarnya adalah menyelesaikan problem-problem fisika
yang tidak dapat diselesaikan secara analitis dengan melakukan pendekatan numerik
berdasarkan teori yang sudah ada. Pendekatan numerik tersebut umumnya dilakukan
dengan bantuan komputer dan menggunakan bahasa pemrograman tertentu, seperti
Pascal, Python, C, C++, Fortran dan lain sebagainya. Hal ini dikarenakan tidak
semua problem matematik dapat diselesaikan oleh komputer secara langsung.
Problem matematik yang rumit, perlu diubah terlebih dahulu ke bentuk operasi
aritmatika ke penambahan, pengurangan, perkalian dan pembagian sederhana agar
dapat dikalkulasi oleh komputer. Pengubahan/penurunan tersebut dikenal dengan
sebutan pendekatan numerik, di mana hasil perhitungannya identik dengan adanya
nilai error.
Problem matematik yang memerlukan penurunan dengan metode numerik oleh
komputer antara lain: problem diferensiasi, integrasi, pencarian akar persamaan
polinomial orde tinggi, eigenvalue matrik, boundary value dan lain sebagainya.
1.2. Perbedaan Kalkulasi Analitis dan Numerik
Salah satu problem matematik yang oleh komputer diselesaikan dengan
kalkulasi numerik adalah problem diferensiasi. Dimisalkan terdapat suatu problem
fisika dengan persamaan matematis y(x)=2x2-3x+1, yang secara analitis untuk x=5,
turunan pertamanya dapat diketahui secara secara langsung dengan penurunan
y‟(x)=dy(x)/dx=4x-3, sehingga nilai diferensiai orde satu terhadap x adalah:
(1)
=17.2
Dari kedua hasil tersebut dapat dibandingkan perbedaan penyelesaian antara
numerik dan analitis mempunyai selisih sebesar 0.2, di mana selisih 0.2 ini nantinya
akan dikenal sebagai nilai error.
1.3. Kode Program Komputer
Salah satu teknik untuk melakukan komputasi numerik adalah dengan
mengimplementasikannya ke bentuk kode program bahasa pemrograman komputer
tertentu. Dalam praktikum fisika komputasi ini disarankan untuk menggunakan
bahasa pemrograman Pascal, Python dan Matlab. Dengan alasannya, karena Pascal
merupakan bahasa pemrograman tingkat tinggi yang sederhana dan mudah untuk
Python
print “Hello World!”
Matlab
disp(„Hello World!‟);
Python
i=input("Masukkan bilangan bulat : ")
r=input("Masukkan bilangan asli/desimal : ")
print "Hasil: "
print "Bilangan bulat : ",i
print "Bilangan asli : ",r
input("Press any key..")
Matlab
i=input('Masukkan bilangan bulat : ');
disp('Hasil: ');
disp(sprintf('Bilangan Bulat : %d',i));
disp(sprintf('Bilangan Asli : %.7f',i));
input('Press any key..');
Python
x=input('x = ')
y=input('y = ')
hasil=1
for i in range(y):
hasil*=x
print "x^y = ",hasil
Matlab
x=input('x = ');
y=input('y = ');
hasil=1;
for i=1:y
hasil=hasil*x;
end
disp(sprintf('Hasil = %d',hasil));
Perintah while:
Kode program 4. Presisi mesin
Pascal
program presisimesin;
uses wincrt;
var i:integer;
angka,hasil:real;
begin
i:=1;
angka:=2;
hasil:=0;
while hasil<>1 do
begin
angka:=angka/9;
hasil:=1+angka;
writeln(i:3,hasil:20:20);
i:=i+1;
end;
end.
Python
i=1
angka=2.0
hasil=0
while hasil!=1 :
angka/=9
hasil=1+angka
print i,hasil
i+=1
Matlab
i=1;
angka=2;
hasil=0;
while (hasil~=1)
angka=angka/9;
hasil=1+angka;
disp(sprintf('%3d %.16f',i,hasil));
i=i+1;
end;
Python
xp=0
x1=15
n=20
p=xp*xp-4*xp-5
print "{0:10} {1:10}".format("x","y")
for i in range(n):
x=0.5*(xp+x1)
y=x*x-4*x-5
print "{0:f} {1:f}".format(x,y)
if (p*y)>0:
xp=x
if (p*y)<0:
x1=x
if (p==y):
break
print "x mendekati ",x
Matlab
xp=0;
x1=15;n=50;
p=xp*xp-4*xp-5;
disp(sprintf('x y'));
for i=0:n
x=0.5*(xp+x1);
y=x*x-4*x-5;
disp(sprintf('%.10f %.10f',x,y));
if (p*y)>0
xp=x;
end
if (p*y)<0
x1=x;
end
if (p==y)
break;
end
end
disp(sprintf('x mendekati %.10f',x));
function luasbola(r:real):real;
begin
luasbola:=(22/7)*r;
end;
begin
bola1:=luasbola(5);
bola2:=luasbola(0.5);
writeln('Luas bola1 = ',bola1:8:7,' sat');
writeln('Luas bola2 = ',bola2:8:7,' sat');
end.
Python
def luasbola(r):
return ((22/7)*r)
bola1=luasbola(5)
bola2=luasbola(0.5)
print "Luas bola1 = {:f}".format(bola1)
print "Luas bola2 = {:f}".format(bola2)
Matlab
luasbola=@(r)((22/7)*r);
bola1=luasbola(5);
bola2=luasbola(0.5);
disp(sprintf('Luas bola1 = %.7f',bola1));
disp(sprintf('Luas bola2 = %.7f',bola2));
Namun di Matlab, jika diperlukan lebih dari satu command yang terdapat
dalam fungsi, aturan pendeklarasiannya, fungsi tersebut harus disimpan dalam
file lain yang berada satu direktori dan disimpan dengan nama file yang sama
dengan nama fungsi itu sendiri. Contoh:
Matlab
%file luasbola.m
function output=luasbola(r)
output=((22/7)*r);
end
%file main.m
bola1=luasbola(5);
bola2=luasbola(0.5);
disp(sprintf('Luas bola1 = %.7f',bola1));
disp(sprintf('Luas bola2 = %.7f',bola2));
f. Output to File
Untuk memudahkan dalam menganalisa hasil program, data hasil
perhitungan biasanya disimpan dalam sebuah file. Selain itu, metode
penyimpanan ini dapat digunakan jika diperlukan untuk memplot hasil
perhitungan ke dalam bentuk grafik, di mana kompiler yang digunakan tidak
memiliki fungsi plotter-nya. Contoh kode program untuk penyimpanan data ini
adalah:
Kode program 7. Output to file
Pascal
program kefile;
uses wincrt;
var
x,y:real;
fp:text;
begin
assign(fp,'data.txt');
rewrite(fp);
x:=0;
while x<50 do
begin
y:=x*x-4*x-5;
writeln(fp,x:10:7,' ',y:10:7);
x:=x+0.25;
end;
close(fp);
write('Done..')
end.
Python
fp=open("data.txt","w");
x=0
while x<50:
y=x*x-4*x-5;
fp.write("{:f} {:f}\n".format(x,y))
x+=0.25
fp.close()
print "Done.."
Matlab
fp=fopen('data.txt','w');
x=0;
while (x<50)
y=x*x-4*x-5;
fprintf(fp,'%f %f\n',x,y);
x=x+0.25;
end
fclose(fp);
disp('Done..');
mana dari kedua teknik tersebut diharapkan praktikan dapat mengetahui dasar-dasar
dalam membuat grafik.
PRACTICE II
ERROR PENDEKATAN
Teori
Deret Taylor dapat digunakan untuk melakukan pendekatan numerik dari suatu
fungsi f(x) berdasarkan nilai f(a) yang telah diketahui. Secara matematis deret Taylor
dinotasikan:
(2)
x
Jika f(x)=e , dengan deret Taylor di atas, nilai f(x) dapat didekati dengan deret
seperti ditunjukkan pada persamaan 3 dengan mengambil nilai a=0.
(3)
Begitu juga untuk sin x dan cos x, dengan mengambil nilai a=0, deret
pendekatannya adalah:
(4)
(5)
Problem
Kemampuan komputer impossible untuk melakukan kalkulasi sampai deret tak
hingga. Oleh karena itu solusi persamaan 3, 4, dan 5 adalah dengan memotong deret
pada nilai n tertentu yang mana nilai error hasil pendekatannya mendekati nol atau
bergantung pada kemampuan maksimum komputer yang digunakan. Pertanyaannya
adalah berapakah nilai n dari masing-masing persamaan 3, 4, dan 5 agar nilai error
pendekatannya mendekati atau sama dengan 0?
Project I
a. Tujuan
Mengetahui nilai error dari pendekatan numerik suatu deret tak hingga
berdasarkan model matematis dan kemampuan komputer yang digunakan.
b. Pseudocode
Pseudocode 1. Alur kode program eksponen
Input x, n
e=1
for i=1 to n do
Hitung a=xi
Hitung b=i!
e= e+(a/b)
end for
print e
a berfungsi sebagai pembilang dan b berkedudukan sebagai penyebut dari setiap
suku deret yang dihitung.
c. Implementasi Kode Program
Kode program 8. Eksponen
Pascal
program exponen; function factorial(m:integer):integer;
uses wincrt; var i,hasil:integer;
var e,a,x:real; begin
i,n,b:integer; hasil:=1;
for i:=1 to m do
function hasil:=hasil*i;
pangkat(x:real;y:integer):real; factorial:=hasil;
var hasil:real; end;
i:integer;
begin begin
hasil:=1; write('x = ');readln(x);
for i:=1 to y do write('n = ');readln(n);
hasil:=hasil*x; e:=1;
pangkat:=hasil; for i:=1 to n do
end; begin
a:=pangkat(x,i);
b:=factorial(i);
e:=e+(a/b);
writeln(i);
end;
writeln('e^x = ',e:12:11);
end.
Python
def factorial(m):
hasil=1
for j in range(1,(m+1)):
hasil*=j
return hasil
x=input("x = ")
n=input("n = ")
e=1.0
for i in range(1,(n+1)):
a=x**i;
b=factorial(i)
e+=(a/b)
print "e^x = {}".format(e)
Matlab
%file faktorial.m
function output=faktorial(m)
hasil=1;
for j=1:m
hasil=hasil*j;
end
output=hasil;
end
%file eksponen.m
x=input('x = ');
n=input('n = ');
e=1;
for i=1:n
a=x^i;
b=faktorial(i);
e=e+(a/b);
end
disp(sprintf('e^x = %.10f',e));
Project II
a. Tujuan
Mengetahui kelemahan dari model numerik deret tak hingga.
b. Pseudocode
Pseudocode 2. Alur kode program sinus
Input x, n
s=x
c=-1
for i=2 to n do
if (i mod 2)=1 then
Hitung a=xi
Hitung b=i!
s= s+c*(a/b)
c=-1*c
endif
end for
print s
variabel c digunakan sebagai pengubah untuk melakukan penambahan atau
pengurangan terhadap hasil penjumlahan nilai s sebelumnya. i mod 2 berfungsi agar
suku-suku deret yang diambil, hanyalah deret yang berindeks n/suku ganjil.
Python
import math
x=input("x = ")
n=input("n = ")
s=x
c=-1
for i in range(2,(n+1)):
if (i%2)==1:
a=x**i;
b=math.factorial(i)
s+=c*(a/b)
c*=-1
print "sin x = {}".format(s)
Matlab
%file sinus.m
x=input('x = ');
n=input('n = ');
s=x;
c=-1;
for i=2:n
if (mod(i,2)==1)
a=x^i;
b=factorial(i);
s=s+c*(a/b);
c=-1*c;
end
end
disp(sprintf('sin x = %.10f',s));
PRACTICE III
AKAR-AKAR POLINOMIAL
Teori
Bentuk persamaan polinomial untuk orde ≤ n adalah:
(6)
dengan nilai koefisien a0, a1, …, an tertentu. Akar-akar persamaannya dapat
diketahui dengan beberapa metode seperti metode setengah selisih (biseksi), metode
Secant, Newton-Raphson, dan lain sebagainya.
Ide metode setengah selisih adalah mencari nilai xi+1 yang nilai f(xi) mendekati
nol berdasarkan nilai f(xi) dan f(xi-1). Ilustrasi pendekatan ini seperti Gambar 3.1 dan
nilai xi dan xi-1-nya harus menghasilkan nilai f(xi) dan f(xi-1) yang berbeda tanda.
f(x)
xi-1 xi+1 xi x
f(x)
xi+1 xi-1 xi x
(7)
Problem
Kode program 5 merupakan contoh pancarian akar dari persamaan polinomial
orde 2. Pencarian akar untuk orde <=2 dan akar-akarnya berupa bilangan bulat,
mungkin tidak akan menjadi masalah jika dilakukan secara analitis, tetapi
bagaimana jika persamaan polinomialnya memiliki orde >2 atau akar-akarnya
merupakan bilangan asli?
Project III
a. Tujuan
Menentukan akar-akar pada persamaan polinomial orde banyak.
b. Pseudocode
Pseudocode 3. Alur pencarian akar dengan metode setengah selisih
Input x0,x1, n
for i=0 to n do
x2=0.5*( x0+x1)
Hitung f(x2)
if f(x2)<0 then x0=x2
else if f(x2)<0 then x1=x2
else break for
end for
print x2
Hitung f2=f(x2)
x0=x1, x1=x2
f0=f1, f1=f2
end for
print x2
function f(x:real):real;
begin
f:=x*x*x*x-31*x*x*x+230*x*x-452*x-144;
end;
begin
write('x0 = ');readln(x0);
write('x1 = ');readln(x1);
write('n = ');readln(n);
f0:=f(x0);
f1:=f(x1);
for i:=0 to n do
begin
if((f1-f0)<>0)then
x2:=x1-(f1*(x1-x0))/(f1-f0)
else
begin
writeln('Stoped..');
i:=n
end;
f2:=f(x2);
x0:=x1;f0:=f1;
x1:=x2;f1:=f2;
writeln(i,' ',x2:11:10,' ',f2:11:10);
end;
end.
Python
def f(x):
y=x*x*x*x-31*x*x*x+230*x*x-452*x-144
return y
x0=input("x0 = ")
x1=input("x1 = ")
n=input("n = ")
f0=f(x0)
f1=f(x1)
for i in range(n):
if((f1-f0)!=0):
x2=x1-(f1*(x1-x0))/(f1-f0)
else:
print "Break.."
break
f2=f(x2)
x0,f0=x1,f1
x1,f1=x2,f2
print "{:.10f} {:.10f}".format(x2,f2);
Matlab
f=@(x)x*x*x*x-31*x*x*x+230*x*x-452*x-144;
x0=input('x0 = ');
x1=input('x1 = ');
n=input('n = ');
f0=f(x0);
f1=f(x1);
for i=0:n
if((f1-f0)~=0)
x2=x1-(f1*(x1-x0))/(f1-f0);
else
disp('Break..');
break;
end
f2=f(x2);
x0=x1;f0=f1;
x1=x2;f1=f2;
disp(sprintf('%f %f',x2,f2));
end
d. Tugas
1. Buatlah grafik hubungan f(x) dan x untuk persamaan 8, berdasarkan contoh
pembuatan grafik Gambar 1.9 atau 1.15!
2. Modifikasi Kode program 5, atau buat kode program sendiri sesuai bahasa
pemrograman yang anda kuasai dan Pseudocode 3, untuk mencari akar-akar
persamaan 8 dengan metode setengah selisih!
3. Bandingkan teknik penentuan nilai awal x0 dan x1 untuk mendekati salah satu
nilai akar antara metode setengah selisih dan metode Secant, serta bandingkan
jumlah iterasi yang diperlukan antara kedua metode tersebut!
4. Apa yang dimaksud dengan Bracketing Method? Jelaskan apakah yang anda
lakukan pada soal no. 3 termasuk metode tersebut?
5. Tentukan nilai keempat akar-akar persamaan 8 dengan kode program yang
anda pakai atau yang anda buat, yang mengacu pada grafik soal no. 1!
6. Buatlah Pseudocode atau kode program sesuai bahasa pemrograman yang
anda kuasai untuk mencari akar-akar persamaan 8 dengan metode Newton
Rapshon! (optional)
PRACTICE IV
SOLUSI MATRIKS PERSAMAAN LINIER
Teori
Data dalam bentuk matriks sering kali digunakan dalam perhitungan numerik.
Dalam persamaan linier, agar lebih mudah, sering kali persamaan-persamaan yang
menjadi problem matematik digenerate dalam bentuk matriks untuk mencari solusi
penyelesaiannya. Contoh metode numerik yang berbasis matriks antara lain:
decomposisi LU, eliminasi Gauss-Jordan, Tridiagonal matriks, dan lain sebagainya.
Penyelesaian eliminasi Gauss-Jordan, seperti dimisalkan terdapat problem
matematis dengan elemen-elemen matriks m x n sebagaimana Gambar 4.1, untuk
mencari nilai x1, x2, x3, .., xm langkah-langkahnya adalah sebagaimana berikut:
Dilanjutkan pada baris ketiga dan seterusnya sampai m dengan cara yang
sama, sampai didapatkan nilai diagonal matriknya bernilai 1 dan elemen
matriks bagian bawah diagonalnya bernilai nol.
Setelah itu, teknik yang dilakukan pada baris satu sampai m di atas dibalik,
namun hanya digunakan untuk menghitung agar nilai elemen matriks
bagian atas dari diagonal bernilai nol.
Nilai c1n+1, c2n+1, c3n+1, …, cmn+1 merupakan solusi yang tidak lain adalah
nilai x1, x2, x3, .., xm. Langkah-langkah di atas disederhanakan dalam
Pseudocode 5.
Problem
Aplikasi program interface seperti Matlab, Maple, Octave dan Enthought
Python, memiliki notasi sendiri untuk mengenerate matriks, yang mana dengan
aturan notasi tersebut operasi aritmatika matriks seperti penambahan, pengurangan,
perkalian, bahkan untuk mengetahui nilai invers-nya, telah disediakan dalam library
dan tinggal memanggilnya saja. Namun bagaimana jika perhitungan numerik
membutuhkan operasi matematik atau implementasi numerik yang tidak disediakan
dalam library aplikasi tersebut?
Project IV
a. Tujuan
Menentukan solusi numerik berdasarkan bentuk matriks suatu persamaan
linier.
b. Pseudocode
Pseudocode 5. Alur kode program implementasi eliminasi Gauss-Jordan
Python
m=3
n=m
a=[[2.0,5.0,7.0],[4.0,-5.0,3.0],[8.0,3.0,-5.0]]
b=[24.0,38.0,-18.0]
c=[[0 for i in range(n+1)] for j in range(m)]
#inisialisasi Matriks c
for i in range(m):
for j in range(n):
c[i][j]=a[i][j]
for i in range(m):
c[i][n]=b[i]
#proses eliminasi
for k in range(m):
p=c[k][k]
for j in range(k,n+1):
c[k][j]/=p
for i in range(k+1,m):
p=c[i][k]
for j in range(k,n+1):
c[i][j]-=c[k][j]*p
for k in range(m-1,-1,-1):
for i in range(k-1,-1,-1):
p=c[i][k]
for j in range(k,n+1):
c[i][j]-=c[k][j]*p
#tampilkan c
for i in c:
print i
Matlab
m=3;n=m; for k=m:-1:1
a=[2 5 7;4 -5 3;8 3 -5]; for i=k-1:-1:1
b=[24 38 -18]; p=c(i,k);
c=[]; for j=(m+1):-1:1
%inisialisasi Matriks c c(i,j)=c(i,j)-c(k,j)*p;
for i=1:m end
for j=1:n end
c(i,j)=a(i,j); end
end
end %tampilkan matriks c
for i=1:m disp(c);
c(i,n+1)=b(i);
end for j=1:n
%proses eliminasi disp(sprintf('x %d=%.10f',j,c(j,n+1)));
for k=1:m end
p=c(k,k);
for j=k:(n+1)
c(k,j)=c(k,j)/p;
end
for i=k+1:m
p=c(i,k);
for j=k:n+1
c(i,j)=c(i,j)-c(k,j)*p;
end
end
end
d. Tugas
1. Analisa Pseudocode 5!
2. Buat program (berdasarkan Pseudocode 5), atau modifikasi Kode program 11,
untuk mencari x1, x2, x3,..,x10 problem matriks Gambar 4.3 dengan metode
eliminasi Gauss-Jordan! Bandingkan dengan hasil perhitungan x1, x2, x3,..,x10
secara analitis!
3. Buatlah pseudocode dan kode program untuk menyelesaikan problem matriks
Gambar 4.3 dengan metode decomposisi LU! Bandingkan hasilnya dengan
hasil implementasi Kode Program 11 di atas!
PRACTICE V
TRENDLINE
Teori
Metode yang dapat digunakan untuk mengenerate fungsi dari suatu deret data
adalah metode iterasi Jacoby dan Gauss-Seidel. Metode iterasi ini dapat juga
digunakan untuk menyelesaikan persamaan linier dan merupakan teknik pendekatan
dengan melakukan perulangan substitusi nilai variabel hasil kalkulasi suatu
persamaan ke variabel yang sama pada persamaan lain yang segaris.
Iterasi Jacoby dan Gauss-Seidel memiliki bentuk implementasi yang hampir
sama, hanya saja yang membedakan adalah teknik substitusi yang dilakukan. Pada
iterasi Jacoby obyek variabel yang akan dicari solusinya di kalkulasi terlebih dahulu
dan baru disubstitusi pada iterasi selanjutnya. Sedangkan pada iterasi Gauss-Seidel,
nilai variabel kalkulasi obyek langsung disubstitusikan menjadi nilai variabel yang
sama pada persamaan lain yang segaris.
Untuk berbagai problem matematis, iterasi Gauss-Seidel lebih compatible
dibanding iterasi Jacoby. Begitu juga dengan jumlah iterasi yang diperlukan,
seringkali jumlah iterasi Gauss-Seidel lebih sedikit dibanding Jacoby. Namun
meskipun demikian, untuk keperluan kalkulasi data yang bertautan dalam komputasi
paralel, algoritma iterasi Jacoby lebih mudah diimplementasikan daripada Gauss-
Seidel.
Untuk menggenerate fungsi dari suatu deret data, dapat dimisalkan terlebih
fungsi tersebut sebagai fungsi polinomial (persamaan 9) di mana koefisien-koefisien
a0 sampai an adalah variabel yang akan dicari nilainya dengan pendekatan numerik
(persamaan 10), yang mana indeks k menunjukkan untuk setiap pendekatan nilai ak
menggunakan nilai x yang berbeda pula.
(9)
(10)
Sedangkan nilai error (є) dari metode pendekatan ini disebut dengan RMSE(Root
Mean Square Error) yang dirumuskan:
(11)
Problem
Iterasi Gauss-Seidel di atas berfungsi untuk menghasilkan suatu persamaan
fungsi dari f(x), bagaimanakah nilai error fungsi hasil pendekatannya dibandingkan
dengan fungsi yang sebenarnya?
Project V
a. Tujuan
Menentukan nilai error hasil pendekatan berdasarkan fungsi yang tergenerate.
b. Pseudocode
Pseudocode 6. Alur kode program iterasi Gauss-Seidel
Set m
Inisialisasi f(x) dan x
Inisialisasi n,k
for l=0 to m do
for k=0 to n do
hitung ak (persamaan 10)
end for
end for
hitung RMSE
print f(x)
Dimana m menunjukkan jumlah iterasi, n jumlah orde polinomial perkiraan.
c. Implementasi Kode Program
Dimisalkan terdapat deret data sebagaimana berikut:
x 0 0.5π π 1.5π 2π
f(x) 0 1 0 -1 0
Untuk mengenerate fungsi yang melingkupinya, fungsi f(x) dimisalkan sebagai
persamaan polinomial. Sehingga berdasarkan jumlah data, persamaan polinomial
pemisalannya adalah:
(12)
Implementasi kode programnya:
function pangkat(x:real;n:integer):real;
var kali:real;
begin
kali:=1;
for i:=1 to n do kali:=kali*x;
pangkat:=kali;
end;
begin
m:=1000;n:=4;
x[0]:=0;x[1]:=0.5*Pi;x[2]:=Pi;
x[3]:=1.5*Pi;x[4]:=2*Pi;
f[0]:=0;f[1]:=1;f[2]:=0;f[3]:=-1;f[4]:=0;
for l:=0 to m do
begin
for k:=0 to n do
begin
jum:=0;
for i:=0 to n do
if i<>k then
jum:=jum+a[i]*pangkat(x[k],i);
a[k]:=(f[k]-jum)/pangkat(x[k],k);
end;
end;
e:=0;
for k:=0 to n do
begin
jum:=0;
for i:=0 to n do
jum:=jum+a[i]*pangkat(x[k],i);
e:=e+pangkat((f[k]-jum),2);
end;
e:=sqrt(e/n);
writeln('RMSE = ',e:11:10);
write('f(x) = ');
for k:=0 to n do
begin
write(a[k]:7:6,'*x^',k);
if k<>n then write('+');
end;
end.
Python
import math
m=10
n=4
Pi=22/7
x=[0.0,0.5*Pi,Pi,1.5*Pi,2*Pi]
f=[0.0,1.0,0.0,-1.0,0.0]
a=[]
for k in range(5):
a.append(0.0)
for l in range(m):
for k in range(n):
jum=0
for i in range(n):
if i!=k:
jum+=a[i]*x[k]**i
a[k]=(f[k]-jum)/(x[k]**k)
e=0
for k in range(n):
jum=0
for i in range(n):
jum+=a[i]*x[k]**i
e+=(f[k]-jum)**2
e=math.sqrt(e/n)
print "Error = {:f}".format(e)
print "f(x)=",
i=0
for k in a:
print "{:f}*x^{}".format(k,i),
if i!=n :
print "+",
i+=1
Matlab
m=1000;n=5;
Pi=22/7;
x=[0 (0.5*Pi) Pi (1.5*Pi) (2*Pi)];
f=[0 1 0 -1 0];
a=[0 0 0 0 0];
for l=1:m
for k=1:n
jum=0;
for i=1:n
if i~=k
jum=jum+a(i)*(x(k)^(i-1));
end
a(k)=(f(k)-jum)/((x(k))^(k-1));
end
end
end
e=0; %error
for k=1:n
jum=0;
for i=1:n
jum=jum+a(i)*(x(k)^(i-1));
end
e=e+(f(k)-jum)^2;
end
e=sqrt(e/n);
disp(sprintf('Error = %.10f',e));
disp(sprintf('a = '));
disp(sprintf(' %.10f ',a));
d. Tugas
1. Jalankan Kode program 12, atau buat kode program sendiri sesuai bahasa
pemrograman yang anda kuasai untuk mengenerate fungsi problem di atas,
variasi nilai m dan tunjukkan pengaruhnya terhadap hasil fungsi yang
tergenerate!
2. Buat grafik hubungan x dan f(x) berdasarkan fungsi polinomial yang
tergenerate dari Kode program 12, atau kode program sesuai yang anda
kerjakan, dan buktikan bahwa fungsi f(x) sama dengan sin(x)!
3. Tunjukkan pengaruh/hubungan antara jumlah data dengan jumlah suku
Polinomial yang diambil?
4. Jelaskan apa yang anda ketahui mengenai Trendline! Apa hubungannya
dengan Practice V ini?
5. Cari literatur mengenai iterasi Jacoby dan buatlah pseudocode untuk
memodifikasi Kode program 12 dengan metode iterasi Jacoby!
PRACTICE VI
DIFERENSIASI NUMERIK
Teori
Dalam fisika, penurunan problem diferensiasi numerik dapat menggunakan
metode finite difference. Metode ini terdiri dari metode beda maju (forward
difference), beda mundur (backward difference) dan beda tengah (central difference)
yang persamaan-persamaannya antara lain:
Beda maju
(13)
Beda mundur
(14)
Beda tengah
(16)
Problem
Metode beda maju, beda mundur dan beda tengah memiliki ketepatan yang
cukup tinggi jika fungsi yang akan didiferensiasikan termasuk persamaan linier.
Namun pendekatan akan cukup menyimpang jika fungsinya termasuk fungsi
polinomial orde ≥ 2, bagaimanakah nilai error dari pendekatan suatu persamaan
diferensiasi yang fungsinya termasuk fungsi polinomial orde ≥ 2?
Project VI
a. Tujuan
Menentukan nilai error dari masing-masing metode differensiasi numerik yang
berbeda.
b. Pseudocode
Pseudocode 7. Alur kode program perbandingan pendekatan beda maju, mundur dan tengah.
set x
Set f(x)i, i=0..n
for i=1 to n do
bd(x)i=[f(x)i- f(x)i-1]/∆x ---> backward difference
end for
for i=0 to n-1 do
fd(x)i=[f(x)i+1- f(x)i]/∆x ---> forward difference
end for
for i=1 to n-1 do
cd(x)i=[f(x)i+1- f(x)i-1]/2∆x ---> central difference
end for
plot bd(x)i, fd(x)i, cd(x)i, i=0..n
Di mana n jumlah data.
c. Implementasi Kode Program
Dimisalkan terdapat deret data hasil pengamatan gerak bola kasti dalam t,
sumbu x dan sumbu y dengan ∆t=0.05 s adalah sebagai berikut:
t (s) 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45
x (m) 0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90
y (m) 0.00 2.49 4.90 7.16 9.20 10.94 12.30 13.21 13.60 13.39
Kode program 13. Pendekatan deferensiasi orde satu dengan beda maju, mundur dan tengah
Pascal
program difference;
uses wincrt;
const n=9;
var dt,t:real;
i:integer;
f,bd,fd,cd:array[0..n] of real;
fp:text;
begin
assign(fp,'data.txt');
rewrite(fp);
dt:=0.05;
f[0]:=0;f[1]:=2.49;f[2]:=4.9;
f[3]:=7.16;f[4]:=9.2;f[5]:=10.94;
f[6]:=12.3;f[7]:=13.21;f[8]:=13.6;
f[9]:=13.39;
{inisialisasi awal}
for i:=0 to n do
begin
bd[i]:=f[i];fd[i]:=f[i];cd[i]:=f[i];
end;
{Backward difference}
for i:=1 to n do
bd[i]:=(f[i]-f[i-1])/dt;
{Forward difference}
for i:=0 to n-1 do
fd[i]:=(f[i+1]-f[i])/dt;
{Central difference}
for i:=1 to n-1 do
cd[i]:=(f[i+1]-f[i-1])/(2*dt);
t:=0;
writeln(fp,'t ':3,'BD':10,'FD':10,'CD':10);
for i:=0 to n do
begin
writeln(fp,t:4:2,' ',bd[i]:10:7,' ',fd[i]:10:7,' ',cd[i]:10:7);
t:=t+dt;
end;
close(fp);
write('Done..')
end.
Python
fp=open("data.txt","w");
n,dt=9,0.05
f=[0.0,2.49,4.9,7.16,9.2,10.94,12.3,13.21,13.6,13.39]
bd,fd,cd=[],[],[]
#inisialisasi awal
for i in f:
bd.append(i),fd.append(i),cd.append(i)
#backward difference
for i in range(1,n+1):
bd[i]=(f[i]-f[i-1])/dt
#forward difference
for i in range(n):
fd[i]=(f[i+1]-f[i])/dt
#central difference
for i in range(1,n):
cd[i]=(f[i+1]-f[i-1])/(2*dt)
t=0.0
fp.write(" {:10} {:10} {:10} {:10}\n".format("t","BD","FD","CD"))
for i in range(n+1):
fp.write("{:9f} {:9f} {:9f} {:9f}\n".format(t,bd[i],fd[i],cd[i]))
t+=dt
fp.close()
print "Done.."
Matlab
fp=fopen('data.txt','w');
n=10;dt=0.05;
f=[0 2.49 4.9 7.16 9.2 10.94 12.3 13.21 13.6 13.39];
bd=[];fd=[];cd=[];
%inisialisasi awal
bd=f;fd=f;cd=f;
%backward difference
for i=2:n
bd(i)=(f(i)-f(i-1))/dt;
end
%forward difference
for i=1:n-1
fd(i)=(f(i+1)-f(i))/dt;
end
%central difference
for i=2:n-1
cd(i)=(f(i+1)-f(i-1))/(2*dt);
end
t=0;
fprintf(fp,'t BD FD CD\n');
for i=1:n
fprintf(fp,'%0.2f %2.7f %2.7f %2.7f\n',t,bd(i),fd(i),cd(i));
t=t+dt;
end
fclose(fp);
disp('Done..');
d. Tugas
1. Jalankan Kode program 13, atau buat kode program sesuai dengan kode
program yang anda kuasai berdasarkan Pseudocode 7 untuk mendapatkan
data-data seperti yang terdapat pada file “data.txt”!
2. Hitung secara analitik kecepatan arah sumbu y (vy) pada t=0.0, 0.05, 0.10,
0.15,.., 0.90!
3. Plot “data txt” dan bandingkan nilai kecepatan hasil pendekatan metode beda
maju, mundur dan tengah, manakah hasilnya yang sesuai dengan perhitungan
analitik?
4. Buatlah kode program (atau sesuai bahasa pemrogramanan yang anda
kuasai) untuk menghitung percepatan arah y (menggunakan persamaan 16)!
Buktikan percepatan tersebut adalah percepatan gravitasi!
PRACTICE VII
INTEGRASI NUMERIK
Teori
Selain bentuk diferensiasi, problem matematik yang sering ditemui dalam
fisika adalah problem integrasi. Untuk pendekatan secara numerik terdapat berbagai
metode seperti metode kotak, trapesium, Simpson dan Newton-Cotes. Namun di sini
akan dipelajari integrasi numerik dengan mengkhususkan pada metode trapesium.
Secara umum integrasi dapat merupakan luasan yang berada di bawah fungsi.
Oleh karena itu dengan metode trapesium dapat diilustrasikan ide integrasi
numeriknya sebagaimana Gambar 7.1.
, f(x)<f(x+∆x) (17)
Problem
Teknik untuk memperkecil nilai error untuk metode trapesium adalah dengan
memperkecil ∆x, semakin kecil ∆x, nilai error yang diharapkan akan semakin kecil.
Dalam matematik, untuk menghitung luas suatu lingkaran dan karena lingkaran
mempunyai jumlah sisi tak terhingga, nilai π hanya dapat dicari dengan pendekatan
numerik. Bagaimanakah pengaruh variasi ∆x terhadap nilai π?
Project VII
a. Tujuan
Menggunakan integrasi numerik untuk memprediksi nilai suatu konstanta.
b. Pseudocode
Pseudocode 8. Alur kode program metode trapesium
Set a,b,n
dx=(b-a)/n
x=a
f1=f(x)
sum=0
while x<=b do
x=x+dx
f2=f(x)
sum=sum+0.5dx(f1+f2)
f1=f2
end while
print sum
di mana n jumlah trapesium, semakin banyak jumlah trapesium semakin kecil ∆x-
nya
c. Implementasi Kode Program
Kode program 14. Integrasi numerik dengan metode trapesium
Pascal
program nilaiPi;
uses wincrt;
var a,b,x,dx,sum,r,f1,f2:real;
i,n:integer;
function y(r:real;x:real):real;
begin
y:=sqrt(r*r-x*x);
end;
begin
r:=5;b:=r;a:=0;
n:=90;
dx:=(b-a)/n;
x:=a;
f1:=y(r,x);
sum:=0;
for i:=1 to n do
begin
x:=x+dx;
f2:=y(r,x);
sum:=sum+0.5*dx*(f1+f2);
f1:=f2;
end;
writeln('n = ',n);
writeln('dx = ',dx:7:6);
writeln('Luas O = ',(4*sum):7:6);
writeln('Pi = ',((4*sum)/(r*r)):7:6);
end.
Python
import math
def y(r,x):
return (math.sqrt(r*r-x*x))
r,n=5.0,1500
a,b=0.0,r
dx=(b-a)/n
x,jum=a,0
f1=y(r,x)
for i in range(1,n+1):
x+=dx
f2=y(r,x)
jum+=0.5*dx*(f1+f2)
f1=f2
print "n = ",n
print "dx = ",dx
print "Luas O = ",(4*jum)
print "Pi = ",((4*jum)/(r*r))
Matlab
y=@(r,x)(sqrt(r*r-x*x));
r=5.0;n=1500;
a=0;b=r;
dx=(b-a)/n;
x=a;jum=0;
f1=y(r,x);
for i=1:n+1
x=x+dx;
f2=y(r,x);
jum=jum+0.5*dx*(f1+f2);
f1=f2;
end
disp(sprintf('n = %d',n));
disp(sprintf('dx = %.7f',dx));
disp(sprintf('Luas O = %.7f',(4*jum)));
disp(sprintf('Pi = %.7f',(4*jum)/(r*r)));
d. Tugas
1. Jalankan Kode program 14, atau buatlah kode program sendiri sesuai bahasa
pemrograman yang anda kuasai berdasarkan Pseudocode 8 yang di
modifikasi, untuk mendekati nilai π! Berapakah nilai π hasil pendekatan?
2. Analisa variasi ∆x terhadap pendekatan nilai π berdasarkan Kode program 14
atau berdasarkan kode program yang anda buat! Bandingkan dengan nilai π
dari literatur lain (mis. π = 3.142857142857143)?
6. Gunakan metode numerik lain selain metode trapesium untuk mendekati nilai
π! Bandingkan hasilnya?
PRACTICE VIII
INTERPOLASI
Teori
Secara garis besar, interpolasi adalah memprediksi nilai suatu titik berdasarkan
titik-titik terdekat yang sudah ada/diketahui nilainya. Salah satu contoh metode
interpolasi yang mudah adalah metode interpolasi bilinier, dimana idenya adalah
mengambil nilai pendekatan berdasarkan asumsi persamaan gradien terhadap 4 titik
terdekat yang sudah diketahui nilainya. Dengan syarat keempat titik tersebut berada
membentuk persegi dan nilai titik yang didekati berada dalam 4 titik tersebut.
Ilustrasi keberadaan titik tersebut sebagaimana Gambar 8.1.
u3 u4
y2
u(x,y)
y
u1 u2
y1
x1 x x2
Gambar 8.1 Posisi titik obyek pada interpolasi bilinier
Persamaan interpolasi bilinier untuk mendekati nilai u di atas adalah
sebagaimana persamaan 18.
] (18)
Project VIII
a. Tujuan
Menggunakan Interpolasi untuk mendekati suatu nilai berdasarkan dua sumbu
koordinat x dan y.
b. Tugas
Salah satu bentuk implementasi interpolasi Bilinier adalah digunakan untuk
mendekati nilai kecepatan suatu fluida pada suatu titik x dan y berdasarkan 4 titik
yang telah diketahui. Dimisalkan keempat titik tersebut adalah sebagaimana tabel
berikut:
x y u(x,y)
1 1 2.75
5 1 3.4
1 3 -1.0
5 3 2.2
2. Hampir sama dengan soal no. 1, simulasikan gerak bandul sederhana dalam
grafik hubungan x (simpangan) dan t (waktu) dengan syarat gesekan udara
diabaikan! (6)
(2)
PUSTAKA
Landau R., et al. Computational Physics.. Problem Solving With Computers (Wiley,
1997)
Kincaid D., Cheney W. Numerical analysis (1991)
Conte, de Boor. Elementary numerical analysis, algorithmic approach
Anonymous. 2010. Interpolasi Bilinier. http://wikipedia.org.