Mirza Nur Hidayat
Fisika Komputasi dengan C++ dan gnuplot (sebuah catatan kecil)
Laboratorium Fisika Gedung C Lt. 2 Ka...
124 downloads
1710 Views
353KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Mirza Nur Hidayat
Fisika Komputasi dengan C++ dan gnuplot (sebuah catatan kecil)
Laboratorium Fisika Gedung C Lt. 2 Kampus FKIP Universitas Muhammadiyah Prof. DR. HAMKA Jakarta
Ramadhan 1436 / Juni 2015
Bismillahirrahmanirrahim
CONTENTS 1
pendahuluan
3
i pengantar c++ 5 2 dasar-dasar c++ 7 2.1 Text Editor 7 2.2 C++ Interpreter/Compiler 7 2.3 Hello World! 8 2.3.1 "Hello World!" dalam Linux 8 2.3.2 "Hello World!" dalam Windows 9 2.4 Variabel dan Tipe Data 9 2.5 Konstanta 10 2.6 Input dan Output Dasar 10 2.7 Kondisional If 11 2.8 Pengulangan For 12 2.9 Pengulangan While 13 2.10 Fungsi 15 2.11 Menulis File 16 2.11.1 Menulis File dalam Linux 16 2.11.2 Menulis File dalam Windows 17 3 dasar-dasar kalkulus dalam c++ 19 3.1 Fungsi Trigonometri 19 3.2 Pangkat 20 3.3 Logaritma 22 3.3.1 Logaritma Natural 22 3.3.2 Logaritma dengan Basis a 22 3.4 Bilangan Kompleks 23 ii pengantar gnuplot 25 4 gnuplot 27 4.1 Analisis Grafis 27 4.2 gnuplot 29 4.3 Instalasi gnuplot 30 4.3.1 Instalasi gnuplot di Linux
30
1
Contents
4.4
4.3.2 Instalasi gnuplot di Windows Plot dengan gnuplot 31 4.4.1 Plot dari File 33
iii pengantar metode numerik 35 5 diferensiasi numerik 37 5.1 Forward Difference 37 5.2 Central Difference 39 5.3 Diferensiasi Orde Dua 40 6 integrasi numerik 43 6.1 Metode Trapezoid 43 6.2 Metode Midpoint 47 6.3 Metode Simpson 51 7 penyelesaian persamaan nonlinier
2
31
53
1 PENDAHULUAN
Ini merupakan sebuah catatan kecil tentang fisika komputasi dengan menggunakan bahasa pemrograman C++ dan gnuplot. Tulisan ini dibuat dengan sasaran pembaca yaitu mahasiswa program studi pendidikan fisika atau fisika tingkat dasar. Tidak ada syarat atau bekal bacaan khusus dalam membaca tulisan ini. Namun demikian, bekal pengantar kalkulus akan lebih mempermudah dalam mempelajari tulisan ini. Secara ringkas, tulisan terdiri atas 3 (tiga) bagian, yaitu pengantar C++, pengantar gnuplot, dan pengantar metode numerik. Bagian pertama membahas tentang dasar-dasar C++. Topiktopik yang dibahas adalah text editor dan C++ interpreter/ compiler, Hello World!, struktur program, tipe data, konstanta, variabel, input dan output dasar, kondisional if, pengulangan for dan while, fungsi, serta menulis data ke file. Selain dasar-dasar C++, bagian pertama juga menyinggung fungsi trigonometri, pangkat, logaritma, dan bilangan kompleks dalam C++. Berikutnya, di bagian kedua dibahas analisis grafis, pengantar gnuplot, instalasi gnuplot, serta plot sederhana dengan gnuplot. Bagian terakhir, bagian ketiga, berisikan pengantar metode numerik. Ada tiga bahasan dalam bagian ketiga ini, yaitu diferensiasi numerik, integrasi numerik, dan penyelesaian persamaan nonlinier. Sistem operasi komputer yang penulis gunakan dalam proses penulisan catatan ini adalah Linux (Debian 7.0). Debian dapat diperoleh dari laman https://www.debian.org. Selain sifatnya yang gratis dan terbuka (free and open), sudah menjadi hal yang lazim bahwa Linux adalah sistem operasi yang sering digunakan oleh banyak universitas dan lembaga riset untuk tujuan pendidi-
3
pendahuluan
kan dan penelitian. Namun demikian, penulis juga menyajikan tulisan ini dalam sistem operasi Windows. Praktis, catatan ini ditulis berdasarkan pengalaman penulis dalam menggunakan C++ dan gnuplot untuk fisika komputasi, baik semenjak masih di bangku kuliah maupun saat mengajar di kampus, serta didasarkan pada beberapa referensi yang penulis gunakan dalam tulisan ini. Last but not the least, catatan ini dapat digunakan dan disebarluaskan secara bebas untuk tujuan pendidikan dan pembelajaran.
Jakarta, Ramadhan 1436 / Juni 2015 –Mirza
4
Part I P E N G A N TA R C + +
2 DASAR-DASAR C++
Dalam sains, dari sejarahnya, FORTRAN adalah bahasa pemrograman yang paling banyak digunakan. Namun demikian, seiring berjalannya waktu, disamping bahasa C, C++ telah menjadi salah satu bahasa pemrograman yang sering digunakan untuk proses komputasi. Pada bab ini, akan disajikan pembahasan secara ringkas tentang bahasa C++, diantaranya yaitu text editor; C++ interpreter/ compiler; Hello World!; variabel dan tipe data; konstanta; input dan output dasar; kondisional if; pengulangan for dan while; fungsi; serta menulis data ke file. 2.1
text editor
Text editor merupakan aplikasi yang digunakan sebagai tempat untuk mengetik kode program. Dalam Linux, salah satu contoh text editor adalah gedit Text Editor. Sedangkan dalam Windows, contoh text editor adalah Notepad atau Notepad++. Notepad++ dapat diperoleh dari laman https://notepad-plus-plus.org. 2.2
c++ interpreter/compiler
Dalam catatan ini, penulis menggunakan GNU C++ compiler sebagai C++ compiler. Dalam Linux, compiler ini dapat diinstal dengan cara yaitu buka aplikasi Terminal, kemudian ketik perintah:
sudo apt-get install g++ Hasil instalasi tersebut dapat dilihat dengan mengetik:
g++ --version
7
dasar-dasar c++
Untuk Windows, penulis menggunakan cint C/C++ interpreter (cint-5.16.19). Cara memperoleh dan menggunakan interpreter ini adalah sebagai berikut: - buka laman https://root.cern.ch/drupal/content/cint - unduh cint-5.16.19-win32.tar.gz - ekstrak file di atas - dari folder cint-5.16.19, dobel klik cint.exe. 2.3
hello world!
Sudah menjadi hal yang lazim bahwa hal yang pertama kali dilakukan dalam dunia pemrograman adalah bagaimana menulis kalimat "Hello World!". 2.3.1
"Hello World!" dalam Linux
Cara yang dilakukan adalah di jendela gedit Text Editor diketik kode program sebagai berikut (Contoh 2.1).
#include using namespace std; int main(){ cout << "Hello World!" << endl; }
return 0;
Simpan kode program di atas, misal dengan nama hello.cpp dengan lokasi di /home/<username>/Documents/. Sebagai contoh, dalam komputer penulis, <username> adalah mirza, maka lokasi file tersebut adalah /home/mirza/Documents/hello.cpp. Kemudian buka Terminal, ketik perintah seperti berikut:
mirza@mirza:~\$ cd Documents mirza@mirza:~/Documents\$ g++ hello.cpp -o hello mirza@mirza:~/Documents\$ ./hello Hello World! mirza@mirza:~/Documents\$
8
2.4 variabel dan tipe data
2.3.2
"Hello World!" dalam Windows
Buka aplikasi Notepad atau Notepad++, kemudian ketik kode program seperti Contoh 2.1. Simpan kode tersebut, misal dengan nama hello.cpp, di lokasi C:\hello.cpp. Buka interpreter cint.exe, ketik perintah:
cint.exe> cint C:\hello.cpp Hello World! cint.exe> 2.4
variabel dan tipe data
Sebagai contoh, akan dibuat sebuah program sederhana untuk menghitung gaya F, dengan massa m = 10kg dan percepatan a = 2ms−2 . Kode programnya adalah (Contoh 2.2):
#include using namespace std; int main(){ int m, a, F; m = 10; a = 2; F = m * a ; cout << F << endl; }
return 0;
Hasil dari kode program di atas adalah 20. Dalam kode di atas, terdapat 3 variabel, yaitu variabel m, a, dan F, dengan tipe data integer. Selain integer, ada jenis tipe data yang lain, diantaranya yaitu float, double, bool, dan yang lain.
9
dasar-dasar c++
2.5
konstanta
Untuk mendefinisikan sebuah konstanta, dapat dilakukan dengan cara sebagai berikut. Sebagai contoh, suatu benda bermassa m = 2kg berada pada ketinggian h = 5m. Dengan kostanta percepatan gravitasi g = 9, 8ms−2 . Tentukan energi potensial Ep benda tersebut (Contoh 2.3). Komputasi dari contoh soal di atas adalah
#include using namespace std; #define g 9.8 int main(){ double Ep, m, h; m = 2; h = 5; Ep = m * g * h; cout << Ep << endl; }
return 0;
Hasil dari kode program di atas adalah 98. 2.6
input dan output dasar
Akan dibuat sebuah program sederhana untuk menghitung gaya F seperti pada Contoh 2.2. Tetapi, program mampu menghitung besar gaya F dari masukan sembarang nilai massa m dan percepatan a. Kode programnya adalah (Contoh 2.4):
#include using namespace std;
10
2.7 kondisional if
int main(){ int m, a, F; cout << "Masukkan nilai massa m = " << endl; cin >> m; cout << "Masukkan nilai percepatan a = " << endl; cin >> a; F = m * a ; cout << "Besar gaya F = " << cout << F << endl; }
endl;
return 0;
Anggap nilai massa m yang akan dimasukkan ke dalam program adalah 5, dan nilai percepatan a = 3, maka hasil yang didapat adalah:
Masukkan nilai massa m = 5 Masukkan nilai percepatan a = 3 Besar gaya F = 15 2.7
kondisional if
Akan dibuat sebuah program sederhana. Program mampu menerima sembarang nilai masukan x. Jika x ≥ 5 maka program akan mengeluarkan hasil HIGH. Jika 2, 5 ≤ x < 5 maka hasil program adalah FLOAT. Dan jika x < 2, 5 maka hasil program adalah LOW. Kode program untuk contoh tersebut adalah (Contoh 2.5):
#include using namespace std;
11
dasar-dasar c++
int main(){ int x; cout << "Masukkan nilai x = "; cin >> x; if (x >= 5) cout << "HIGH"; else if (x >= 2.5) cout << "FLOAT"; else cout << "LOW"; } 2.8
return 0;
pengulangan for
Perhatikan Contoh 2.6 berikut.
#include using namespace std; int main(){ int i; for(i = 1; i <= 5; i = i + 1){ cout << i << endl; } }
return 0;
Hasil dari program di atas adalah:
1 2
12
2.9 pengulangan while
3 4 5 Perhatikan juga Contoh 2.7 berikut.
#include using namespace std; int main(){ int i, j; for(i = 1; i <= 5; i = i + 2){ j = 2 * i; cout << i << " " << j << endl; } return 0;
}
Hasil dari program di atas adalah:
1 2 3 6 5 10 Dari kedua contoh di atas, apakah pengulangan for itu? 2.9
pengulangan while
Perhatikan Contoh 2.8 berikut.
#include using namespace std; int main(){ int i; i = 5;
13
dasar-dasar c++
while(i <= 10){ i++; cout << i << endl; } }
return 0;
Hasil dari program di atas adalah:
6 7 8 9 10 11 Contoh 2.9: Waktu paruh suatu unsur X adalah 1 hari. Jika unsur X mula-mula seberat 2g, berapa waktu yang dibutuhkan agar unsur X tinggal menjadi 0,125g?
#include using namespace std; int main(){ float n, t; n = 2; t = 0; while(n > 0.125){ n = 0.5 * n; t++; } cout << t << endl; }
14
return 0;
2.10 fungsi
Hasil dari komputasi di atas adalah 4. Hasil ini berarti unsur X tinggal menjadi 0,125g setelah 4 hari. Dari kedua contoh di atas, apakah pengulangan while itu? 2.10
fungsi
Contoh membuat sebuah fungsi dengan menggunakan bahasa C++ adalah sebagai berikut. Akan dibuat fungsi perkalian dari dua buah bilangan a dan b, kode programnya yaitu (Contoh 2.10):
#include using namespace std; int perkalian(int a, int b){ int c; c = a * b; }
return c;
int main(){ int f; f = perkalian(5, 3); cout << f << endl; }
return 0;
Maksud dari kode program di atas adalah dibuat sebuah fungsi, yaitu fungsi perkalian, fungsi ini mengkalikan dua bilangan a dan b. Fungsi ini dapat dipanggil. Dari contoh, fungsi perkalian dipanggil dan digunakan untuk mengalikan angka 5 dan 3. Yang mana, jika kode program di atas dijalankan akan memberi hasil 15.
15
dasar-dasar c++
2.11
menulis file
Pada sub bab-sub bab sebelumnya terlihat bahwa hasil atau output dari program adalah ditampilkan dalam layar console. Setiap kali program dijalankan, terlihat hasil di console. Pada sub bab ini akan dibahas bagaimana hasil tersebut disimpan dalam komputer dalam bentuk file. File tersebut nantinya akan berguna bagi proses komputasi berikutnya, misal sebagai data dalam analisis grafis (graphical analysis) dengan menggunakan gnuplot. 2.11.1
Menulis File dalam Linux
Berikut adalah contoh bagaimana menulis file dalam Linux. Diasumsikan bahwa hasil atau output program akan disimpan di lokasi /home/mirza/Documents dengan nama file data.txt (Contoh 2.11).
#include #include using namespace std; int main(){ ofstream mydata; mydata.open ("/home/mirza/Documents/data.txt"); int i, j; for (i = 1; i <= 5; i++){ j = 2 * i; mydata << i << " " << j << endl; } mydata.close(); }
16
return 0;
2.11 menulis file
Program di atas jika dijalankan akan menghasilkan output berupa file dengan nama data.txt, yang mana isi dari data.txt adalah
1 2 3 4 5
2 4 6 8 10
2.11.2
Menulis File dalam Windows
Sedangkan untuk Windows, berikut adalah caranya. Diasumsikan bahwa output program akan disimpan di D:\ dengan nama file data.txt (Contoh 2.12).
#include #include using namespace std; int main(){ ofstream mydata; mydata.open ("D:\\data.txt"); int i, j; for (i = 1; i <= 5; i++){ j = 2 * i; mydata << i << " " << j << endl; } mydata.close(); }
return 0;
17
3 DASAR-DASAR KALKULUS DALAM C++
Ada beberapa topik dalam kalkulus yang akan dibahas dalam tulisan ini, diantaranya yaitu fungsi trigonometri, pangkat, logaritma, dan bilangan kompleks. 3.1
fungsi trigonometri
Persamaan gelombang atau persamaan keadaan, adalah satu dari sekian banyak persamaan dalam fisika yang memanfaatkan fungsi trigonometri. Berikut akan disajikan contoh sederhana bagaimana membuat fungsi trigonometri dalam bahasa C++. Perhatikan Contoh 3.1 berikut.
#include #include <math.h> using namespace std; int main(){ float x, y; x = 3.1415 / 2; y = sin (x); cout << y << endl; }
return 0;
19
dasar-dasar kalkulus dalam c++
Maksud dari kode program tersebut adalah ada sebuah fungsi trigonometri, yaitu y = sin( x ), dan akan dicari nilai y pada saat x = π/2. Program tersebut memberi hasil output 1. Perhatikan juga Contoh 3.2 berikut. Sebuah fungsi gelombang sederhana Ψ(t) = Ψ0 sin(2πνt + φ), dengan Ψ0 = 1, ν = 1/2, φ = π/2, dan 0 ≤ t ≤ 2. Buatlah kode program untuk menentukan nilai Ψ sebagai fungsi t. Jawab:
#include #include <math.h> using namespace std; int main(){ float Psi, Psi0, pi, nu, t, phi; Psi0 = 1.0; pi = 3.1415; nu = 0.5; phi = pi / 2; for(t = 0; t <= 2.0; t = t + 0.1){ Psi = Psi0 * sin(2 * pi * nu * t + phi); cout << t << " " << Psi << endl; } } 3.2
return 0;
pangkat
Diberikan sebuah persamaan sederhana y = x3 . Tentukan y pada x = 2. Dengan cepat, nilai y = 23 = 8. Dalam C++, soal tersebut dapat diselesaikan dengan kode program seperti pada Contoh 3.3 berikut.
#include #include <math.h> using namespace std;
20
3.2 pangkat
int main(){ int x, y; x = 2; y = pow(x, 3); cout << y << endl; }
return 0;
Bagaimakah jika fungsinya y = e x , dengan sembarang nilai x? Soal ini dapat diselesaikan dengan kode program berikut (Contoh 3.4).
#include #include <math.h> using namespace std; #define e 2.7182818 int main(){ float x, y; cout << "Masukkan x = " << endl; cin >> x; y = pow(e, x); cout << "y = " << y << endl; }
return 0;
21
dasar-dasar kalkulus dalam c++
3.3
logaritma
3.3.1
Logaritma Natural
Logaritma natural dapat dituliskan sebagai y = ln x. Sebagai contoh adalah y = ln e, dalam C++, kode program persamaan tersebut adalah (Contoh 3.5).
#include #include <math.h> using namespace std; #define e 2.7182818 int main(){ float y; y = log (e); cout << y << endl; }
return 0;
3.3.2
Logaritma dengan Basis a
Logaritma dengan basis a dapat didefinisikan sebagai y = loga x. Contoh, y = log2 8, maka y = 3. Dalam C++, kode programnya adalah (Contoh 3.6).
#include #include <math.h> using namespace std; int main(){ float a, x, y; a = 2; x = 8;
22
3.4 bilangan kompleks
y = log (x) / log (a); cout << y << endl; return 0;
}
Hasil dari kode di atas adalah 3. 3.4
bilangan kompleks
Dalam fisika, terutama dalam fisika atau mekanika kuantum, bilangan kompleks dapat dikatakan sebagai hal yang wajib diketahui. Bagaimanakah bilangan kompleks dalam C++? Berikut akan disajikan pembahasan ringkasnya. Bilangan kompleks a = 2 + 3i dalam C++ ditulis sebagai (Contoh 3.7).
#include #include #include using namespace std; int main(){ complex a(2, 3); cout << a << endl; }
return 0;
Berikutnya, b = 1 + i, maka a + b = (2 + 3i ) + (1 + i ) = 3 + 4i. Contoh ini, dalam C++ ditulis sebagai (Contoh 3.8).
#include #include #include using namespace std;
23
dasar-dasar kalkulus dalam c++
int main(){ complex a(2, 3), b(1, 1); cout << a + b << endl; }
return 0;
Hasil dari kode di atas adalah (3,4). Maksud dari hasil ini adalah 3 + 4i. Berikutnya, b2 = (1 + i ) × (1 + i ) = 2i. Dalam C++, kode programnya adalah (Contoh 3.9).
#include #include #include using namespace std; int main(){ complex b(1, 1); cout << b * b << endl; }
return 0;
Hasil dari kode di atas adalah (0,2). Maksud dari hasil ini adalah 2i.
24
Part II P E N G A N TA R G N U P L O T
4 GNUPLOT
Ini merupakan bagian kedua dari catatan kecil fisika komputasi dengan C++ dan gnuplot. Di bagian kedua ini, akan didiskusikan secara ringkas bahasan tentang analisis grafis (graphical analysis), gnuplot, instalasi gnuplot, dan plot dengan gnuplot. 4.1
analisis grafis
Selembar kertas berbentuk persegi dengan sisi 10cm × 10cm akan dibentuk menjadi sebuah bangun ruang (kotak) dengan atap terbuka. Caranya yaitu dengan digunting keempat ujung kertas sebesar xcm, kemudian dilipat sedemikian rupa sehingga terbentuk sebuah kotak seperti dalam Gambar 4.1 berikut. Tentukan nilai x sehingga diperoleh volume kotak yang optimum.
Gambar 4.1 Sebuah kotak yang dibentuk dari selembar kertas dengan ukuran 10cm × 10cm. Kotak dengan dimensi panjang p = 10 − 2x, lebar l = 10 − 2x, dan tinggi t = x. Akan dicari volume optimum dari kotak tersebut.
27
gnuplot
Cara sederhana dari jawaban soal di atas adalah dengan mencari persamaan atau rumus volume dari kotak tersebut, yaitu volume V = (10 − 2x ) × (10 − 2x ) × ( x ) = 4x3 − 40x2 + 100x dengan syarat batas 0 ≤ x ≤ 5. Berikutnya, masukkan nilai xi (misal xi = 0, 0, 2, 0, 4, 0, 6, . . . , 5) untuk mendapatkan Vi . Hasil ini dapat dilihat dalam Tabel I berikut. Tabel I Volume kotak Vi sebagai fungsi xi xi Vi 0 0 0.2 18.432 0.4 33.856 0.6 46.464 0.8 56.448 1 64 1.2 69.312 1.4 72.576 1.6 73.984 1.8 73.728 2 72 2.2 68.992 2.4 64.896 2.6 59.904 2.8 54.208 3 48 3.2 41.472 3.4 34.816 3.6 28.224 3.8 21.888 4 16 4.2 10.752 4.4 6.336 4.6 2.944 4.8 0.768 5 0
Dari Tabel I terlihat bahwa volume optimum berada di sekitar nilai 73. Sedangkan untuk mendapatkan nilai eksak, perlu diperkecil kenaikan xi -nya. Dalam fisika, juga matematika dan sains, data hasil analisis teoritis, eksperimen, atau hasil modeling-simulasi, dapat dibuat
28
4.2 gnuplot
dalam berbagai bentuk. Dari contoh di atas, data dibuat dalam bentuk tabel. Dengan memperhatikan satu per satu nilai xi dan Vi dari tabel, diketahuilah nilai volume optimum. Selain tabel, ada bentuk lain, yaitu grafik. Data di atas jika diplot akan memberikan hasil seperti pada Gambar 4.2.
Gambar 4.2 Grafik volume kotak V sebagai fungsi x.
Dari Gambar 4.2 terlihat pola perubahan volume kotak V sebagai fungsi x. Dengan melihat sekilas gambar di atas, dapat diketahui volume optimum dari kotak. Secara sederhana, inilah yang disebut sebagai analisis grafis (graphical analysis). 4.2
gnuplot
Ada banyak software yang dapat digunakan sebagai piranti untuk membuat sebuah grafik. Sebagai contoh adalah gnuplot. Dalam dunia fisika, juga dalam dunia sains, gnuplot merupakan salah satu software yang paling banyak digunakan, bahkan secara "de facto" digunakan sebagai standar plot grafik. Gnuplot adalah piranti pembuat grafik dengan model barisperintah (command-line). Gnuplot dapat dijalankan di berbagai platform sistem operasi, baik Linux, Mac OS X, Windows, maupun yang lain. Sifat dari software ini adalah gratis (free). Gnuplot dapat diperoleh dari laman http://gnuplot.info.
29
gnuplot
Gnuplot mendukung berbagai tipe plot, baik 2D maupun 3D. Bentuk plot dalam gnuplot dapat berupa garis, titik, kotak, kontur, medan vektor, atau permukaan (surface). Hasil (output) gnuplot dapat dibuat ke dalam berbagai format, baik eps, emf, fig, jpeg, png, dan yang lain. 4.3
instalasi gnuplot
Telah disinggung di sub sebelumnya bahwa gnuplot dapat dijalankan di berbagai platform, baik Linux, Mac OS X, Windows, maupun yang lain. Di sub bab ini, akan dibahas bagaimana instalasi gnuplot di sistem operasi Linux dan Windows. 4.3.1
Instalasi gnuplot di Linux
Instalasi gnuplot di Linux cukup mudah. Buka Terminal, kemudian ketik perintah:
sudo apt-get install gnuplot Untuk membuka aplikasi gnuplot, di Terminal cukup diketik:
gnuplot
Gambar 4.3 Tampilan jendela gnuplot di Linux (Debian 7.0)
30
4.4 plot dengan gnuplot
Gambar 4.3 di atas adalah tampilan gnuplot di Linux. Untuk memulai bekerja dengan gnuplot, kode perintah diketik di:
gnuplot> 4.3.2
Instalasi gnuplot di Windows
Untuk instalasi gnuplot di komputer dengan sistem operasi Windows, terlebih dahulu unduh installer gnuplot. Installer ini dapat diperoleh dari laman http://gnuplot.info/download.html. Setelah mendapat file installer gnuplot, misal gnuplot versi 4.6 (dengan nama gp466-win32-setup.exe), dobel klik dan instal seperti proses instalasi aplikasi-aplikasi lain di Windows. Gambar 4.4 berikut adalah tampilan gnuplot di Windows.
Gambar 4.4 Tampilan jendela gnuplot di Windows (Windows 8.1)
4.4
plot dengan gnuplot
Di sub bab ini akan diuraikan secara ringkas bagaimana membuat grafik sederhana dalam gnuplot. Perhatikan kode perintah berikut.
gnuplot> plot x
31
gnuplot
Maksud dari perintah di atas adalah akan dibuat grafik fungsi y = x, dan hasilnya ditunjukkan dalam Gambar 4.5.
Gambar 4.5 Grafik fungsi y = x. Perhatikan nilai x-nya. Secara default, nilai x di gnuplot adalah −10 ≤ x ≤ 10.
Perhatikan juga contoh berikut.
gnuplot> plot [0:3] x*x w lp Hasil dari perintah di atas ditunjukkan dalam Gambar 4.6 berikut.
Gambar 4.6 Grafik fungsi y = x2 dengan 0 ≤ x ≤ 3. Bentuk grafik berupa titik-garis. Kode w = with, lp = line-points.
32
4.4 plot dengan gnuplot
Selanjutnya, bagaimanakah cara memberi label pada grafik? Perhatikan contoh berikut.
gnuplot> gnuplot> gnuplot> gnuplot>
set title "Grafik sin x" set xlabel "x" set ylabel "sin x" plot [0:7] sin(x) w lp
Hasil dari perintah di atas ditunjukkan dalam Gambar 4.7 berikut.
Gambar 4.7 Grafik fungsi y = sin x dengan 0 ≤ x ≤ 7. Pada grafik terdapat label judul "Grafik sin x", label sumbu horisontal "x", dan label sumbu verikal "sin x".
4.4.1
Plot dari File
Data yang tersimpan di komputer dalam bentuk file dapat dibuat grafiknya dengan menggunakan gnuplot. Sebagai contoh, di komputer ada file dengan nama mydata.dat. Yang mana, isi dari file tersebut adalah
1 2 3 4 5
2 4 5 8 9
33
gnuplot
Anggap mydata.dat ada di direktori /home/mirza/Documents. Dari file tersebut, akan dibuat grafik, dengan kolom pertama sebagai data sumbu x dan kolom kedua sebagai data sumbu y. Bagaimanakah caranya? Perhatikan langkah berikut. Buka Terminal, kemudian masuk ke direktori /Documents yaitu dengan cara ketik cd Documents. Setelah itu buka aplikasi gnuplot dengan mengetik perintah gnuplot. Langkah berikutnya adalah ketik plot "mydata.dat".
mirza@mirza:~\$ cd Documents mirza@mirza:~/Documents\$ gnuplot G N U P L O T Version ... gnuplot> plot "mydata.dat" Untuk komputer dengan sistem operasi Windows (anggap file mydata.dat berada di direktori D:\), buka aplikasi gnuplot, setelah jendela gnuplot terbuka, ketik perintah cd 'D:\', tekan Enter, lalu ketik plot "mydata.dat".
gnuplot> cd 'D:\' gnuplot> plot "mydata.dat" Baik dengan Linux maupun Windows, plot tersebut menghasilkan grafik seperti pada Gambar 4.8 berikut.
Gambar 4.8 Grafik mydata.dat.
34
Part III P E N G A N TA R M E T O D E N U M E R I K
5 DIFERENSIASI NUMERIK
Ini merupakan bagian terakhir atau bagian ketiga dari catatan kecil fisika komputasi dengan C++ dan gnuplot. Di bagian ini didiskusikan secara ringkas pengantar metode numerik: diferensiasi numerik, integrasi numerik, dan penyelesaian persamaan nonlinier. Diferensiasi numerik dibahas di bab 5. Materi diferensiasi numerik yang didiskusikan adalah forward difference, central difference, dan diferensiasi orde dua. Berikutnya, bab 6 tentang integrasi numerik. Beberapa metode yang dipilih adalah metode Trapezoid, metode Midpoint, serta metode Simpson. Terakhir, bab 7 tentang penyelesaian persamaan nonlinier. 5.1
forward difference
Sebuah fungsi f ( x ) dapat ditulis ke dalam deret Taylor sekitar x + h: f ( x + h) = f ( x ) +
h 0 h2 00 h3 000 f (x) + f (x) + f (x) + . . . 1! 2! 3!
(1)
Dari persamaan (1) di atas, dapat dicari nilai f 0 ( x ), yaitu 1 f (x) = h 0
h2 00 h3 000 f ( x + h) − f ( x ) − f (x) − f (x) − . . . 2! 3!
(2)
Dalam bentuk lain, persamaan (2) di atas dapat ditulis sebagai f ( x + h) − f ( x ) f (x) = − h 0
h 00 h2 000 f (x) + f (x) + . . . 2! 3!
(3)
37
diferensiasi numerik
Sehingga didapatkan pendekatan f 0 (x) ≈
f ( x + h) − f ( x ) h
(4)
Pendekatan di atas dikenal sebagai forward difference. Untuk keperluan komputasi diferensiasi numerik dengan metode forward difference, persamaan (4) di atas digunakan sebagai formulanya. Sebagai contoh, diberikan sebuah fungsi f ( x ) = x2 . Tentukan nilai f 0 (3)! Secara analitis matematis, jawaban dari soal di atas adalah f 0 ( x ) = 2x, sehingga f 0 (3) = 2 × 3 = 6. Ini adalah nilai jawaban eksaknya. Lalu bagaimanakah penyelesaian numeriknya? Berikut adalah jawabannya (Contoh 5.1).
#include #include <math.h> using namespace std; float fx(float x){ float f; f = pow(x, 2); }
return f;
int main(){ float dfx, a, h; a = 3; h = 0.1; dfx = (fx(a + h) - fx(a)) / h; cout << dfx << endl; }
38
return 0;
5.2 central difference
Hasil dari kode program di atas adalah 6.1. Hasil ini disebut sebagai hasil pendekatan numerik. 5.2
central difference
Perhatikan persamaan dua deret berikut: f ( x + h) = f ( x ) +
h 0 h2 00 h3 000 f (x) + f (x) + f (x) + . . . 1! 2! 3!
(5)
h 0 h2 00 h3 000 f (x) + f (x) − f ( x ) + . . . (6) 1! 2! 3! Jika persamaan (5) dikurangkan dengan persamaan (6), maka didapat f ( x − h) = f ( x ) −
f ( x + h) − f ( x − h) = 2
h 0 h3 f ( x ) + 2 f 000 ( x ) + . . . 1! 3!
(7)
Pendekatan dari persamaan (7) adalah f ( x + h) − f ( x − h) ≈ 2
h 0 f (x) 1!
(8)
Sehingga f ( x + h) − f ( x − h) (9) 2h Persamaan (9) di atas dapat digunakan sebagai formula untuk komputasi diferensiasi numerik (metode central difference). Perhatikan Contoh 5.2 berikut. Diketahui sebuah fungsi sederhana f ( x ) = x3 . Tentukan nilai f 0 (2)! Jawab: Secara analitis matematis, jawaban dari soal di atas adalah f 0 ( x ) = 3x2 , sehingga f 0 (2) = 3 × 22 = 12. Sedangkan penyelesaian numeriknya adalah f 0 (x) ≈
#include #include <math.h> using namespace std; float fx(float x){ float f;
39
diferensiasi numerik
f = pow(x, 3); }
return f;
int main(){ float dfx, a, h; a = 2.0; h = 0.1; dfx = (fx(a + h) - fx(a - h)) / (2 * h); cout << dfx << endl; }
return 0;
Hasil dari metode numerik di atas adalah 12.01. Contoh 5.3: Sebuah fungsi sederhana f ( x ) = x x . Tentukan f 0 (2)! Jawab: Dalam kalkulus, penyelesaian simbolik dari fungsi di atas adalah f 0 ( x ) = (ln x + 1) x x , sehingga f 0 (2) = (ln 2 + 1)22 . Bagaimanakah komputasinya? 5.3
diferensiasi orde dua
Dari dua sub bab sebelumnya telah dibahas bagaimana komputasi diferensiasi orde satu. Di sub bab ini, akan disajikan diskusi ringkas komputasi diferensiasi orde dua. Sebuah fungsi f ( x ), maka diferensiasi orde dua dari fungsi d2 f ( x )
tersebut dapat ditulis sebagai dx2 atau f 00 ( x ). Perhatikan kembali persamaan (5) dan (6). Jika kedua persamaan tersebut dijumlahkan, akan didapat f ( x + h) + f ( x − h) = 2 f ( x ) + 2
40
h2 00 f (x) + . . . 2!
(10)
5.3 diferensiasi orde dua
atau dalam bentuk lain f ( x + h) + f ( x − h) = 2 f ( x ) + h2 f 00 ( x ) + . . .
(11)
sehingga didapat pendekatan f ( x + h) + f ( x − h) − 2 f ( x ) (12) h2 Pendekatan seperti pada persamaan (12) di atas dapat dijadikan sebagai formula dalam komputasi diferensiasi numerik orde dua. Perhatikan kembali Contoh 5.3. Dengan metode komputasi, tentukan nilai f 00 (2). Bandingkan juga hasil komputasi tersebut dengan metode analitis matematis. f 00 ( x ) ≈
41
6 INTEGRASI NUMERIK
Ada 3 (tiga) metode yang akan didiskusikan pada bahasan integrasi numerik ini, yaitu metode Trapezoid, metode Midpoint, dan metode Simpson. 6.1
metode trapezoid
Sebuah fungsi f ( x ) dengan a ≤ x ≤ b, maka hasil integral Z b a
f ( x )dx
(13)
adalah luasan di bawah grafik f ( x ) dengan batas bawah a dan batas atas b (Gambar 6.1). Luasan ini ditunjukkan sebagai area yang diarsir dengan warna merah.
Rb Gambar 6.1 Grafik fungsi y = f ( x ). Hasil integral a f ( x )dx merupakan area dengan arsiran warna merah.
43
integrasi numerik
Dalam teori analisis numerik, solusi integral tersebut dapat diselesaikan dengan menggunakan pendekatan Z b a
f ( x )dx =
h ( f ( a) + f (b)) 2
(14)
dengan h = b − a. Pendekatan ini dikenal sebagai metode Trapezoid. Pendekatan metode Trapezoid memberikan hasil integral yaitu luasan area arsiran warna merah ditambah dengan area arsiran warna hijau. Sehingga, metode ini memberikan error atau selisih sebesar luasan area arsiran warna hijau (hasil eksak integral adalah area arsiran warna merah). Perhatikan Contoh 6.1: Dengan menggunakan metode Trapezoid, tentukan nilai integral berikut. Z 5 2
x2 dx
Jawab: Solusi analitis matematis dari soal di atas adalah 5 Z 5 x3 53 23 x2 dx = = − = 39 3 2 3 3 2
(15)
(16)
Hasil ini merupakan luasan grafik dengan arsiran warna merah seperti ditunjukkan Gambar 6.2.
R5 Gambar 6.2 Grafik fungsi y = x2 . Hasil integral 2 x2 dx merupakan area dengan arsiran warna merah.
Sedangkan penyelesaian komputasinya adalah sebagai berikut.
44
6.1 metode trapezoid
#include #include <math.h> using namespace std; float fx(float x){ float f; f = pow(x, 2); }
return f;
int main(){ float F, a, b, h; a = 2; b = 5; h = b - a; F = (h / 2) * (fx(a) + fx(b)); cout << F << endl; }
return 0;
Hasil dari komputasi di atas adalah 43.5. Jika dibandingkan dengan hasil eksak dari penyelesaian analitis matematis yang sebesar 39, hasil komputasi memberikan selisih atau error sebesar 43,5 - 39 = 4,5. Untuk memperkecil nilai error, dibuatlah metode Trapezoid dengan jumlah cacah n seperti ditunjukkan dalam Gambar 6.3.
45
integrasi numerik
Gambar 6.3 Grafik fungsi y = x2 . Grafik dicacah ke dalam n = 3. Dengan dicacah ke dalam n = 3 partisi, nilai error yang dihasilkan semakin kecil.
Berikut penyelesaian komputasinya.
#include #include <math.h> using namespace std; float fx(float x){ float f; f = pow(x, 2); }
return f;
int main(){ float F, Fi, a, b, ai, bi, n, h, i; a b n h
= = = =
2; 5; 3; (b - a) / n;
F = 0; for(i=1; i <= n; i++){
46
6.2 metode midpoint
ai = (a - h) + (i * h); bi = ai + h; Fi = (h / 2) * (fx(ai) + fx(bi)); }
F = F + Fi;
cout << F << endl; return 0;
}
Hasil dari komputasi di atas adalah 39.5. Hasil ini mendekati hasil eksak yang sebesar 39. Jika pada kode program n = 10, maka hasilnya 39.045. Jika n = 100, hasilnya adalah 39.0004. Jadi, dengan memperbanyak jumlah cacah n, maka hasil komputasi akan mendekati nilai eksaknya. 6.2
metode midpoint
Ini merupakan metode kedua dari integrasi numerik yang dibahas pada catatan kecil ini. Perhatikan Gambar 6.4 berikut.
Rb Gambar 6.4 Grafik fungsi y = f ( x ). Nilai integral a f ( x )dx dengan pendekatan metode Midpoint adalah area dengan arsiran warna biru ditambah arsiran warna hijau, (b − a) × f (( a + b)/2).
47
integrasi numerik
Rb Nilai eksak a f ( x )dx dari Gambar 6.4 adalah area dengan arsiran warna biru ditambah arsiran warna merah. Sedangkan nilai integral dengan pendekatan Midpoint adalah area dengan arsiran biru ditambah hijau. Perhatikan Contoh 6.1 kembali. Hasil eksak dari integral pada Contoh 6.1 adalah 39. Sedangkan dengan komputasi metode Midpoint adalah
#include #include <math.h> using namespace std; float fx(float x){ float f; f = pow(x, 2); }
return f;
int main(){ float F, a, b, h; a = 2; b = 5; h = b - a; F = h * fx((a + b) / 2); cout << F << endl; }
return 0;
Hasil dari komputasi di atas adalah 36.75. Hasil ini merupakan area dengan arsiran biru ditambah hijau seperti pada Gambar 6.5. Hasil komputasi ini memberikan selisih atau error sebesar 39 - 36,75 = 2,25. Untuk memperkecil nilai error ini, dibuatlah
48
6.2 metode midpoint
metode Midpoint dengan cara dicacah menjadi n partisi (Gambar 6.6).
R5 Gambar 6.5 Grafik fungsi y = x2 . Nilai integral 2 x2 dx dengan pendekatan metode Midpoint adalah area dengan arsiran warna biru ditambah arsiran warna hijau, atau (5 − 2) × f ((2 + 5)/2).
Gambar 6.6 Grafik fungsi y = x2 . Dengan mencacah menjadi n partisi R5 (dari gambar n = 3), nilai integral 2 x2 dx dengan metode Midpoint akan mendekati nilai eksaknya.
Dan berikut adalah komputasi numeriknya.
#include #include <math.h> using namespace std; float fx(float x){ float f;
49
integrasi numerik
f = pow(x, 2); }
return f;
int main(){ float F, Fi, a, b, ai, bi, n, h, i; a b n h
= = = =
2; 5; 3; (b - a) / n;
F = 0; for(i=1; i <= n; i++){ ai = (a - h) + (i * h); bi = ai + h; Fi = h * fx((ai + bi) / 2); }
F = F + Fi;
cout << F << endl; }
return 0;
Hasil dari komputasi di atas adalah 38.75. Jika n = 10, hasilnya = 38.9775. Dan jika n = 100, hasil komputasinya adalah 38.9998. Jadi, sama seperti pada metode Trapezoid, dengan memperbanyak jumlah cacah partisi n, maka hasil komputasi dengan metode Midpoint akan mendekati nilai eksaknya.
50
6.3 metode simpson
6.3
metode simpson
Ini adalah bagian ketiga atau bagian terakhir dari pembahasan integrasi numerik pada catatan kecil ini. Dalam teori analisis numerik, metode Simpson adalah Z b a
f ( x )dx =
h ( f ( a) + 4 f ( a + h) + f (b)) 3
(17)
dengan h = (b − a)/2. Perhatikan kembali Contoh 6.1. Solusi komputasi metode Simpson dari contoh tersebut adalah.
#include #include <math.h> using namespace std; float fx(float x){ float f; f = pow(x, 2); }
return f;
int main(){ float F, a, b, h; a = 2; b = 5; h = (b - a) / 2; F = (h / 3) * (fx(a) + 4 * fx(a + h) + fx(b)); cout << F << endl; }
return 0; Hasil komputasi ini adalah 39 (sama dengan nilai eksaknya).
51
7 PENYELESAIAN PERSAMAAN NONLINIER
Sebuah fungsi f ( x ) ≡ ax − b = 0, maka dengan cepat didapat bahwa x = ba . Pun demikian dengan fungsi f ( x ) ≡ ax2 + bx + c = 0, maka penyelesaian x adalah √ −b ± b2 − 4ac x= (18) 2a Lalu, bagaimanakah jika fungsi f ( x ) adalah fungsi polinomial, transedental, atau kombinasi dari berbagai variasi fungsi?. Persoalan ini dapat diselesaikan dengan pendekatan numerik. Salah satu metode yang digunakan adalah metode Bisection. Diasumsikan fungsi f ( x ) kontinyu di titik a dan b. Maka prinsip metode Bisection adalah masukkan nilai a dan b. Kemudian tentukan titik tengah antara a dan b, misal titik tengah ini ditulis sebagai x1 , sehingga x1 = a+2 b . Langkah berikutnya adalah tentukan f ( a) f ( x1 ). Ada tiga sifat dari perkalian ini, yaitu ada akar di [a, x1 ] <0 f ( a ) f ( x1 ) >0 ada akar di [x1 , b] =0 x1 akar penyelesaian Ulangi langkah di atas sampai diperoleh akar persamaannya. Contoh 7.1: Diketahui sebuah fungsi 1 =0 (19) x Tentukan penyelesaian dari fungsi di atas. Jawab: Komputasi metode Bisection dari soal di atas adalah f ( x ) ≡ ln x −
53
penyelesaian persamaan nonlinier
#include #include <math.h> using namespace std; float f(float x){ return log(x) - (1 / x); } int main(){ float a, b, c, x; int iteration = 0; int max_iteration = 100; a = 1.0; b = 3.0; while(true){ iteration++; c = (a + b) / 2.0; if(f(a) * f(c) < 0.0){ b = c; }else if(f(a) * f(c) > 0.0){ a = c; }else{ break; } if(a >= b){ cout << "Error!" << endl; return 0; } }
54
if(iteration == max_iteration) break;
penyelesaian persamaan nonlinier
x = c; cout << "x:\t\t" << x << endl; cout << "iteration:\t" << iteration << endl; }
return 0;
Hasil dari komputasi di atas adalah 1.76322. Adapun grafik fungsi f ( x ) = ln x − 1x ditunjukkan dalam Gambar 7.1 berikut.
Gambar 7.1 Grafik fungsi f ( x ) = ln x − 1x . Ada satu titik perpotongan grafik, yaitu f ( x ) = 0 pada x = 1, 76322.
55
BIBLIOGRAPHY
[1] Hjorth-Jensen, M., Computational Physics, University of Oslo, 2009. [2] Klein, A., Godunov, A., Introductory Computational Physics, Cambridge University Press, Cambridge, 2006. [3] Scherer, P., Computational Physics Simulation of Classical and Quantum Systems, Springer, Heidelberg, 2010. [4] Soulié, J., C++ Language Tutorial, http://cplusplus.com/ doc/tutorial/, 2008. [5] Williams, T., Kelley, C., Gnuplot 4.6 An Interactive Plotting Program, http://sourceforge.net/projects/gnuplot/, 2014.
57