Anda di halaman 1dari 133

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/311740416

Komputasi Fisika

Book · December 2016


DOI: 10.13140/RG.2.2.21787.87844

CITATIONS READS

0 5,449

1 author:

Sparisoma Viridi
Bandung Institute of Technology
228 PUBLICATIONS   228 CITATIONS   

SEE PROFILE

Some of the authors of this publication are also working on these related projects:

Technical Laboratory View project

Material Sciences View project

All content following this page was uploaded by Sparisoma Viridi on 20 December 2016.

The user has requested enhancement of the downloaded file.


Komputasi Fisika
(draft 20161220)

Prodi Fisika, FMIPA, Institut Teknologi Bandung

Sparisoma Viridi
2016
Sparisoma Viridi, Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya diperbolehkan selama
untuk tujuan pendidikan dan tak-komersial. Modifika si dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

2016
Sparisoma Viridi

Prodi Fisika, FMIPA, Institut Teknologi Bandung


Komputasi Fisika (draft 20161220)
ii

Catatan kuliah ini disusun dengan bantuan dukungan Penelitian Unggulan Perguruan
Tinggi tahun 2016 dengan nomor kontrak 585f/I1.C01/PL/2016.

Sparisoma Viridi, Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung


Lisensi ITB 2016
Penyebaran dalam bentuk aslinya diperbolehkan selama untuk tujuan pendidikan dan
tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis
dudung@gmail.com | dudung@fi.itb.ac.id
iii

Isi
1. Program Pertama 1
2. Nama Variabel 7
3. Variabel 17
4. Algoritma 27
5. Model Mengurutkan Data 33
6. Regresi Linier 47
7. Sistem Persamaan Linier 61
8. Deret Taylor 73
9. Integrasi Numerik 81
10. Mencari Akar 87
11. Matriks 2-D 95
12. Sekilas Metode Beda Hingga 101
13. Jaringan Saraf Tiruan 109
14. Lengkungan Batang 113
15. Monte-Carlo untuk Aliran Fluks Sederhana 117
16. Catatan Penutup 121
iv
Sparisoma Viridi, Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya diperbolehkan selama
untuk tujuan pendidikan dan tak-komersial. Modifika si dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com
Sparisoma Viridi, 201608170 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Program Pertama
diperbolehkan selama untuk tujuan pendidikan dan ta k-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Dalam dunia pemrograman komputer, terlepas dari apapun bahasa pemrograman yang
digunakan, terdapat suatu kebiasaan adanya program pertama yang dibuat dan
dijalankan untuk memastikan sistem dapat bekerja, terutama piranti penampilnya.
Program tersebut dikenal dengan nama HelloWorld, yang hanya menampilkan kata-
kata “Hello, World!” atau variasinya [1].

1 Program HelloWorld dalam C++


Dengan menggunakan bahasa pemrograman C++ dapat dibuat sebuah program
HelloWorld, yang salah satu implementasinya adalah seperti dalam kode berikut ini.

Kode 1 Program HelloWorld paling sederhana dalam C++.


#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "Hello, World!\n";
return 0;
}

Kode di atas disimpan dalam berkas dengan nama hello0.cpp dan dikompilasi dengan
cara
g++ hello0.cpp –o hello0

serta dipanggil dengan cara


./hello0

yang akan memberikan hasil


Hello, World!

seperti diharapkan. Kode 1 di atas merupakan contoh kode singkat yang dapat
dituliskan.

2 Komentar dalam program


Untuk memperjelas maksud suatu program keterangan dan komentar dapat dituliskan
di dalamnya. Tambahan informasi ini tidak hanya mem bantu pembaca tetapi juga
penulis program sendiri, terutama setelah tidak lagi menekuni program tersebut untuk

1
2

suatu jangka waktu tertentu. Komentar dapat dituliskan dalam satu baris atau beberapa
baris. Untuk satu baris saja, komentar dituliskan dalam suatu baris yang diawali dengan
dengan karakter-karakter // seperti
// Show the sentence "Hello, World!"

dan untuk beberapa baris komentar diapit oleh pasangan karakter /* dan */ seperti
/*
hello1.cpp
Show "Hello, World!" sentence
*/

Contoh terakhir merupakan keterangan singkat tujuan program hello1.cpp dibuat.


Kedua cara pemberian komentar tersebut disajikan dalam program lengkap berikut.
Kode 2 Program HelloWorld dalam C++ yang telah dilengkapi dengan keterangan dan disimpan
dengan nama hello1.cpp.
/*
hello1.cpp
Show "Hello, World!" sentence

Sparisoma Viridi | dudung@gmail.com

Compile: g++ hello1.cpp -o hello1


Execute: ./hello1

20160817
Create this program.
*/

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {


// Show "Hello, World!"
cout << "Hello, World!" << endl;

// Terminate program with success state


return 0;
}

Dalam catatan ini keterangan dan komentar sengaja dituliskan dalam Bahasa Inggris
agar pembaca dapat terbiasa dalam membaca keterangan dan komentar dalam bahasa
3

tersebut, mengingat umumnya sumber-sumber utama pemgrograman masih terdapat


dalam bahasa Inggris.

3 Petunjuk kompilasi dan eksekusi


Dalam suatu program perlu disertakan petunjuk bagaimana kode program tersebut
dikompilasi dan bagaimana kemudian hasil kompilasin ya dijalankan. Bila suatu kode
bukan merupakan kode program yang mandiri, perlu juga disertakan bagaimana cara
menyertakan kode tersebut dalam program yang akan menggunakannya. Dalam Kode 2
telah dicontohkan bagaimana menyertakan petunjuk kompilasi dan eksekusi suatu
program, yaitu pada bagian
Compile: g++ hello1.cpp -o hello1
Execute: ./hello0

yang akan memberikan petunjuk pada orang yang akan menggunakannya. Opsi -o
adalah untuk menentukan nama berkas yang dapat dieksekusi [2]. Bila ingin diubah
nama berkas yang dapat dieksekusi maka dapat dilakukan
Compile: g++ hello1.cpp -o helloworld
Execute: ./helloworld

sehingga berkas yang dapat dieksekusi menjadi bernama helloworld dengan kodenya
tetap bernama hello1.cpp seperti semula.

4 Riwayat pengubahan program


Suatu program yang kompleks umumnya tidak dapat dibuat sekali jadi, sehingga
penulisan riwayat program mutlak diperlukan. Informasi ini akan memudahkan penulis
program atau pembaca yang mempelajarinya memahami bagaimana program tersebut
berubah menjadi bentuk terakhirnya. Kegagalan-kegagalan suatu algoritma juga perlu
disertakan sebagai pembelajaran.
Sebagai ilustrasi program hello2.cpp dibuat dengan memodifikasi program
hello1.cpp sebelumnya. Dalam riwayat program tersebut disertakan sumber aslinya
sehingga pembaca dapat melacak versi sebelum dilakukan modifikasi, sebagaimana
terlihat dalam bagian
20160817
Create this program, modified from hello1.cpp.

dengan baris pertama menyatakan tanggal catatan dan baris berikutnya berisikan
informasi yang ingin disampaikan. Keterangan pada tiap tanggal dapat terdiri dari
4

beberapa baris, akan tetapi sebaiknya tetap cukup singkat. Kode lengkap program
hello2.cpp adalah sebagai berikut ini.

Kode 3 Program hello2.cpp yang dapat menyapa pengguna dengan namanya.


/*
hello2.cpp
Show "Hello, World!" sentence

Sparisoma Viridi | dudung@gmail.com

Compile: g++ hello2.cpp -o hello2


Execute: ./hello2

20160817
Create this program, modified from hello1.cpp.
*/

#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]) {


// Show information
cout << "Please type your name (and press enter): ";

// Get user name


string name;
cin >> name;

// Greet user by his name


cout << "Hello, " << name << "! Nice to meet you." << endl;

// Terminate program with success state


return 0;
}

Program ini akan memberikan hasil


./hello2
Please type your name (and press enter): Muhammad Ali
Hello, Muhammad! Nice to meet you.

Dari masukan "Muhammad Ali" diambil kata pertama dan digunakan program untuk
menyapa pengunanya seperti pada baris berikutnya.
5

5 Alternatif jalannya program


Terkait dengan bagian sebelumnya, dalam mengembangkan suatu program sering kali
berbagai alternatif jalannya program dicoba dan yang satu belum tentu lebih baik dari
yang lainnya. Saat akan dikompilasi dapat dipilih b agian kode yang diinginkan dan yang
tidak diinginkan dijadikan komentar multi-baris. Il ustrasi mengenai hal ini dapat dilihat
pada potongan kode berikut.
Kode 4 Contoh potongan kode dengan memanfaatkan fasilitas komentar /* dan */.
int main(int argc, char *argv[]) {

// Define mass
double mass = 0.25;

// Define area and mass density


double area = 0.0;
double sigma = 0.0;

// Define size
double size = 2.0;

/*
// Form is circle
area = M_PI * size * size;
sigma = mass / are;
*/

// Form is square
area = size * size;
sigma = mass / are;

// Show result
cout << "Luas = " << area << endl;

Pada Kode 4 program dikompilasi dengan bentuk yang dipilih berbentuk bujur sangkar.
Bila akan digunakan bentuk lingkaran bagian terkait bentuk bujursangkar yang harus
dijadikan komentar.

6 Pertanyaan
1. Apa perbedaan penggunaan karakter-karakter // dan pasangan karakter /* dan
*/ dalam penulisan keterangan dan komentar dalam program?

2. Apakah kegunaan opsi -o saat kompilasi suatu program dengan g++?


6

3. Apakah karakter-karakter // dapat diletakkan di akhir kalimat seperti berikut ini?


double beta = 0.8; // Speed ratio

4. Bagaimana dengan baris berikut ini? Jelaskan!


// Speed ratio double beta = 0.8;

5. Jelaskan apakah potongan kode berikut benar atau salah? Mengapa?


double p = 2.5;
/*
double l = 1.2;
// */
double A = p * l;

7 Rujukan
1. Wikipedia contributors, "Hello, World! program", Wikipedia, The Free Encyclo-
pedia en:733431665, 17 Aug 2016 | 0928.
2. Shlomi Fish, "Use of gcc/g++", Software Development on Linux, URL http://www
.shlomifish.org/lecture/W2L/Development/slides/gcc/ [20160817].
Sparisoma Viridi, 201608190 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Nama Variable
diperbolehkan selama untuk tujuan pendidikan dan ta k-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Dalam pemberian nama variabel (dan fungsi) C++ membedakan antara huruf besar dan
kecil yang merupakan warisan dari bahasa pemrograman C [1], artinya int xmin = 2
dan int Xmin = 3 keduanya merupakan variabel yang berbeda. Dengan demikian
dalam penulisannya, pemrogram harus hati-hati bila sebelumnya telah terbiasa dengan
bahasa pemrograman yang tidak membedakan huruf besar dan kecil dalam penamaan
variabelnya.

1 Karakter-karakter yang diperbolehkan


Terdapat berbagai karakter yang diperbolehkan dalam penamaan suatu variable, yaitu
garis bawah (underscore) _, huruf besar A..Z, huruf kecil a..z, dan angka 0..9. Huruf
pertama yang diperbolehkan hanya huruf dan garis bawah. Selain itu perlu pula
diperhatikan kata-kata yang telah digunakan dalam C++ atau dikenal sebagai reserved
words. Jadi walaupun karakter-karakter yang digunakan sah, akan tetapi bila kata yang
dibentuk merupakan bagian dari reserved words, maka nama variabel tersebut menjadi
tidak sah.
Tabel 1 Beberapa contoh penamaan variabel dalam C++.
Nama variabel Sah Penjelasan
aa, aA, z8, ya -
A8d
_ab, _d9, a_9 ya -
89d, 007agent tidak diawali angka
a-bd_d, &d4#, tidak menggunakan karakter yang tidak
!9d, *r@g
diperbolehkan
int, double, tidak reserve words
char
if, select, tidak reserve words
while
x min, y max tidak terdapat spasi

Pesan kesalahan yang muncul saat penamaan variabel 89d adalah

7
8

varname0.cpp:21:6: error: invalid suffix "d" on integer constant


int 89d = 2;
^

Kode 1 Contoh penamaan variabel yang tidak sah.


/*
varname0.cpp
Learn naming variables

Sparisoma Viridi | dudung@gmail.com

Compile: g++ varname0.cpp -o varname0


Execute: ./vrname0

20160819
Create this program.
*/

#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]) {


// Define various types of variables
//int a-bd_d = 2;

int &d4# = 4;
int !9d = 3;
int *r@g = 2;

int if = 3;
double x min = 34.3;

return 0;
}

dan apabila untuk variabel a-bd_d adalah


varname0.cpp: In function ‘int main(int, char**)’:
varname0.cpp:21:7: error: expected initializer before ‘-’ token
int a-bd_d = 2;
^

serta untuk variabel-variabel yang lainnya


varname0.cpp:23:13: error: invalid initialization of non-const reference
of type ‘int&’ from an rvalue of type ‘int’
9

int &d4# = 4;
^
varname0.cpp:24:6: error: expected unqualified-id before ‘!’ token
int !9d = 3;
^
varname0.cpp:25:9: error: expected initializer before ‘g’
int *r@g = 2;
^
varname0.cpp:27:6: error: expected unqualified-id before ‘if’
int if = 3;
^
varname0.cpp:28:11: error: expected initializer before ‘min’
double x min = 34.3;
^

dengan Kode 3.1 adalah program lengkapnya.

2 Variasi huruf besar dan kecil


Setelah mengetahui bahwa huruf besar dan kecil dapat terbedakan, maka untuk suatu
kata yang terdiri dari tiga huruf (n = 3), misalnya pos, dapat dituliskan sejumlah
N = 2n (1)
cara atau N = 23 = 8, yang implementasinya adalah
pos, poS, pOs, pOS, Pos, PoS, POs, POS

sebagai delapan nama variabel yang sah.

3 Karakter yang mirip


Terdapat beberapa karakter yang mirip saat digunakan dalam kode program sehingga
sebaiknya dihindari untuk membantu keterbacaan program, walaupun compiler dapat
membedakannya. Terkadang programmer mengalami kesulitan dalam membedakannya
secara visual, seperti
O0
l1
l0O1

di mana baris pertama adalah huruf ‘0’ diikuti angka nol, baris kedua adalah huruf ‘L’
kecil diikuti angka satu, dan baris ketiga adalah variasi dari keempat karakter tersebut.

4 Mirip dengan simbol matematikanya


Walaupun terdapat kebebasan dalam memberi nama variabel dalam C++ dengan
menggunakan angka dan huruf serta garis bawah, sebaiknya programmer memilih nama
10

variabel yang sedapat mungkin mirip dengan simbol matematikanya sehingga saat
dibandingkan dengan sistem fisis yang sedang disimu lasikan, keterbacaan program
menjadi tinggi.
Kode 2 Contoh penamaan variabel yang semirip mungkin dengan simbol matematikanya.
/*
varname1.cpp
Learn naming variables

Sparisoma Viridi | dudung@gmail.com

Compile: g++ varname1.cpp -o varname1


Execute: ./vrname1

20160819
Create this program.
*/

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char *argv[]) {


// Define mass
double m = 1.5;

// Define radius dan calculate volume


double R = 0.5;
double R3 = R * R * R;
double V = (4.0 / 3.0) * M_PI * R3;

// Calculate density
double rho = m / V;

// Show result
cout << "A sphere with mass " << m << " kg and ";

Kode 2 akan memberikan hasil


./varname1
A sphere with mass 1.5 kg and radius 0.5 m has density of 2.86479 kg/m^3

Terkait dengan rumus menghitung densitas yang akan menjadi


3m
ρ= (2)
4πR 3
11

untuk benda berbentuk bola, dapat dibuat suatu fung si untuk itu, sebagai kelanjutan
dari Kode 2 yang menghitungnya secara langsung.
Kode 3 Contoh penamaan variabel dan fungsi sesuai makna fisisnya.
/*
varname2.cpp
Learn naming variablels and function

Sparisoma Viridi | dudung@gmail.com

Compile: g++ varname2.cpp -o varname2


Execute: ./vrname2

20160819
Create this program, in advance for varname1.cpp.
*/

#include <iostream>
#include <cmath>

using namespace std;

double rho_ball(double, double);

int main(int argc, char *argv[]) {


// Define mass and radius
double m = 1.5;
double R = 0.5;

double rho = rho_ball(m, R);

// Show result
cout << "A sphere with mass " << m << " kg and ";
cout << "radius " << R << " m has density of " << rho;
cout << " kg/m^3" << endl;

return 0;
}

// Calculate density of ball with mass m and radius R


double rho_ball(double m, double R) {
double V = (4.0 / 3.0) * M_PI * R * R * R;
double rho = m / V;
return rho;
}
12

Kode 3 akan memberikan hasil seperti kode sebelumnya, yang telah dibuat lebih
canggih dengan adanya fungsi
// Calculate density of ball with mass m and radius R
double rho_ball(double m, double R) {
double V = (4.0 / 3.0) * M_PI * R * R * R;
double rho = m / V;
return rho;
}

yang akan memudahkan perhitungan, bila proses ini dilakukan berulang-ulang kali.
Salah satu keunggulan mendefinisikan fungsi adalah apabila fungsi tersebut
dimodifikasi, maka seluruh bagian program yang menggunakan fungsi yang sama juga
telah dimodifikasi. Lain halnya bila perhitungan, s eperti kasus massa jenis di atas, di
hitung langsung, bila satu bagian diubah dan bagian lain terlupa, maka jalannya program
secara keseluruhan dapat bermasalah.
Ilustrasi lain yang telah umum dikenal, misalnya adalah penentuan akar-akar dari suatu
persamaan kuadrat yang memiliki bentuk
y = ax 2 + bx + c , (3)

yang memiliki akar-akar persamaan

−b± D
x1, 2 = (4)
2a

dengan diskriminan polinomial berorde dua [2]


D = b 2 − 4ac . (5)
Diberikan contoh dua buah program lengkap, di mana dalam program pertama
digunakan nama-nama variabel yang tidak terlalu terkait dengan lambang-lambang
dalam Persamaan (3) – (5) dan dalam program kedua sebaliknya. Diharapkan dengan
kedua contoh tersebut dapat dirasakan bagaimana peran pemilihan nama variabel
dapat membantu pembaca memahami program yang ditulis oleh orang lain.
Pada contoh pertama terdapat komentar-komentar yang disertakan untuk membantu
pembaca mengerti maksud dari baris-baris kode dalam program tersebut, sedangkan
dalam contoh kedua dipilih nama-nama variabel yang mirip (bila tidak dapat sama)
dengan persamaan-persamaan matematikanya, dalam hal ini Persamaan (3) – (5). Untuk
menguji keterbacaannya, komentar-komentar dalam contoh kedua dihapus, akan tetapi
nama-nama variabel yang dipilih telah cukup berbuny i sehingga komentar tidak lagi
diperlukan.
13

Kode 4 Mencari akar persamaan kuadrat (contoh buruk penamaan variabel).


/*
varname3.cpp
Learn naming variablels and function
roots of polynomial of 2nd order (bad example)

Sparisoma Viridi | dudung@gmail.com

Compile: g++ varname3.cpp -o varname3


Execute: ./vrname3

20160819
Create this program.
*/

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char *argv[]) {


// Define coefficient of second order polynomial
double k = 2.0;
double l = -9.0;
double m = 4.0;

// Calculate discriminant
double n = l * l - 4.0 * k * m;

// Get the roots


double x = (-l + sqrt(n)) / (2.0 * k);
double y = (-l - sqrt(n)) / (2.0 * k);

// Show result
cout << "Polynomial " << k << "x^2 + ";
cout << l << "x + " << m << " has roots of " << endl;
cout << "x1 = " << x << endl;
cout << "x2 = " << y << endl;

// Terminate program with success state


return 0;
}

Setelah membaca Kode 4, cobalah membaca Kode 5 dan bandingkan pengertian yang
diperoleh.
14

Kode 5 Mencari akar persamaan kuadrat (contoh baik penamaan variabel).


/*
varname4.cpp
Learn naming variablels and function
roots of polynomial of 2nd order (good example
even after removing comments)

Sparisoma Viridi | dudung@gmail.com

Compile: g++ varname4.cpp -o varname4


Execute: ./vrname4

20160819
Create this program as correction of varname3.cpp.
*/

#include <iostream>
#include <cmath>

using namespace std;

int main(int argc, char *argv[]) {


double a = 2.0;
double b = -9.0;
double c = 4.0;

double D = b * b - 4.0 * a * c;

double x1 = (-b + sqrt(D)) / (2.0 * a);


double x2 = (-b - sqrt(D)) / (2.0 * a);

cout << "Polynomial " << a << "x^2 + ";


cout << b << "x + " << c << " has roots of " << endl;
cout << "x1 = " << x1 << endl;
cout << "x2 = " << x2 << endl;

return 0;
}

Lebih lanjut Persamaan (4) dan (5) dapat pula dinya takan dalam satu fungsi sehingga
saat mencari akar-akar dari Persamaan (3) dapat langsung hanya menggunakan satu
buah fungsi, misalnya dengan implementasi berbentuk
double x1 = root1_poly2(2.0, -9.0, 4.0);
double x2 = root2_poly2(2.0, -9.0, 4.0);
15

yang program lengkapnya dapat dilihat dalam Kode 3.6 berikut.


Kode 6 Mencari akar polinomial orde dua dengan fungsi.
/*
varname5.cpp
Learn naming variablels and function
roots of polynomial on 2nd order with
function(s)

Sparisoma Viridi | dudung@gmail.com

Compile: g++ varname5.cpp -o varname5


Execute: ./vrname5

20160819
Create this program as advancing of varname4.cpp.
*/

#include <iostream>
#include <cmath>

using namespace std;

double root_poly2(double, double, double, int);


double root1_poly2(double, double, double);
double root2_poly2(double, double, double);

int main(int argc, char *argv[]) {


double a = 2.0;
double b = -9.0;
double c = 4.0;

double x1 = root1_poly2(a, b, c);


double x2 = root2_poly2(a, b, c);

cout << "Polynomial " << a << "x^2 + ";


cout << b << "x + " << c << " has roots of " << endl;
cout << "x1 = " << x1 << endl;
cout << "x2 = " << x2 << endl;

return 0;
}

// Get roots of 2nd order polynomial


double root_poly2(double a, double b, double c, int n) {
double D = b * b - 4.0 * a * c;
double x = (n == 1) ? (-b + sqrt(D)) : (-b - sqrt(D));
x /= (2.0 * a);
16

return x;
}

// Get the first root


double root1_poly2(double a, double b, double c) {
return root_poly2(a, b, c, 1);
}

// Get the second root


double root2_poly2(double a, double b, double c) {
return root_poly2(a, b, c, 2);
}

Perhatikan bahwa fungsi root1_poly2 dan root2_poly2 terlebih dahulu memanggil


fungsi root_poly2 yang lebih umum. Suatu saat dapat pula dirancang f ungsi untuk
mencari akar-akar polinomial orde N dalam bentuk
double coeff[] = {1, -7, 17, 6};
double x[] = roots_poly(coeff);

seperti dalam perintah MatLab roots [3], di mana implementasi ini membutuhkan jenis
variabel array yang akan dipelajari kemudian.

5 Pertanyaan
1. Bila ingin dinamakan suatu variabel dengan nama xmin, berapakah kemungkinan
jumlah nama yang diperbolehkan dengan menggunakan variasi huruf besar dan
kecil? Tuliskan semua variasi tersebut!
2. Sebutkan karakter-karakter (atau pasangan karakter) yang sebaiknya dihindari
digunakan dalam suatu nama variabel yang sama untuk menghindari ketidakter-
bacaan dan jelaskan mengapa!
3. Buatlah fungsi untuk root_poly3(a, b, c, d, n) dengan n = 1, 2, 3.

6 Rujukan
1. Unknown, "C variable naming rules", c4learn.com, 2015, URL http://www.c4learn
.com/c-programming/c-variable-nameing-rules/ [20160819].
2. Wikipedia contributors, "Discriminant", Wikipedia, The Free Encyclopedia
en:731986435, 28 Jul 2016 | 2029.
3. "roots, Polynomial roots", MathWorks, 2016, URL http://www.mathworks.com
/help/matlab/ref/roots.html [20160819].
Sparisoma Viridi, 201608171 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Variabel
diperbolehkan selama untuk tujuan pendidikan dan ta k-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Salah satu fitur dalam bahasa pemrograman manapun adalah adanya variabel yang
nilainya dapat dimanipulasi sehingga membantu untuk memperoleh hasil yang
diinginkan. Ada kalanya nilai suatu variabel ingin dibuat tetap selama program
berlangsung, untuk keperluan itu diadakan konstanta. Terdapat berbagai jenis variabel
dalam C++, di antaranya adalah int, double, bool, char, dan string, yang akan
dibahas di sini. Variabel tak lain adalah suatu tem pat penyimpanan informasi dalam
memori komputer.

1 Deklarasi
Deklarasi variabel dalam C++ dilakukan dengan [1]
type daftar_variabel;

di mana daftar_variabel dapat berupa satu atau beberapa nama variabel yang akan
dideklarasikan dengan jenis type. Kode 1 merupakan contoh deklarasi beberapa jenis
variabel dan bagaimana isi dari variabel tersebut saat dijalankan adalah sebagai berikut
ini.
./variable0
i = 2280620
j = 1630586288
k = 0
x = 1.80764e+159
y = 6.42587e+159
z = 4.68359e+159
c =
d =

Terlihat bahwa nilai-nilai dari variabel i, j, k yang berjenis int, x, y, z yang berjenis
double, dan c, d yang berjenis char tidak dapat diperkirakan. Hal ini karena variabel-
variabel tersebut hanya dideklarasikan dan belum diinisialisasi nilainya. Nilai awalnya
merupakan nilai acak yang teradpat pada tempat penyimpanan dalam memori saat
suatu tempat dialokasikan untuk suatu variabel baru. Dikarenakan nilai-nilai tersebut
tidak dapat dipastikan, oleh karena itu amat tidak disarankan untuk menggunakan
variabel-variabel tersebut tanpa menginisialisasi nilainya terlebih dahulu, mengingat
dapat saja nilai yang tak pasti tersebut mempengaruhi hasil akhir perhitungan.

17
18

Kode 1 Contoh deklarasi variabel dalam suatu program.


/*
variable0.cpp
Declare some variable types

Sparisoma Viridi | dudung@gmail.com

Compile: g++ variable0.cpp -o variable0


Execute: ./variable0

20160817
Create this program.
*/

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {


// Declare some variables
int i, j, k;
double x, y, z;
char c, d;

// Display variables value


cout << "i = " << i << endl;
cout << "j = " << j << endl;
cout << "k = " << k << endl;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "z = " << z << endl;
cout << "c = " << c << endl;
cout << "d = " << d << endl;

// Terminate program with success state


return 0;
}

Inisialisasi nilai variabel dapat dilakukan sekalig us saat deklarasi atau sesudahnya,
seperti berikut ini
// Declare variable of type int
int i;

// Initialize it
i = 213;
19

// Declare and initialize variable of type int


int j = 537;

2 Operasi
Setelah suatu variabel dideklarasikan dan diinisial isasi nilainya, ia dapat dioperasikan
sehingga nilainya dapat berubah. Operasi arimatik yang telah umum dikenal misalnya +,
-, /, * yang berturut-turut berarti penjumlahan, pengurangan, pembagian, dan
perkalian, misalnya
double x = 2.5;
double y = 4.2;
double z = x - y;

akan memberikan nilai akhir z = -1.7 sebagaimana ungkapan matematiknya


z = x − y = 2.5 − 4.2 = −1.7 . (1)

Tabel berikut memberikan perbandingan antara bentuk operator matematika dan


penulisannya dalam tata kalimat C++.
Tabel 1 Beberapa contoh operasi matematika dan implementasinya dalam C++.

Operasi Persamaan matematika Tata kalimat C++

Penjumlahan z = x+ y z = x + y;

Pengurangan z = x− y z = x - y;
Operator

Perkalian z = xy z = x * y;

x
Pembagian z= z = x / y;
y

Akar z= x z = sqrt(x);

Eksponen z = exp( x)
Fungsi

z = exp(x);

Logaritma z = ln x z = log(x);

Pangkat z = xy z = pow(x, y);


20

Dalam implementasinya tidak semua operasi matematika dapat diakomodasi dengan


menggunakan operator, untuk itu digunakan bentuk fungsi, seperti pangkat dan akar
yang direpresentasikan dalam bentuk fungsi sebagaimana diberikan dalam Tabel 1
sebelumnya.
Kode 2 Contoh operasi penjumlahan dua buah variabel berjenis double.
/*
variable1.cpp
Perform some mathematical operations

Sparisoma Viridi | dudung@gmail.com

Compile: g++ variable1.cpp -o variable1


Execute: ./variable1

20160818
Create this program.
*/

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {


// Declare some variables
double x = 2.5;
double y = 4.9;
double z = x + y;

// Display variables value


cout << x << " + " << y << " = " << z << endl;

// Terminate program with success state


return 0;
}

Hasil dari Kode 2 adalah sebagai berikut ini


./variable1
2.5 + 4.9 = 7.4

Untuk operasi -, /, dan * bagian penjumlahan sesuai dengan Tabel 1 perlu dig anti
dengan operasi yang diinginkan. Selain operasi matematika variabel berjenis lain seperti
string dapat pula mengalami operasi seperti penjumlahan yang implementasinya dapat
dilihat dalam Kode 2.3 berikut.
21

Kode 3 Operasi penjumlahan string.


/*
variable2.cpp
Perform some mathematical operations

Sparisoma Viridi | dudung@gmail.com

Compile: g++ variable2.cpp -o variable2


Execute: ./variable2

20160818
Create this program.
*/

#include <iostream>
#include <cstream>

using namespace std;

int main(int argc, char *argv[]) {


// Declare two string variables and initialize them
string x = "Proklamasi";
string y = "Kemerdekaan";
string z = x + y;

// Display variables value


cout << z << endl;

// Terminate program with success state


return 0;
}

Hasil Kode 3 adalah


./variable2
ProklamasiKemerdekaan

Operasi + untuk dua buah variabel berjenis string akan berfungsi menggabungkan is
kedua variabel tersebut.

3 Casting variabel tak terencana


Dalam operasi beberapa variabel, terutama berjenis int dan double, perlu diingat
bahwa dapat terjadi casting (konversi) variabel yang tidak terencana dan tidak
terlaporkan oleh compiler C++ sehingga programmer tidak tahu hal tersebut. Hal ini
dapat menjadi genting apabila digunakan untuk menghitung sesuatu yang sensitif atau
22

efek pemotongannya dapat membuat hasil perhitungan tak dapat diperkirakan. Ilustrasi
mengenai hal ini diberikan dalam Kode 4 berikut.
Kode 4 Casting double ke int yang tak terencana.
/*
variable3.cpp
Try to produce some error messages

Sparisoma Viridi | dudung@gmail.com

Compile: g++ variable3.cpp -o variable3


Execute: ./variable3

20160818
Create this program.
*/

#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]) {


int x = 1;
double y = 3.8;
int z1 = x + y;
cout << "(int) (" << x << " + " << y << ") = ";
cout << z1 << endl;
double z2 = x + y;
cout << "(double) (" << x << " + " << y << ") = ";
cout << z2 << endl;
return 0;
}

Keluaran yang diperoleh adalah


./variable3
(int) (1 + 3.8) = 4
(double) (1 + 3.8) = 4.8

Hasil pertama menunjukkan terjadi casting dari double ke int, yaitu 4.8 menjadi 4
tanpa disadari karena hasil disimpan dalam variabel berjenis int. Hasil kedua
memberikan nilai sebenarnya karena hasil penjumlahan disimpan dalam variabel
berjenis double. Keluaran yang sama juga akan diperoleh bila baris pertama dalam
program utama diubah menjadi
23

int x = 1.2;

di mana casting double 1.2 langsung dilakukan menjadi int saat disimpan dalam
variabel program x. Untuk mendeteksi hal ini opsi saat kompilasi -Wfloat-conversion
diperlukan, yang akan memberikan pesan peringatan
variable3.cpp: In function ‘int main(int, char**)’:
variable3.cpp:20:10: warning: conversion to ‘int’ alters ‘double’
constant value [-Wfloat-conversion]
int x = 1.2;
^

yang dapat membantu programmer untuk memberbaikinya.


Kode 5 Casting terencana dan tak terencana.
/*
variable4.cpp
Try to produce some error messages in variable casting

Sparisoma Viridi | dudung@gmail.com

Compile: g++ variable4.cpp -o variable4


Execute: ./variable4

20160818
Create this program.
*/

#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char *argv[]) {


double x = 1.25;
int y1 = x;
int y2 = (int) x;
int y3 = static_cast<int>(x);

cout << x << endl;


cout << y1 << endl;
cout << y2 << endl;
cout << y3 << endl;

return 0;
}
24

Kode 6 Casting char dan konversi int ke string.


/*
variable5.cpp
Show casting to string

Sparisoma Viridi | dudung@gmail.com

Compile: g++ variable5.cpp -o variable5 –std=c++11


Execute: ./variable5

20160818
Create this program.
*/

#include <iostream>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]) {


// Define various types of variables
int n = 8763;
char pre[] = "KT";
char su[] = "VCO";

// Merge into single variable and display it


string car_number = (string) pre + to_string(n) + (string) su;
cout << car_number << endl;

return 0;
}

4 Casting variabel (terencana)


Pengubahan jenis variabel dapat dilakukan dengan menggunakan fungsi-fungsi tertentu
ataupun casting, yang cara kedua dilakukan dengan [2]
other_type y = (other_type) x;

atau
other_type y = static_cast<other_type>(x);

di mana sebelumnya telah didefinisikan


type x = value;
25

Kedua cara tersebut lebih aman karena akan diperiksa oleh compiler C++ saat program
dikompilasi, dibandingkan dengan konversi secara implisit (tak terencana) pada bagian
sebelumnya. Pada Kode 5 disajikan satu casting tak terencana dan dua casting
terencana.
Selanjutnya dengan menggunakan fungsi konversi dari int ke string
string std::to_string(int);

dapat dilakukan konversi dan penggabungan berbagai jenis variabel sebagaimana


disajikan dalam Kode 2.6 yang akan memberikan hasil
./variable5
KT8763VCO

seperti diharapkan. Hanya perlu diingat bahwa fungsi to_string memerlukan opsi
kompilasi -std=c++11 agar perintah tersebut dapat dikenal

5 Pertanyaan
1. Mengapa saat mendeklarasikan suatu variabel sebaiknya juga dilakukan inisialisasi
nilainya? Jelaskan!
2. Terdapat potongan kode program berikut
double x = 8.2;
int y1 = x;
int y2 = (int) x;
int y3 = static_cast<int>(x);

yang dikompilasi dengan menggunakan opsi -Wfloat-conversion. Jelaskan baris


mana yang yang akan menjadi sumber pesan peringatan dan apa jenis peringatan
yang akan dilaporkan!
3. Bila sering digunakan awalah std:: untuk suatu fungsi, terdapat cara untuk
mengurangi penulisan yang berulang tersebut. Bagaimanakah caranya? Jelaskan!
4. Buatlah potongan kode dari suatu program yang menyajikan casting secara tak
sengaja (implisit) yang berpotensi membuat hasilnya tak dapat diprediksi dan
yang tidak bebahaya dan jelaskan!

6 Rujukan
1. Unknown, "C++ Variable Types", in Learn C++, Simply Easy Learning,
tutorialspoint, 2016, URL http://www.tutorialspoint.com/cplusplus/cpp_variable
_types.html [20160817].
26

2. Alex, "4.4a – Explicit type conversion (casting)" in Learn C++, URL http://www
.learncpp.com/cpp-tutorial/4-4a-explicit-type-conversion-casting/ [20160818].
Sparisoma Viridi, 201608260 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Algoritma
diperbolehkan selama untuk tujuan pendidikan dan ta k-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Langkah-langkah instruksi yang jelas untuk menyelesaikan suatu masalah atau suatu
kelompok masalah dikenal sebagai algoritma [1]. Atau secara umum tidak harus ada
permasalahan, dapat juga merupakah langkah-langkah terstruktur untuk melakukan
suatu kegiatan.

Contoh dalam aktivitas keseharian


Terdapat ilustrasi yang cukup sederhana mengenai algoritma ini. Terdapat seseorang
yang datang berkunjung dari negara lain dan untuk sampai ke rumah kenalannya di
negara ini, tuan rumah dapat memberikan empat algoritma berbeda berikut ini [2],
yang telah dimodifikasi untuk kondisi di Bandara So etta, Banten, Indonesia.
Algoritma menggunakan taksi
L1. pergi ke counter taksi di bandara
L2. pesan sebuah taksi
L3. berikan alamat yang dituju ke supir taksi

Algoritma menelpon tuan rumah


L1. telepon tuan rumah setelah pesawat mendarat
L2. buat janji bertemu di pintu keluar terminal kedatangan

Algoritma menyewa kendaraan (dengan supir umumnya)


L1. pergi ke counter penyewaan kendaraan
L2. jelaskan tujuan anda dan sewa kendaraan
L3. ikuti petunjuk tuan rumah untuk mencapai rumahnya

Algoritma menggunakan bis


L1. pergi ke counter Bis DAMRI
L2. katakan tujuan dan belilah tiket yang sesuai
L3. pergi ke tempat tunggu bis jurusan yang dituju
L4. turun di terminal tujuan
L5. ikuti petunjuk tuan rumah untuk mencapai rumahnya

Kita secara tak langsung sebenarnya dalam keseharian kita telah melakukan banyak
algoritma, akan tetapi tidak menyadarinya. Setelah melihat empat contoh di atas,
seharusnya Anda dapat mulai menuliskan algoritma-algoritma yang Anda miliki dalam
melakukan aktivitas sehari-hari.

27
28

Menentukan bilangan terbesar dua bilangan


Bilamana terdapat dua bilangan x dan y, bagaimanakah algoritma menentukan bilangan
yang lebih besar dari keduanya? Misalkan saja bilangan terbesar dari x dan y disimpan
dalam variabel lain z.
Algorima menentukan bilangan terbesar dua bilangan
L1. x? y?
L2. x > y  L5
L3. z = y
L4.  L6
L5. z = x
L6. Tampilkan z

Langkah L1 menggambarkan proses memasukkan nilai x dan y. Langkah L2 memban-


dingkan apakah x > y, bila ya z = x (langkah L5) bila tidak z = y (langkah L3). Langkah L4
hanya untuk memastikan agar langkah L5 tidak dijalankan saat kondisi pada langkah L2
tidk terpenuhi.

Menentukan bilangan terbesar dari N bilangan


Bila terdapat N bilangan, perlu terdapat bagian algoritma untuk membaca N buah
bilangan terlebih dahulu. Setelah itu, proses membandingkan dua buah bilangan tetap
dilakukan, tetapi dua bilangan yang dimaksud harus mencakup semua N bilangan
tersebut.
Algorima menentukan bilangan terbesar dari N bilangan
L1. N?
L2. i = 1
L3. xi?
L4. i = i + 1
L5. i ≤ N  L3
L6. i = 1
L7. z = xi
L8. i = i + 1
L9. z ≥ xi  L11
L10. z = xi
L11. i < N  L8
L12. Tampilkan z

Langkah L1 sampai L5 merupakan bagian membaca N buah bilangan, langkah L6 sampai


L11 mencari bilangan terbesar, dan langkah L12 menampilkan bilangan terbesar yang
dimaksud.
29

Analisa algoritma
Algoritma sebelumnya dapat dianalisa dengan menggunakan tabel yang baris-barisnya
berisikan keadaan variabel-variabel yang ingin dipantau perubahan nilainya dan kolom-
kolomnya berisikan variabel-variabel tersebut. Dalam Tabel 1 berikut dimisalkan bahwa
N = 3, dan x = {2.1, 3.9, 1.5}.
Tabel 1. Perubahan nilai variabel-variabel dalam algoritma menentukan bilangan terbesar dari N
bilangan.
Langkah N i xi z
L1 3 - - -
L2 3 1 - -
L3 3 1 2.1 -
L4 3 2 - -
L5 3 2 - -
L3 3 2 3.9 -
L4 3 3 - -
L5 3 3 - -
L3 3 3 1.5 -
L4 3 4 - -
L5 3 4 - -
L6 3 1 2.1 -
L7 3 1 2.1 2.1
L8 3 2 3.9 2.1
L9 3 2 3.9 2.1
L10 3 2 3.9 3.9
L11 3 2 3.9 3.9
L8 3 3 1.5 3.9
L9 3 3 1.5 3.9
L11 3 3 1.5 3.9
L12 3 3 1.5 3.9

Pada bagian akhir diperoleh bahwa bilangan terbesar dari x adalah 3.9 yang tersimpan
dalam z.

Menukar dua isi dua variabel


Salah satu operasi yang penting dalam memanipulasi data adalah menukarkan isi dua
buah variabel yang umumnya dilakukan menggunakan perintah swap(var1, var2).
30

Agar lebih terasa maknya, variabel yang digunakan sebaiknya merupakan variabel
berindeks xi dengan i = 1, 2.
Algorima menukarkan isi dua variabel
L1. N = 2
L2. i = 1
L3. xi?
L4. i = i + 1
L5. i ≤ N → L3
L6. z = x1
L7. x1 = x2
L8. x2 = z
Tabel 2. Perubahan nilai x1 dan x2 dalam pertukaran nilai dua variabel, misalnya 1.5 dan 4.3.
Langkah N i x1 x2 z
L1 2 - - - -
L2 2 1 - - -
L3 2 1 1.5 - -
L4 2 2 1.5 - -
L5 2 2 1.5 - -
L3 2 2 1.5 4.3 -
L4 2 3 1.5 4.3 -
L5 2 3 1.5 4.3 -
L6 2 3 1.5 4.3 1.5
L7 2 3 4.3 4.3 1.5
L8 2 3 4.3 1.5 1.5

Tabel 2 menggambarkan pada awalnya bahwa x1 = 1.5 dan x2 = 4.3 dan pada akhir
proses pertukaran diperoleh x1 = 4.3 dan x2 = 1.5.

Mengurutkan N variabel
Bila terdapat N buah variabel yang perlu diurutkan, misalnya dari kecil ke besar, maka
langkah-langkah untuk mengurutkannya memerlukan algoritma untuk mencari bilangan
terkecil dari N variabel dan algoritma untuk menukarkan nilai dua buah variabel. Pada
awal algoritma mengurutkan variabel ini juga diperlukan algoritma untuk membaca nila-
nilai variabel yang ingin diurutkan. Algoritma tersebut telah digunakan dalam algoritma
kedua sebelumnya.
Untuk mengurutkan variabel dapat digunakan algoritma kasar berikut
31

L1. Baca N buah data untuk {xi}


L2. j=1
L3. Cari nilai terkecil dari {xi} dan simpan dalam yj
L4. Keluarkan nilai yj dari {xi}
L5. j=j+1
L6. Bila jumlah {xi} masih lebih dari 1 ulangi langkah L3
L7. yi = x1
L8. Tampilkan {yi}

Algoritma di atas memang dibuat lebih singkat dan belum dapat secara teknis mudah
diimplementasikan karena di dalamnya terdapat algoritma-algoritma lain yang perlu
diuraikan, sebagai contoh langkah L1 di atas sebenarnya terdiri dari lima baris dalam
algoritma kedua sebelum algoritma terakhir di atas. Walaupun belum jelas secara teknis
algoritma sebelumnya ini tetap dapat dianalisa menggunakan tabel seperti sebelumnya.
Tabel 3. Nilai-nilai variabel {xi} dan {yi} saat algoritma penguruan variabel dijalankan dengan
contoh data {5, 3, 1, 4, 2}.
Langkah N {xi} j {yj}
L1 5 5, 3, 1, 4, 2 - -
L2 5 5, 3, 1, 4, 2 1 -
L3 5 5, 3, 1, 4, 2 1 1
L4 4 5, 3, 4, 2 1 1
L5 4 5, 3, 4, 2 2 1
L6 4 5, 3, 4, 2 2 1
L3 4 5, 3, 4, 2 2 1, 2
L4 3 5, 3, 4 2 1, 2
L5 3 5, 3, 4 3 1, 2
L6 3 5, 3, 4 3 1, 2
L3 3 5, 3, 4 3 1, 2, 3
L4 2 5, 4 3 1, 2, 3
L5 2 5, 4 4 1, 2, 3
L6 2 5, 4 4 1, 2, 3
L3 2 5, 4 4 1, 2, 3, 4
L4 1 5 4 1, 2, 3, 4
L5 1 5 5 1, 2, 3, 4
L6 1 5 5 1, 2, 3, 4
L7 1 5 5 1, 2, 3, 4, 5
L8 1 5 5 1, 2, 3, 4, 5
32

Dalam baris akhir pada Tabel 3 dapat dilihat bahwa nilai {xi} yang semula tidak urut,
menjadi urut setelah disimpan dalam {yj}.

Pertanyaan
1. Buatlah algoritma untuk memasak nasi goreng di dalam dalam rumah sendiri!
2. Buatlah algoritma untuk menentukan bilangan terkecil dari dua bilangan!
Algoritma yang telah diberikan dapat dimodifikasi.
3. Buatlah algoritma untuk menentukan bilangan terkecil dari N bilangan dan
lakukan analisa dengan membuat tabelnya.
4. Buatlah algoritma yang lebih teknis dari algoritma yang dijelaskan dalam Tabel 3
dalam mengurutkan nilai-nilai suatu variabel berindeks dari besar ke kecil dengan
jumlah komponen N = 4 dan bilangan-bilangannya adalah {3, 0, 8, -2}. Analisa
algoritma tersebut dengan menggunakan tabel.

Rujukan
1. Wikipedia-Autoren, "Algorithmus", Wikipedia, Die freie Enzyklopädie, de:
157082494, 16 Aug 2016 | 10:04.

2. Unknown, "What is a 'computer algorithm'?", HowStuffWorks Tech, URL


http://computer.howstuffworks.com/question717.htm [20160826].
Sparisoma Viridi, 201609040 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Model Mengurutkan Data


diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Terdapat berbagai metode untuk mengurutkan data, baik kecil ke besar ataupun
sebaliknya, yang beberapa diantaranya telah umum dikenal [1]. Dalam bagian ini
disajikan suatu model mengurutkan data sebagai ilustrasi dengan pembawa informasi
berupa balok-balok yang disusun dalam kotaknya.

1 Model kotak turun untuk variabel berindeks tersusun otomatis


Suatu variabel berindeks x digambarkan sebagai kotak yang di dalamnya berisikan
balok-balok sebagai komponennya xi, dengan i = 1 .. N.
x y x y x y

7 7

1 7

3 3 3

0 0 1 0 1
N=4 M=0 N=3 M=1 N=3 M=1

Gambar 1. Proses pemindahan isi antar variabel: keadaan awal (kiri), pemindahan isi variabel
asal x ke variabel tujuan y (tengah), dan pengaturan otomatis variabel asal x (kanan).
Isi dari variabel x pada indeks i dapat dipindahkan ke variabel y dan diletakkan mulai
dari indeks terendah j (dihitung dari paling bawah). Tempat kosong dalam x akan terisi
oleh variabel dengan indeks lebih besar dari indeks isi yang dipindahkan, yang
ilustrasinya diberikan dalam Gambar 1, di mana seakan-akan pengaturan ulang isi x
disebabkan oleh gaya gravitasi yang mengarah ke bawah.

2 Algoritma
Dengan menggunakan model variabel berindeks dalam Gambar 1 dapat dibuat
algoritma mengurutkan data sebagai berikut ini
Algoritma mengurutkan data
L1. Isi variabel berindeks x dengan N buah data
L2. Pesan variabel y dan belum berisi data (M = 0)

33
34

L3. Cari nilai minimum dari x


L4. Pindahkan nilai minimum ini dari x ke y (N = N – 1, M = M + 1)
L5. Bila N > 0 ulangi langkah L3
L6. Tampilkan isi y

Proses pengurutan dari i ke x dapat dilihat dalam Gambar 2, yang tidak lagi ditampilkan
dalam tiga-dimensi melainkan cukup dalam dua-dimensi.

Gambar 2. Proses mengurutkan angka x = {1, 8, 2, 9, 5} ke y = {}: (a)-(i) dan jumlah komponen
masing-masing variabel: (j).
Dalam Gambar 2 terlihat proses pemindahan variabel dari x ke y pada (b), (d), (f), (i),
dan pengurutkan index dalam x pada (c), (e), (h). Isi dalam variabel y tak perlu diurutkan
lagi karena sejak awal pengisiannya telah berurutan.

3 Program
Suatu contoh program diberikan berikut ini yang isi variabelnya dapat diubah-ubah
sesuai dengan kebutuhan.
Kode 1. Salah satu implementasi model mengurutkan variabel dalam C++.
/*
vsm.cpp
Variable Sorting Model

Sparisoma Viridi | dudung@gmail.com


35

Compile: g++ vsm.cpp -o vsm


Execute: ./vsm

20160904
Create this program.
*/

#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>

using namespace std;

string strval(int, int[]);


double min(int, int[]);
void rem(int&, int[], int);

int main(int argc, char *argv[]) {


// Set content of x
int x[] = {1, 8, 2, 9, 5};

// Calculate size of x
int N0 = sizeof(x) / sizeof(int);

// Initial size of x
int N = N0;

// Reserve size of y
int y[N];

// Initial size of y
int M = 0;

// Display header
cout << "# x y" << endl;

while(N >= 0) {
// Find minimum of x
int xmin = min(N, x);

// Display the process


cout << " ";
cout << strval(N, x);
if(N > 0) cout << " ";
cout << " ";
cout << strval(M, y) << endl;
36

// Fill y with xmin


int j = N0 - N;
y[j] = xmin;
M = M + 1;

// Remove xmin from x


rem(N, x, xmin);
}

// Terminate program with success state


return 0;
}

// Display content of int array


string strval(int N, int z[]) {
stringstream ss;
for(int i = 0; i < N; i++) {
ss << z[i];
if(i < N - 1) {
ss << " ";
}
}
return ss.str();
}

// Get minimum value of int array


double min(int N, int z[]) {
double zmin = z[0];
for(int i = 1; i < N; i++) {
if(z[i] < zmin) {
zmin = z[i];
}
}
return zmin;
}

// Pseudo remove of an element of int array


void rem(int &N, int z[], int zi) {
int j = -1;
for(int i = 0; i < N; i++) {
if(z[i] == zi) {
j = i;
}
}
for(int i = j + 1; i < N; i++) {
z[i - 1] = z[i];
}
N = N - 1;
}
37

Hasil eksekusi Kode 1 adalah


$ ./vsm
# x y
1 8 2 9 5
8 2 9 5 1
8 9 5 1 2
8 9 1 2 5
9 1 2 5 8
1 2 5 8 9

Perhatikan bahwa pada awal isi x adalah {1, 8, 2, 9, 5} dan y adalah {} dan pada akhir
isi keduanya adalah {}, dan {1, 2, 5, 8, 9}. Terlihat bahwa x telah kosong dan y telah
berisikan urut nilai komponen-komponennya.
Dalam Kode 1 diberikan beberapa contoh fungsi, yang untuk saat ini cukup dijalankan
saja tanpa perlu memahami detil perintah-perintah penyusunnya, yaitu
string strval(int, int[]);
double min(int, int[]);
void rem(int&, int[], int);

Fungsi strval() berfungsi untuk mengubah isi int array menjadi string untuk
kemudian dapat ditampilkan, fungsi min() untuk mencari nilai minimum dari int
array, dan fungsi rem untuk menghilangkan satu komponen dari int array. Dalam fungsi
terakhir ini komponen yang dimaksud tidak benar-benar dihilangkan melainkan hanya
disusun ulang dan nilai jumlah komponen dikurangi s atu.

4 Mengurangi jumlah variabel


Dalam model yang telah dibahas terdapat dua variabel, yaitu x dan y. Alangkah lebih
efisien bila hanya satu variabel yang digunakan, misalnya x saja. Secara langsung, pada
akhir program di atas dapat disalinkan isi y ke x sehingga seakan-akan tidak terdapat
variabel y, akan tetapi hal tidak mengurangi proses yang kurang efisien. Hal yang lebih
tepat adalah sejak awal hanya menggunakan satu variabel. Untuk itu diperlukan suatu
fungsi baru
swap(int, int)

yang berfungsi untuk menukarkan isi kedua variabel argumennya. Lebih detil
pemanfaatan fungsi ini akan dibahas pada bagian ber ikutnya.

5 Bubble sort
Salah satu metode mengurutkan bilangan adalah bubble sort [2], yang menggunakan
hanya satu variabel. Nilai maksimum (atau pun minimum) ditukarkan nilai-nilainya
38

dalam suatu variabel berindeks, sehingga pada akhirnya urutan nilai-nilai dalam variabel
tersebut akan bersesuaian dengan urutan indeksnya. Secara singkat algoritmanya
adalah sebagai berikut
Algoritma bubble sort (kecil ke besar)
L1. x1, .., xN?
L2. i = 1
L3. j = i + 1
L4. xi < xj → L6
L5. xi ↔ xj
L6. j > N – 1 → L9
L7. j = j + 1
L8. → L4
L9. i > N – 2 → L12
L10. i = i + 1
L11. → L3
L12. ?x1, .., xN

Tabel 1 memberikan hasil analisa algoritma bubble sort yang mengurutkan bilangan
kecil ke besar. Bilangan {5, 8, 2, 1} (berwarna merah) adalah awal sebelum diurutkan
dan {1, 2, 5, 8} (berwarna biru) adalah akhir setelah diurutkan. Dalam tabel tersebut
bilangan yang diberi kotak adalah dua nilai yang dipertukarkan dengan fungsi swap().
Tabel 1. Analisa algoritma bubble sort (kecil ke besar).
39

Kode 2. Implementasi bubble sort (kecil ke besar).


/*
bsort.cpp
Bubble sort

Sparisoma Viridi | dudung@gmail.com

Compile: g++ bsort.cpp -o bsort


Execute: ./bsort

20160904
Create this program as advancing from vsm.cpp.
*/

#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>

using namespace std;

string strval(int, int[]);


void swap(int&, int&);

int main(int argc, char *argv[]) {


// Set content of x
int x[] = {5, 8, 2, 1};

// Calculate size of x
int N = sizeof(x) / sizeof(int);

// Show initial order


cout << "#x1\tx2\tx3\tx4" << endl;
cout << strval(N, x) << endl;
cout << endl;

// Show header
cout << "#i\tj\tx1\tx2\tx3\tx4" << endl;

// Do the process and show for each step


for(int i = 0; i < N; i++) {
for(int j = i + 1; j < N; j++) {
if(x[i] > x[j]) {
swap(x[i], x[j]);
}
40

cout << i + 1 << "\t";


cout << j + 1 << "\t" ;
cout << strval(N, x) << endl;
}
}

// Show final order


cout << endl;
cout << "#x1\tx2\tx3\tx4" << endl;
cout << strval(N, x) << endl;

// Terminate program with success state


return 0;
}

// Display content of int array


string strval(int N, int z[]) {
stringstream ss;
for(int i = 0; i < N; i++) {
ss << z[i];
if(i < N - 1) {
ss << "\t";
}
}
return ss.str();
}

// Swap two integers


void swap(int &x, int &y) {
int z = x;
x = y;
y = z;
}

Perhatikan bahwa Kode 2 ini memiliki baris kode yang lebih sedikit dari Kode 1, yaitu
yang semula 104 baris telah tereduksi menjadi hanya 78 baris. Hasil eksekusi Kode 2
adalah
$ ./bsort
#x1 x2 x3 x4
5 8 2 1

#i j x1 x2 x3 x4
1 2 5 8 2 1
1 3 2 8 5 1
1 4 1 8 5 2
2 3 1 5 8 2
41

2 4 1 2 8 5
3 4 1 2 5 8

#x1 x2 x3 x4
1 2 5 8

Langkah L5 merupakan baris di mana fungsi swap() diterapkan, yang hasilnya dapat
dilihat dalam Tabel 1 sebelumnya.
Kode 3. Implementasi bubble sort dengan mengunakan fungsi sort().
/*
bsortf.cpp
Bubble sort in function

Sparisoma Viridi | dudung@gmail.com

Compile: g++ bsort.cpp -o bsort


Execute: ./bsort

20160904
Create this program as advancing from bsort.cpp.
*/

#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>

using namespace std;

string strval(int, int[]);


void swap(int&, int&);
void sort(int, int[]);

int main(int argc, char *argv[]) {


// Set content and calculate size of x
int x[] = {5, 8, 2, 1};
int N = sizeof(x) / sizeof(int);

// Show initial x, process x, dan show final x


cout << strval(N, x) << endl;
sort(N, x);
cout << strval(N, x) << endl;

// Terminate program with success state


return 0;
}
42

// Display content of int array


string strval(int N, int z[]) {
stringstream ss;
for(int i = 0; i < N; i++) {
ss << z[i];
if(i < N - 1) {
ss << "\t";
}
}
return ss.str();
}

// Swap two integers


void swap(int &x, int &y) {
int z = x;
x = y;
y = z;
}

// Sort an int array


void sort(int N, int x[]) {
for(int i = 0; i < N; i++) {
for(int j = i + 1; j < N; j++) {
if(x[i] > x[j]) {
swap(x[i], x[j]);
}
}
}
}

Perhatikan bahwa kode dalam program utama atau fungsi main() semakin singkat dan
jumlah total baris kode menjadi 68. Hasil Kode 3 adalah
$ ./bsortf
5 8 2 1
1 2 5 8

6 Membuat pustaka
Bila fungsi sort(), strval(), dan swap() sering digunakan, ketiga fungsi tersebut
dalam ditempatkan dalam suatu berkas pustaka, misalnya saja bsort.h yang isinya
adalah sebagaimana dalam Kode 4. Pustaka ini akan membuat fungsi kode bsortl.cpp
menjadi lebih singkat seperti diberikan dalam Kode 5.
43

Kode 4. Pustaka bsort.h untuk bubble sort dari kecil ke besar.


/*
bsort.h
Bubble sort related functions

20160904
Create this library as advancing from bsortf.cpp.
*/

#include <sstream>
#include <cstring>
#include <cmath>

#ifndef BSORT_H
#define BSORT_H

using namespace std;

// List of functions
string strval(int, int[]);
void swap(int&, int&);
void sort(int, int[]);

// Display content of int array


string strval(int N, int z[]) {
stringstream ss;
for(int i = 0; i < N; i++) {
ss << z[i];
if(i < N - 1) {
ss << "\t";
}
}
return ss.str();
}

// Swap two integers


void swap(int &x, int &y) {
int z = x;
x = y;
y = z;
}

// Sort an int array


void sort(int N, int x[]) {
for(int i = 0; i < N; i++) {
for(int j = i + 1; j < N; j++) {
if(x[i] > x[j]) {
44

swap(x[i], x[j]);
}
}
}
}

#endif

Pustaka bsort.h digunakan dalam program bsortl.cpp berikut ini.


Kode 5. Program bsortl.cpp yang menggunakan pustaka bsort.h.
/*
bsortl.cpp
Bubble sort using librarty

Sparisoma Viridi | dudung@gmail.com

Compile: g++ bsort.cpp -o bsort


Execute: ./bsort

20160904
Create this program as advancing from bsortf.cpp.
*/

#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>

#include "bsort.h"

using namespace std;

int main(int argc, char *argv[]) {


// Set content and calculate size of x
int x[] = {5, 8, 2, 1};
int N = sizeof(x) / sizeof(int);

// Show initial x, process x, dan show final x


cout << strval(N, x) << endl;
sort(N, x);
cout << strval(N, x) << endl;

// Terminate program with success state


return 0;
}
45

Semua fungsi-fungsi yang digunakan telah disimpan dalam pustakan bsort.h, yang dapat
pula dipanggil oleh fungsi-fungsi lain yang membutu hkannya. Cara memangilnya adalah
dengan menyertakan baris kode berikut
#include "bsort.h"

dalam program yang akan menggunakannya.

7 Modifikasi fungsi sort()


Fungsi sort() yang ada hanya dapat mengurutkan bilangan bulat dari kecil ke besar, agar
dapat pula mengurutkan dari besar ke kecil perlu dibuat fungsi lain, misalnya terdapat
fungsi-fungsi
sorta()
sortd()

yang masing-masing berarti mengurutkan dari kecil ke besar (ascending) dan


mengurutkan dari besar ke kecil (descending) atau didefinisikan satu fungsi saja
sort(.., .., dir)

yang mengakomodasi arah dir dari pengurutkan, misalnya 0 untuk kecil ke besar dan
lainnya untuk besar ke kecil. Berikut ini disajikan kode untuk pilihan kedua.
Kode 6. Modifikasi fungsi sort() dalam pustaka bsort.h.
void sort(int N, int x[], int dir) {
for(int i = 0; i < N; i++) {
for(int j = i + 1; j < N; j++) {
bool SWAP = (dir == 0) ? x[i] > x[j] : x[i] < x[j];
if(SWAP) {
swap(x[i], x[j]);
}
}
}
}

Definisi fungsi sebelumnya dapat tetap dibiarkan dan C++ mengakomodasi hal ini, yaitu
fungsi dengan dua atau lebih nama sama diperbolehkan asalkan argumen yang
diperlukannya berbeda
void sort(int N, int x[])
void sort(int N, int x[], int dir)

di mana hal ini termasuk dalam overloading functions. Membiarkan fungsi yang lama
akan menjamin kompatibilitas ke program-program yang menggunakan fungsi yang
46

lama agar dapat tetap berjalan. Bila fungsi versi lama dihapus, program-program
tersebut saat dikompilasi akan memberikan pesan kesalahan. Dengan menggunakan
fungsi yang baru, penerapan dalam program
sort(N, x, 0);

akan memberikan
$ ./bsortl
5 8 2 1
1 2 5 8

sedangkan bila digunakan


sort(N, x, 1);

akan menghasilkan keluaran


$ ./bsortl
5 8 2 1
8 5 2 1

Dengan mengubah argumen terakhir dari fungsi sort() dapat dipilih cara pengurutan,
yaitu kecil ke besar (0) atau sebaliknya (1).

8 Pertanyaan
1. Bila ingin dibuat fungsi yang implementasinya adala h
sort(N, x, ASCENDING);
sort(M, y, DESCENDING);
bagaimanakah kira-kira caranya? Apa variabel-variabel baru yang perlu
didefinisikan? Jelaskan!
2. Buat suatu fungsi untuk menentukan nilai minimum da ri suatu variabel berindeks
dengan implementasinya
double xmax = max(N, x);

9 Rujukan
1. Wikipedia contributors, "Sorting algorithm", Wikipedia, The Free Encyclopedia,
en:736299445, 26 Aug 2016 | 14:47.
2. Brad Miller, David Ranum, "5.7. The Bubble Sort" in Problem Solving with
Algorithms and Data Structures using Python, Luther College, URL http
://interactivepython.org/runestone/static/pythonds/SortSearch/TheBubbleSort
.html [20160904].
Sparisoma Viridi, 201609041 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Regresi Linier
diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Pasangan data {xi, yi} dengan i = 1, .., N dapat dimodelkan secara linier dengan
berbagai cara, seperti grafik melalui pertimbangan visual (sembarang, sentroid atau
melalui suatu titik tertentu), atau dengan regresi linier [1] melalui metode kuadrat
terkecil [2].

1 Penentuan secara visual


Persamaan garis dalam bentuk
y = c 0 + c1 x (1)

agar sebanyak mungkin melewati pasangan data {xi, yi} dengan i = 1, .., N dapat
dilakukan secara visual yang umummnya dilakukan dengan terlebih dahulu
menggambarkan titik-titik data menggunakan kertas grafik, lalu menggambarkan suatu
persamaan garis secara subyektif. Persamaan garis yang baik adalah yang sebanyak
mungkin melewati titik-titik data.
Dapat pula didefinisikan suatu titik acuan (xo, yo) yang merupakan titik sembarang
tetapi memiliki makna fisis, ataupun nilai ini merupakan titik rata-rata data
N
1
x avg =
N
∑x
i =1
i , (2)

N
1
y avg =
N
∑y
i =1
i . (3)

Titik origin (0, 0) dapat pula merupakan kandidat dari titik (xo, yo) yang harus dilewati
Persaman (1).

2 Kuadrat terkecil
Kesalahan pemodelan dari Persamaan (1) terhadap suatu data (xi, yi) dapat dirumuskan
dalam bentuk

ε i = [ y i − (c0 + c1 xi )]2 , (4)

di mana bentuk kuadrat dipilih agar memastikan nilai εi yang berharga positif tidak
saling berkompensai dengan nilai εi yang berharga negatif, yang akan terjadi bila bukan

47
48

berbentuk kuadrat. Selanjutnya kesalahan total untuk seluruh data adalah


N
ε = ∑εi . (5)
i =1

Persoalan berikutnya adalah bagaimana menentukan c0 dan c1 agar nilai ε minimum.


Untuk itu c0 dan c1 merupakan variabel bebas. Perhatikan bahwa dalam hal ini {xi, yi}
adalah konstanta yang tidak dapat berubah karena merupakan data. Persamaan (5)
diminimumkan melalui
∂ε
=0 (6)
∂c 0

dan
∂ε
= 0. (7)
∂c1

Persamaan (4) – (6) akan memberikan


N

∑ (y
i =1
i − c 0 − c1 x i ) = 0 , (8)

sedangkan Persamaan (4), (5), dan (7) akan memberikan

∑ (x y )
N

i i − c 0 xi − c1 xi2 = 0 . (9)
i =1

Persamaan (8) dan (9) tak lain adalah persamaan dengan dua konstanta yang tidak
diketahui, yaitu c0 dan c1. Dengan melakukan substitusi maka nilai kedua konstanta
tersebut, sebagai fungsi dari {xi, yi} dengan i = 1, .., N, dapat diperoleh.
Persamaan (8) dapat dituliskan kembali menjadi
N N

∑y
i =1
i − c 0 N − c1 ∑ xi = 0 ,
i =1
(10)

dan Persamaan (9) menjadi


N N N

∑x y
i =1
i i − c0 ∑ xi − c1 ∑ xi2 = 0 .
i =1 i =1
(11)

Temukan rumusan c0 dari Persamaan (10) dan substitusikan ke dalam Persamaan (11)
sehingga diperoleh
49

N N N

∑x ∑ y
i =1
i
i =1
i −N ∑x y
i =1
i i
c1 = N N N
. (12)
∑x ∑x
i =1
i
i =1
i −N ∑x
i =1
2
i

Substitusi Persamaan (12) ke Persamaan (10) akan memberikan


N N N N

∑x ∑x y −∑x ∑y
i =1
i
i =1
i i
i =1
2
i
i =1
i
c0 = N N N
. (13)
∑x ∑x
i =1
i
i =1
i −N ∑x
i =1
2
i

Persamaan (12) dan (13) merupakan persamaan untuk menentukan c0 dan c1. Selain itu
didefinisikan pula

( )( )
N
SS xy = ∑ xi − x avg y i − y avg , (14.a)
i =1

( )( )
N
SS xx = ∑ xi − x avg xi − x avg , (14.a)
i =1

( )( )
N
SS yy = ∑ y i − y avg y i − y avg , (14.a)
i =1

sehingga dapat dihitung

SS 2xy
R2 = , (15)
SS xx SS yy

yang merupakan koefisien determinasi dengan bentuk lainnya [3] adalah


N N N
N ∑x y −∑x ∑ y
i =1
i i
i =1
i
i =1
i
R2 = . (16)
 N  N  
2
N
 N  
2


 N xi2
 i =1

− x i    N
 i =1   
∑ i =1
y − y i  
2
i
 i =1  

3 Algoritma
Algoritma untuk penentuan c0, c1, dan R2 adalah sebagai berikut ini
Algoritma regresi linier
L1. (x1, y1), .., (xN, yN)?
L2. Sx = 0, Sy = 0, Sxy = 0, Sxx = 0
50

L3. i = 1
L4. Sx = Sx + xi, Sy = Sy + yi, Sxy = Sxy + xiyi, Sxx = Sxx + xi2
L5. i ≥ N → L8
L6. i = i + 1
L7. → L4
L8. c0 = (Sx Sxy – Sxx Sy) / (Sx2 –N Sxx), c1 = (Sx Sy – N Sxy) / (Sx2 –N Sxx), xavg = Sx /N, yavg = Sy /N
L9. SSxx = 0, SSyy = 0, SSxy = 0
L10. i = 1
2 2
L11. SSxx = SSxx + (xi – xavg) , SSyy = SSyy + (yi – yavg) , SSxy = SSxy + (xi – xavg)(yi – yavg),
L12. i ≥ N → L15
L13. i = i + 1
L14. → L11
L15. R2 = SSxy2 / (SSxx SSyy)
L16. ?c0, c1, R2
Langkah-langkah L1, L2, L4, L8, L9, L11, dan L16 dapat dijabarkan dalam beberapa langkah
apabila dirasakan terlalu kompleks, misalnya untuk langkah L16 dapat dijabarkan dalam tiga
baris, di mana masing-masing baris hanya menampilkan c0, c1, dan R2 sebagai keluaran.
Penggabungan langkah-langkah dalam satu baris untuk mereduksi jumlah baris dalam algoritma.

4 Implementasi dari C++


Suatu program dalam C++ dapat dibangun untuk mengimplementasikan algoritma
regresi linier sebelumnya. Program yang disajikan ini merupakan salah satu
implementasi yang dapat dilakukan. Terdapat tak-berhingga ragam implementasi suatu
algoritma dalam suatu program.
Kode 1. Program regresi linier.
/*
linreg.cpp
Linear regression using formula from least square method

Sparisoma Viridi | dudung@gmail.com

Compile: g++ linreg.cpp -o linreg


Execute: ./linreg

20160904
Create this program.
*/

#include <iostream>
#include <sstream>
#include <cstring>
51

#include <cmath>

using namespace std;

string strval(int, int[]);

int main(int argc, char *argv[]) {


// Set content of, calculate size of, and show x and y
int x[] = {1, 2, 3, 4, 5};
int y[] = {3, 5, 7, 9, 10};
int N = sizeof(x) / sizeof(int);
cout << strval(N, x) << endl;
cout << strval(N, y) << endl;

// Define Sx, Sy, Sxx, Sxy and calculate them


double Sx = 0, Sy = 0, Sxx = 0, Sxy = 0;
for(int i = 0; i < N; i++) {
Sx += x[i];
Sy += y[i];
Sxy += (x[i] * y[i]);
Sxx += (x[i] * x[i]);
}

// Calculate c0 and c1
double c0 = (Sx * Sxy - Sxx * Sy) / (Sx * Sx - N * Sxx);
double c1 = (Sx * Sy - N * Sxy) / (Sx * Sx - N * Sxx);

// Calculate xavg and yavg


double xavg = Sx / N;
double yavg = Sy / N;

// Define SSxx, SSyy, Sxy, and calculate them


double SSxx = 0, SSyy = 0, SSxy = 0;
for(int i = 0; i < N; i++) {
SSxx += (x[i] - xavg)*(x[i] - xavg);
SSyy += (y[i] - yavg)*(y[i] - yavg);
SSxy += (x[i] - xavg)*(y[i] - yavg);
}

// Calculate R2
double R2 = SSxy * SSxy / (SSxx * SSyy);

// Show results
cout << c0 << "\t";
cout << c1 << "\t";
cout << R2 << endl;

// Terminate program with success state


return 0;
52

// Display content of int array


string strval(int N, int z[]) {
stringstream ss;
for(int i = 0; i < N; i++) {
ss << z[i];
if(i < N - 1) {
ss << "\t";
}
}
return ss.str();
}

Hasil dari Kode 1 adalah


$ ./linreg
1 2 3 4 5
3 5 7 9 10
1.4 1.8 0.987805

di mana baris pertama merupakan {x}, baris kedua {y}, dan baris ketiga merupakan c0,
c1, dan R2. Sebagai konfirmasi data yang sama digunakan dalam Microsoft Excel dan
dilakukan fitting dengan opsi trendline linier, yang hasilnya diberikan dalam Gambar 1.
12

10

y 6
y = 1.8x + 1.4
4 R² = 0.987

0
0 1 2 3 4 5 6
x
Gambar 1. Hasil fitting dengan fitur trendline pada Microsoft Excel.
Hasil yang diperoleh dari program linreg sama dengan hasil yang diperoleh
menggunakan aplikasi spreadsheet yang telah umum digunakan. Dengan demikian baik
algoritma maupun program yang dibuat untuk saat ini telah memberikan hasil yang
benar.
53

5 Pencarian secara numerik


Nilai c0 dan c1 dapat pula dicari secara numerik apabila Persaman (6) dan (7) tidak dapat
tercapai. Salah satu metode yang dapat digunakan adalah gradient descent [4]

cij +1 = cih − γ ∇ i ε . (17)

di mana dalam hal ini



∇i = , (18)
∂ci

j merupakan indeks iterasi, i = 0, 1, dan γ merupakan suatu kontanta yang bernilai kecil.
Untuk itu, diperlukan kedua ungkapan berikut
N
∂ε
= −2 [ yi − c0 − c1 xi ] ,
∑ (19)
∂c0 i =1

N
∂ε
∂c1
= −2 ∑[
i =1
xi y i − c 0 xi − c1 x i2 . ] (20)

Substitusi Persaman (19) dan (20) ke Persaman (17) sehingga dapat diperoleh
N
c 0j +1 = c 0j + 2γ ∑ [y
i =1
i − c 0 − c1 xi ] , (21)

N
c1j +1 = c1j + 2γ ∑ [x y
i =1
i i − c 0 xi − c1 xi2 , ] (22)

yang terus menerus dilakukan sampai Persamaan (5) memberikan nilai cukup kecil bila
tidak bisa nol. Untuk itu diperlukan tebakan awal c00 dan c10.
Algoritma regresi linier dengan gradient descent
L1. (x1, y1), .., (xN, yN)?
L2. c00, c10?
L3. γ, εeps, jmax?
L4. j = 1
L5. ∆c0 = 0, ∆c1 = 0
L6. i = 1
L7. ∆c0 = ∆c0 + 2γ (yi – c0j-1 – c1j-1 xi)
L8. ∆c1 = ∆c1 + 2γ (xi yi – c0j-1 xi – c1j-1 xi2)
L9. i = i + 1
L10. i < N + 1 → L7
L11. c0 = c0 + ∆c0
54

L12. c1 = c1 + ∆c1
L13. ε = 0
L14. i = 1
2
L15. ε = ε + (yi – c0 – c1 xi)
L16. i = i + 1
L17. i < N + 1 → L15
L18. εj = ε
L19. j = j + 1
L20. j < 3 → L5
L21. ∆ε = εj-1 – εj-2
L22. ε > εeps ∧ j < jmax → L5
L23. Sx = 0, Sy = 0
L24. i = 1
L25. Sx = Sx + xi, Sy = Sy + yi
L26. i = i + 1
L27. i < N + 1 → L25
L28. xavg = Sx / N, yavg = Sy / N
L29. SSxx = 0, SSyy = 0, SSxy = 0
L30. i = 1
2 2
L31. SSxx = SSxx + (xi – xavg) , SSyy = SSyy + (yi – yavg) , SSxy = SSxy + (xi – xavg)(yi – yavg),
L32. i = i + 1
L33. i < N + 1 → L31
L34. c0 = c0j-1, c1 = c1j-1
L35. R2 = SSxy2 / (SSxx SSyy)
L36. ?j, c0, c1, R2

Terdapat hal menarik di sini, bahwa langkah L31 hanya bergantung dari data {xi, yi} dan
tidak bergantung dari c0 dan c1 yang diperoleh secara numerik. Untuk ke depan
diperlukan rumusan R2 yang bergantung c0 dan c1 yang diperoleh sehingga nilai R2 dapat
menjadi kriteria penghentian program.
Keluaran dari program dalam Kode 2 bergantung dari jumlah iterasi yang digunakan,
misalnya
$ ./linreg-gd
1 2 3 4 5
3 5 7 9 10
200 1.39443 1.80154 0.987805

dan
$ ./linreg-gd
1 2 3 4 5
55

3 5 7 9 10
500 1.39997 1.80001 0.987805

untuk 200 dan 500 iterasi. Nilai c0 = 1.4 dan c1 = 1.8 dapat diperoleh saat jmax > 611.
Kode 2. Program regresi linier dengan gradient descent.
/*
linreg-gd.cpp
Linear regression using gradient descent

Sparisoma Viridi | dudung@gmail.com

Compile: g++ linreg-gd.cpp -o linreg-gd


Execute: ./linreg-gd

20160904
Create this program.
*/

#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>

using namespace std;

string strval(int, int[]);

int main(int argc, char *argv[]) {


// Set content of, calculate size of, and show x and y
int x[] = {1, 2, 3, 4, 5};
int y[] = {3, 5, 7, 9, 10};
int N = sizeof(x) / sizeof(int);
cout << strval(N, x) << endl;
cout << strval(N, y) << endl;

// Set initial c0, c1, g;


double c0 = 1;
double c1 = 1;
double g = 0.01;

// Define termination parameters


double erreps = 1E-4;
double err = 100;
int jmax = 611;

// Set iteration index and perform iteration


int j = 1;
56

while(err > erreps && j < jmax) {


// Calculate change of c0 and c1
double dc0 = 0, dc1 = 0;
for(int i = 0; i < N; i++) {
dc0 += 2 * g * (y[i] - c0 - c1*x[i]);
dc1 += 2 * g * (x[i]*y[i] - c0*x[i] - c1*x[i]*x[i]);
}

// Change c0 and c1
c0 += dc0;
c1 += dc1;

// Calculate error with new c0 and c1


err = 0;
for(int i = 0; i < N; i++) {
err += (y[i] - c0 - c1*x[i])*(y[i] - c0 - c1*x[i]);
}
j += 1;
}

// Define Sx, Sy, Sxx, Sxy and calculate them


double Sx = 0, Sy = 0, Sxx = 0, Sxy = 0;
for(int i = 0; i < N; i++) {
Sx += x[i];
Sy += y[i];
}

// Calculate xavg and yavg


double xavg = Sx / N;
double yavg = Sy / N;

// Define SSxx, SSyy, Sxy, and calculate them


double SSxx = 0, SSyy = 0, SSxy = 0;
for(int i = 0; i < N; i++) {
SSxx += (x[i] - xavg)*(x[i] - xavg);
SSyy += (y[i] - yavg)*(y[i] - yavg);
SSxy += (x[i] - xavg)*(y[i] - yavg);
}

// Calculate R2
double R2 = SSxy * SSxy / (SSxx * SSyy);

// Show results
cout << j << "\t";
cout << c0 << "\t";
cout << c1 << "\t";
cout << R2 << endl;
57

// Terminate program with success state


return 0;
}

// Display content of int array


string strval(int N, int z[]) {
stringstream ss;
for(int i = 0; i < N; i++) {
ss << z[i];
if(i < N - 1) {
ss << "\t";
}
}
return ss.str();
}

Untuk data x = {1, 2, 3, 4, 5}, y = {3, 5, 7, 9, 11}, γ = 0.01, jmax = 1000, εeps = 10-12
diperoleh hasil berikut
$ ./linreg-gd
1 2 3 4 5
3 5 7 9 11
729 1 2 1

sebagaimana diharapkan. Hasil terakhir merupakan tes bila ε masih dapat mencapai
nilai nol sehingga diperlukan nilai εeps yang cukup kecil. Bila kondisi ini tidak dapat
tercapai jmax akan berperan untuk menghentikan iterasi.
2.002
2
1.998
1.996
c 1 1.994
1.992
1.99
1.988
1.986
0.99 1 1.01 1.02 1.03 1.04 1.05
c0
Gambar 2. Perubahan nilai c0 dan c1 untuk x = {1, 2, 3, 4, 5}, y = {3, 5, 7, 9, 11}, γ = 0.01, dan
-12
εeps = 10 , serta jmax = 100 + 50n, n = 0, .., 11.
58

Perubahan nilai c0 dan c1 dengan bertambahnya j dapat dilihat dalam Gambar 2, yang
umumnya tidak harus linier.

6 Regresi polinomial
Dalam statistik salah satu bentuk regresi linier bilamana hubungan antara variabel
bebas x dan variabel tidak bebas y dimodelkan dalam bentuk polinomial berderajat M,
M
y = ∑ cm x m , (23)
m=0

disebut sebagai regresi polinomial [5]. Untuk model dengan N = 1 telah diperoleh
sebelumnya dua persamaan dalam c0 dan c1, yaitu Persamaan (10) dan (11) yang dapat
dituliskan kembali dalam bentuk matriks sebagai berikut

 N N
  N 
 ∑1 ∑ x  c 
i  ∑ yi 
 Ni =1    =  Ni =1 ,
i =1 0
N (24)
 x 2   c1   xi y i 
∑ ∑ ∑
xi
i =1
i
i =1
 i =1


dengan mengunakan hubungan


N
N = ∑1 . (25)
i =1

Dengan mengamati polanya Persamaan (24) dapat diperluas menjadi

 N N N N     N 
 ∑1 ∑x ∑x ∑x c0   ∑ yi
2 M
i i L i   
 i =1 i =1 i =1 i =1     Ni =1 
 N    
c1   ∑ xi yi
N N N

 ∑ xi ∑x ∑x ∑x
2 3 M +1
i i L i   
 iN=1 i =1 i =1 i =1
   =  iN=1 , (26)
 N N N
  c2   ∑ xi2 yi 
 ∑ xi ∑x ∑x ∑x
2 3 4 M +2
L 
i i i
   i =1 
 Mi =1 i =1
M
i =1
M O
i =1
M   M   M 
N N N N
   N 
 xM   
∑ ∑x ∑x ∑x
M +1 M +2
L 2M  cM  ∑ xiM yi
i =1
i
i =1
i
i =1
i
i =1
i
    i =1 

yang telah ditunjukkan sebelumnya [6]. Persamaan (26) tidak dapat dengan mudah
diselesaikan dengan cara sebelumnya sehingga dapat memperoleh Persamaan (12) dan
(13), melainkan memerlukan cara lain. Persamaan (26) tak lain merupakan kumpulan
persamaan linier yang dituliskan dalam bentuk matriks, di mana salah satu penyele-
saiannya adalah dengan menggunakan eliminasi Gauss [7]. Detil mengenai penyelesaian
persamaan linier ini akan dibahas dalam bagian lain
59

7 Pertanyaan
1. Tunjukkan bagaimana Persamaan (15) dapat diubah menjadi Persamaan (16)!
2. Ubahkan program dalam Kode 1 sehingga dapat membaca masukan dari file yang
isinya setiap baris merupakan pasangan data {xi, yi} seperti
# x y
1 2.1
2 3.9
3 6
4 8.1
5 9.9

3. Bagaimanakan bentuk rumusan ci bila metode kuadrat terkecil diterapkan untuk


N
mencari koefisien-koefisien dari persamaan y = ∑ ci x i ?
i =1

4. Gambarkan dalam ruang c0 dan c1 bagaimana proses perubahan nilai-nilainya


sehingga tercapai ε yang minimum! Jelaskan pula apakah proses ini telah cukup
efisien secara subyektif dengan hanya melihat bentuk lintasannya? Gunakan data
dari Soal 2.

8 Rujukan
1. Wikipedia-Autoren, "Lineare Regression", Wikipedia, Die freie Enzyklopädie,
de:157575928, 1 Sep 2016 | 15:10.
2. Wikipedia contributors, "Least squares", Wikipedia, The Free Encyclopedia,
en:737023359, 31 Aug 2016 | 08:46.
3. Stephanie, "Coefficient of Determination (R Squared): Definition, Calculation",
Statistics How To, 2016, URL http://www.statisticshowto.com/what-is-a-
coefficient-of-determination/ [20160904].
4. Wikipedia contributors, "Gradient descent", Wikipedia, The Free Encyclopedia,
en:737511475, 3 Sep 2016 | 08:42.
5. Wikipedia contributors, "Polynomial regression", Wikipedia, The Free
Encyclopedia, en:731752358, 27 Jul 2016 | 09:04.
6. A. Panduwirawan, L. Haris, G. W. P. Data, F. D. E. Latief, S. Viridi, "Program
Sederhana untuk Regresi Polinomial Orde n Berbasis C++", Prosiding Seminar
Kontribusi Fisika 2011 (SKF 2011), Eds. F. D. E. Latief et al., Bandung, Indonesia, 1-
2 Desember 2011, pp. 198-205.
60

7. Eric W. Weisstein, "Gaussian Elimination", from MathWorld--A Wolfram Web


Resource, URL http://mathworld.wolfram.com/GaussianElimination.html
[20160905].
Sparisoma Viridi, 201609050 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Sistem Persamaan Linier


diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Sistem persamaan linier, yang merupakan kumpulan persamaan-persamaan linier,


dapat diselesaikan dengan berbagai metode seperti inversi matriks, reduksi baris [1],
dan beberapa metode lainnya. Sistem persamaan linier sendiri merupakan hasil dari
upaya untuk memecahkan suatu permasalahan tertentu, seperti arus listrik dalam
rangkaian multi simpul.

1 Sistem persamaan linier


Suatu persamaan linier dengan N variabel x1, .., xN memiliki bentuk
N
yj = ∑c
i =1
ji xi . (1)

Ragam Persamaan (1) dapat berjumlah M buah persamaan (j = 1, .., M). Kumpulan
persamaan-persamaan tersebutlah yang dinamakan sistem persamaan linier
y1 = c11x1 + c12x2 + .. + c1NxN
y2 = c21x1 + c22x2 + .. + c2NxN
y3 = c31x1 + c32x2 + .. + c3NxN (2)
..
yM = cM1x1 + cM2x2 + .. + cMNxN
yang dapat dituliskan dalam bentuk matriks
CX = Y . (3)

atau eksplisitnya

 c11 c12 c13 L c1n   x1   y1 


c c22 c23 L c2 n  x   y 
 21  2  2 
 c31 c32 c33 L c3 n   x3  =  y 3  . (4)
     
 M M M O M  L  L 
cm1 cm 2 cm3 L cmn   xn   y m 

Persamaan (4) dapat pula dituliskan dalam bentuk

61
62

 c11 c12 c13 L c1n y1 


 
 c21 c 22 c 23 L c2n y2 
 c31 c32 c33 L c3 n y 3  , (5)
 
 M M M O M L
c cm 2 cm 3 L cmn y m 
 m1
yang dikenal sebagai matriks teraugmentasi. Agar Persamaan (2) dapat diselesaikan,
maka dibutuhkan syarat bahwa M = N sehingga matriks C merupakan matriks
bujursangkar.
Terdapat tiga operasi dasar pada matriks:
(i) pertukaran baris,
(ii) mengalikan/membagi suatu baris dengan bilangan riil,
(iii) menjumlahan/mengurangkan dua baris.
Hasil dari (ii) dan (iii) diletakkan pada suatu bar is menggantikan nilai sebelumnya pada
baris tersebut.
Dengan menggunakan operasi-operasi dasar tersebut Persamaan (5) dapat diubah
menjadi bentuk baris echelon

d11 d12 d13 L d1n z1 


 
0 d 22 d 23 L d 2 n z 2 
0 0 d 33 L d 3n z 3  . (6)
 
 M M M O M L
0 0 0 L d nn z n 

Nilai-nilai x1, .., xN dapat diperoleh bila matriks dalam bentuk baris echelon dapat diubah
menjadi bentuk

1 0 0 L 0 x1 
 
0 1 0 L 0 x2 
0 0 1 L 0 x3  , (7)
 
M M M O M L
0 0 0 L 1 xn 

di mana nilai-nilai yang dicari terletak pada kolom ke-M.
63

2 Algoritma
Dari matriks dengan bentuk baris echelon nilai-nilai x1, .., xN dapat diperoleh dengan
menggunakan algoritma berikut
Algoritma penyelesaikan baris echelon
L1. i = n
L2. Sdx = 0
L3. j = i
L4. j ≥ n  L8
L5. j = j + 1
L6. Sdx = Sdx + dij ∙ xj
L7. j < n  L5
L8. xi = (zi – Sdx) / dii
L9. i = i – 1
L10. i > 1  L2

Tabel 1. Analisa dari algoritma penyelesaian baris echelon (bagian 1).


LK Lx i j xi Sdx

1 L1 n - - -

L2 n - - 0

L3 n n - 0

L4 n n - 0

L8 n n (zn – Sdx) / dn,n 0

L9 n–1 n - 0

L10 n–1 n - 0

2 L2 n–1 n - 0

L3 n–1 n–1 - 0

L4 n–1 n–1 - 0

L5 n–1 n - 0

L6 n–1 n - dn-1,n ∙ xn

L7 n–1 n - dn-1,n ∙ xn

L8 n–1 n (zn-1 – Sdx) / dn-1,n-1 dn-1,n ∙ xn

L9 n–2 n - dn-1,n ∙ xn

L10 n–2 n - dn-1,n ∙ xn


64

Tabel 2. Analisa dari algoritma penyelesaian baris echelon (bagian 2).


LK Lx i j xi Sdx

3 L2 n–2 n - 0

L3 n–2 n–2 - 0

L4 n–2 n–2 - 0

L5 n–2 n–1 - 0

L6 n–2 n–1 - dn-2,n-1 ∙ xn-1

L7 n–2 n–1 - dn-2,n-1 ∙ xn-1

L5 n–2 n - dn-2,n-1 ∙ xn-1

L6 n–2 n - dn-2,n-1 ∙ xn-1 + dn-2,n ∙ xn

L7 n–2 n - dn-2,n-1 ∙ xn-1 + dn-2,n ∙ xn

L8 n–2 n (zn-2 – Sdx) / dn-2,n-2 dn-2,n-1 ∙ xn-1 + dn-2,n ∙ xn

L9 n–3 n - dn-2,n-1 ∙ xn-1 + dn-2,n ∙ xn

L10 n–3 n - dn-2,n-1 ∙ xn-1 + dn-2,n ∙ xn

4 L2 n–3 n - 0

L3 n–3 n–3 - 0

L4 n–3 n–3 - 0

L5 n–3 n–2 - 0

L6 n–3 n–2 - dn-3,n-2 ∙ xn-2

L7 n–3 n–2 - dn-3,n-2 ∙ xn-2

L5 n–3 n–1 - dn-3,n-2 ∙ xn-2

L6 n–3 n–1 - dn-3,n-2 ∙ xn-2 + dn-3,n-1 ∙ xn-1

L7 n–3 n–1 - dn-3,n-2 ∙ xn-2 + dn-3,n-1 ∙ xn-1

L5 n–3 n - dn-3,n-2 ∙ xn-2 + dn-3,n-1 ∙ xn-1

L6 n–3 n - dn-3,n-2 ∙ xn-2 + dn-3,n-1 ∙ xn-1 + dn-3,n ∙ xn

L7 n–3 n - dn-3,n-2 ∙ xn-2 + dn-3,n-1 ∙ xn-1 + dn-3,n ∙ xn

L8 n–3 n (zn-3 – Sdx) / dn-3,n-3 dn-3,n-2 ∙ xn-2 + dn-3,n-1 ∙ xn-1 + dn-3,n ∙ xn

L9 n–4 n - dn-3,n-2 ∙ xn-2 + dn-3,n-1 ∙ xn-1 + dn-3,n ∙ xn

L10 n–4 n - dn-3,n-2 ∙ xn-2 + dn-3,n-1 ∙ xn-1 + dn-3,n ∙ xn


65

Tabel 3. Analisa dari algoritma penyelesaian baris echelon (bagian 3).


LK Lx i j xi Sdx

5 L2 n–4 n - 0

L3 n–4 n–4 - 0

L4 n–4 n–4 - 0

L5 n–4 n–3 - 0

… … … … …

3 Implementasi dalam C++


Program untuk melakukan eliminasi Gauss disajikan dalam Kode 1 berikut ini.
Kode 1. Program eliminasi Gauss.
/*
matrix_Gaussian_elimination.cpp
Mencari invers dengan eliminasi Gauss
20150201 | Sparisoma Viridi
*/

#include <cmath>
#include <iostream>

using namespace std;

void display(double x[], int N) {


int M = N + 1;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
int k = M * i + j;
cout << x[k];
if(j < M - 1) cout << "\t";
}
cout << endl;
}
}

int main(int argc, char *argv[]) {


// Jumlah baris
int N = 4;
// Array 2 dimensi dalam array 1 dimensi
double r[] = {
1, 1, 1, 1, 10,
4, 1, 3, 1, 19,
66

2, 1, 1, 1, 11,
1, 3, 1, 2, 18,
};
/*
double r[] = {
1, 3, 4, 1, 12,
0, 12, 0, 2, 4,
0, 0, 2, 1, 1,
0, 0, 0, 1, -1,
};
*/

// Tampilkan matriks awal


cout << "Matriks awal" << endl;
display(r, N);

// Indeks array dimulai dari 0


for(int k = 0; k < N - 1; k++) {
for(int i = 1 + k; i < N; i++) {
int ik = (N + 1) * i + k;
double cik = r[ik];
for(int j = k; j < N + 1; j++) {
int ij = (N + 1) * i + j;
int kj = (N + 1) * k + j;
int kk = (N + 1) * k + k;
r[ij] = r[ij] - cik * r[kj] / r[kk];
}
}
}

// Tampilkan matriks akhir


cout << endl;
cout << "Matriks berbentuk baris echelon" << endl;
display(r, N);

double x[N];
for(int i = N-1; i >= 0; i--) {
double c = 0;
for(int j = N-1; j > i; j--) {
int ij = (N + 1) * i + j;
c = c + x[j] * r[ij];
}
int iM = (N + 1) * i + N;
int ii = (N + 1) * i + i;
x[i] = (r[iM] - c) / r[ii];
}

cout << endl;


cout << "Solusi" << endl;
67

for(int i = 0; i < N; i++) {


cout << x[i] << endl;
}

return 0;
}

Program sebelumnya telah dibuat lebih user-friendly sebagaimana ditampilkan dalam


Kode 2 berikut
Kode 2. Program penyelesaian persamaan linier dengan reduksi baris.
/*
lineqrr0.cpp
Solving linear equations using row reduction

Sparisoma Viridi | dudung@gmail.com

Compile: g++ lineqrr0.cpp -o lineqrr0


Execute: ./lineqrr0 [option]

20160301
Create this program.
In Cywin atoi requires cstdlib library but not fog g++
in Kubuntu distro.
*/

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

int main(int argc, char *argv[]) {


// Define program name
const char *pname = "lineqrr0";

// Verbose usage
if(argc < 2) {
cout << "Usage: " << pname << " ";
cout << "[vop]" << endl;
cout << "vop\tverbose options:" << endl;
cout << "\t 0 show only final result" << endl;
cout << "\t 1 show intermmediate results" << endl;
return 1;
}
68

// Get verbose option


bool VERBOSE = (bool) atoi(argv[1]);

// Define augmented matrix of the linear equations


int ROW = 4;
int COL = 5;
double M[] = {
1, 1, 1, 4, 21,
1, 2, -1, 2, 9,
2, -1, 2, 3, 16,
-1, 1, -1, 2, 7
};
double m[ROW];

// Define epsilon for handling small numbers


const double eps = 1E-12;

// View initial augmented matrix


if(VERBOSE) {
cout << "# Initial augmented matrix" << endl;
for(int i = 0; i < ROW; i++) {
for(int j = 0; j < COL; j++) {
int ij = i * COL + j;
cout << M[ij];
if(j < COL - 1) cout << "\t";
}
cout << endl;
}
cout << endl;
}

// Begin row reduction operation


for(int i = 0; i < COL - 2; i++) {
for(int j = i + 1; j < ROW; j++) {
int ji = j * COL + i;
int ii = i * COL + i;
double c = M[ji] / M[ii];
for(int k = 0; k < COL; k++) {
int jk = j * COL + k;
int ik = i * COL + k;
M[jk] = M[jk] - M[ik] * c;
if(fabs(M[jk]) < eps) M[jk] = 0;
}
}
69

// View every step of row reduction operation


if(VERBOSE) {
cout << "# Make zero of column " << i + 1;
cout << endl;
for(int i = 0; i < ROW; i++) {
for(int j = 0; j < COL; j++) {
int ij = i * COL + j;
cout << M[ij];
if(j < COL - 1) cout << "\t";
}
cout << endl;
}
cout << endl;
}
}

// View echelon matrix


if(VERBOSE) {
cout << "# Echelon matrix" << endl;
for(int i = 0; i < ROW; i++) {
for(int j = 0; j < COL; j++) {
int ij = i * COL + j;
cout << M[ij];
if(j < COL - 1) cout << "\t";
}
cout << endl;
}
cout << endl;
}

// Perform back substitution


for(int i = 0; i < ROW; i++) {
int iCOL = (ROW - 1 - i) * COL + (COL - 1);
double y = M[iCOL];
for(int j = 0; j < i; j++) {
int ij = (ROW - 1 - i) * COL + (COL - 2 - j);
double dy = m[ROW - 1 - j] * M[ij];
if(fabs(dy) < eps) dy = 0;
y -= dy ;
}
int ii = (ROW - 1 - i) * COL + (COL - 2 - i);
double x = M[ii];
m[ROW - 1 - i] = y / x;
if(fabs(m[ROW - 1 - i]) < eps) m[ROW - 1 - i] = 0;
}
70

// View final result


if(VERBOSE) cout << "# Solution" << endl;
for(int i = 0; i < ROW; i++) {
if(fabs(m[i]) < eps) m[i] = 0;
cout << m[i] << endl;
}

// Terminate program with success state


return 0;
}

Hasil dari Kode 2 adalah sebagai berikut ini bila dipanggil dengan opsi 0
$ ./lineqrr0.exe 0
0
2
3
4

dan bila dipanggil dengan opsi 1


$ ./lineqrr0.exe 1
# Initial augmented matrix
1 1 1 4 21
1 2 -1 2 9
2 -1 2 3 16
-1 1 -1 2 7

# Make zero of column 1


1 1 1 4 21
0 1 -2 -2 -12
0 -3 0 -5 -26
0 2 0 6 28

# Make zero of column 2


1 1 1 4 21
0 1 -2 -2 -12
0 0 -6 -11 -62
0 0 4 10 52

# Make zero of column 3


1 1 1 4 21
0 1 -2 -2 -12
0 0 -6 -11 -62
0 0 0 2.66667 10.6667

# Echelon matrix
71

1 1 1 4 21
0 1 -2 -2 -12
0 0 -6 -11 -62
0 0 0 2.66667 10.6667

# Solution
0
2
3
4

4 Pertanyaan
1. Jalankan Kode 1 dan tentukanlah nilai-nilai dari x1, x2, x3, dan x4!
2. Gantilah bagian yang tepat dalam program pada Kode 2 sehingga dapat
merepresentasikan persamaan-persamaan linier berikut ini
x1 + 2 x 2 + 3x3 + 4 x 4 = 10 , (8a)

x1 − x 2 + x3 − 4 x 4 = −3 , (8b)

x1 + 10 x 2 − 11x 3 + 5 x 4 = 5 , (8c)

2 x1 + 3x 2 + 3 x3 − 5 x 4 = 9 . (8d)

3. Gunakan Kode 2 untuk menyelesaikan tiga persamaan linier berikut


x1 + 2 x 2 + 3 x3 = 3 , (9a)

x1 − x 2 + x3 = 0 , (9b)

x1 + 10 x 2 − 11x 3 = 11 . (9c)

4. Perhatikan rangkaian resistor dan batere dalam Gambar 1.


a. Tuliskan persamaan Kirchhof untuk arus pada titik-titik a, b, dan c. Gunakan
I31, I21, dan I23 yang mengarah ke atas dan melewati R31, R21, dan R23,
berturut-turut.
b. Tuliskan persamaan Kirchhof untuk simpul abed, bcfe, dan cadf.
c. Nyatakan sistem persamaan linier yang diperoleh dalam bentuk matriks
teraugmentasi.
d. Bila R12 = R23 = R32 = 0 tentukanlah I1, I2, dan I3 dengan terlebih dahulu
menyatakan matriks baris echelonnya.
72

c
ε2 b
ε3
ε1

R23 a R12
I2
R2
f
e
R31
R3 I1
R1
I3
d

Gambar 1. Rangkaian listrik dengan lima simpul.

5 Rujukan
1. Eric W. Weisstein, "Gaussian Elimination", from MathWorld--A Wolfram Web
Resource, URL http://mathworld.wolfram.com/GaussianElimination.html
[20160905].
Sparisoma Viridi, 201608230 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Deret Taylor
diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Ekspansi suatu fungsi dalam deret Taylor dapat dikatakan merupakan dasar dari banyak
metode numerik, seperti misalnya metode integrasi Euler [1], metode pencarian akar
Newton-Raphson [2], dan penyelesaian persamaan diferensial menggunakan deret [3].

1 Deret Taylor
Sembarang fungsi f(x) dapat direpresentasikan di sekitar x = x0 dengan menggunakan
deret Taylor mengikuti

(x − x0 )n d n f (x )
f (x ) = ∑ , (1)
n =0 n! dx n x = x
0

di mana semakin besar nilai n atau semakin banyak suku yang dilibatkan, representasi-
nya semakin mendekati fungsi sebenarnya. Sebagai ilustrasi, misalnya terdapat fungsi

f ( x ) = c0 + c1 x + c 2 x 2 , (2)

yang apabila dicari turunan ke-nol, pertama, dan keduanya akan memberikan

d 0 f (x )
0
= f ( x ) = c0 + c1 x + c 2 x 2 , (3a)
dx

d 1 f ( x ) df (x )
= = c1 + 2c 2 x , (3b)
dx1 dx

d 2 f (x )
= 2c 2 . (3c)
dx 2
Suku-suku untuk n ≥ 3 tidak perlu dilibatkan karena akan memberikan nilai nol. Selan-
jutnya untuk ekspansi deret di sekitar x = x0, akan membuat Persamaan (3a) – (3c)
menjadi

d 0 f (x )
= c 0 + c1 x0 + c 2 x02 , (4a)
dx 0 x = x0

d 1 f (x )
= c1 + 2c 2 x0 , (4b)
dx1 x = x0

73
74

d 2 f (x )
= 2c 2 . (4c)
dx 2 x = x0

Substitusikan kembali Persamaan (4a) – (4c) ke Persamaan (1) sehingga diperoleh

( x − x0 )
0

(c0 + c1 x0 + c2 x0 ) + ( x − x0 )
1
( x − x0 )
2

f (x ) = 2
(c1 + 2c2 x0 ) + (2c2 )
0! 1! 2!
= c 0 + c1 x0 + c 2 x0 + c1 x − c1 x0 + 2c 2 x 0 x − 2c 2 x0 + c 2 x − 2c 2 x0 x + c 2 x02
2 2 2
(5)
= c 0 + c1 x + c 2 x + (c1 x 0 − c1 x0 ) + (c 2 x − 2c 2 x + c 2 x ) + (2c 2 x0 x − 2c 2 x0 x )
2 2
0
2
0
2
0

= c 0 + c1 x + c 2 x 2

yang tak lain adalah fungsi f(x) semula.

2 Deret Maclaurin
Apabila dilakukan ekspansi deret Taylor dengan mengambil x0 = 0 maka deret yang
diperoleh disebut sebagai deret Maclaurin [4]

x n d n f (x )
f (x ) = ∑ . (6)
n =0 n! dx n x =0

Contoh dua buah fungsi yang sering diekspansi menggunakan deret Maclaurin adalah
sin x dan cos x yang masing-masing akan menjadi

sin x = ∑

(− 1)n x 2 n +1 , (7)
n =0 (2n + 1)!

cos x = ∑

(− 1)n x 2 n . (8)
n = 0 (2n )!

3 Metode integrasi Euler


r r
Untuk setiap saat t posisi r dan kecepatan v suatu titik partikel dapat dihubungkan
lewat
r r

r = v dt , (9)

yang dalam dapat didiskritisasi untuk setiap langkah waku ∆t menjadi


r r r
r (t + ∆t ) = r (t ) + v (t )∆t (10)

dengan metode Euler. Persamaan (10) dapat diubah menjadi


75

r r
r r (t + ∆t ) − r (t )
v (t ) = , (11)
∆t

yang dengan konsep limit akan memberikan


r r r
dr (t ) r (t + ∆t ) − r (t )
= lim (12)
dt ∆t → 0
∆t

hubungan diferensialnya, yang tak lain adalah Persamaan (9). Metode ini akan
memberikan hasil yang baik bila nilai ∆t cukup kecil.
Terdapat lelucon yang menarik terkait dengan limit ini ☺ [5].
Metode Euler dapat diungkapkan lebih umum sebagai

 df 
f ( x + ∆x ) = f ( x ) +   ∆x . (13)
 dx 
Terdapat suatu persamaan diferensial
dx
− ω 1− x2 = 0 (14)
dt
yang akan digunakan sebagai ilustrasi penerapan Persamaan (13). Penerapapan metode
Euler akan memberikan bentuk numerik dari Persamaan (14) dalam bentuk

x(t + ∆t ) = x(t ) + ω∆t 1 − x 2 (t ) , (15)

yang tak lain akan memberikan solusi berbentuk sin ωt. Persamaan (14) dapat dituliskan
menjadi

dx
= ω dt . (16)
1− x2

Dimisalkan x = sin θ dan dx = cos θ dθ, sehingga Persamaan (16) akan menjadi
dθ = ω dt ⇒ θ = ωt . (17)

Selanjutnya diperoleh

sin −1 x = ωt ⇒ x = sin ωt (18)


yang merupakan solusinya. Lalu, bagaimanakah agar Persamaan (15) dapat dilihat
merupakan sin ωt? Untuk itu tuliskan

x(t ) = sin ωt (19)


76

sehingga

x(t + ∆t ) = sin (ωt + ω∆t ) = sin ωt cos ω∆t + cos ωt sin ω∆t . (20)

Substitusi Persamaan (18) ke Persamaan (19) sehingga didapatkan

x(t + ∆t ) = x(t ) cos ω∆t + 1 − x 2 (t ) sin ω∆t . (21)

Dikarenakan nilai ω∆t yang kecil maka dapat lakukan ekspansi menggunakan deret
Maclaurin sampai suku pertama
cos ω∆t ≈ 1 , (22a)
sin ω∆t ≈ ω∆t . (22b)
Substitusikan Persamaan (22a) dan (22b) ke Persamaan (21) sehingga

x(t + ∆t ) ≈ x(t ) + ω∆t 1 − x 2 (t )

yang tak lain adalah Persamaan (15) yang dicari. Sayangnya pembuktian ini belum bisa
dilakukan sehingga diperoleh Persamaan (19), dan bukan sebaliknya, menggunakan
Persamaan (19) untuk memperoleh Persamaan (15).
Persamaan (19) juga merupakan solusi dari persamaan diferensial orde dua berikut

d 2x
2
+ω2x = 0. (23)
dt
Dengan menggunakan formulasi beda hingga maju dan mundur

df ( x ) f (x + ∆x ) − f (x )
≈ , (24)
dx ∆x
df ( x ) f (x ) − f (x − ∆x )
≈ , (25)
dx ∆x
suku pertama ruas kiri Persamaan (25) dapat diubah menjadi

d 2 f (x ) f (x + ∆x ) − 2 f (x ) + f (x − ∆x )
≈ . (26)
dx 2 (∆x )2
Substusi Persamaan (26) ke Persamaan (23) akan memberikan formula

[
x(t + ∆t ) = 2 − ω 2 (∆t )
2
] x(t ) − x(t − ∆t ) . (27)
77

Seperti halnya Persamaan (15), bagaimanakah membuktikan bahwa Persamaan (27)


merupakan solusi dari Persamaan (23), yang salah satu solusinya harusnya sin ωt. Untuk
itu kembali digunakan Persamaan (19) dan (20), ditambah dengan
x(t − ∆t ) = sin (ωt − ω∆t ) = sin ωt cos ω∆t − cos ωt sin ω∆t . (28)

Penjumlahan Persamaan (20) dan Persamaan (5.28) akan memberikan


x(t + ∆t ) + x(t − ∆t ) = 2 x(t ) cos ω∆t − cos ωt sin ω∆t . (29)

Persamaan (22a) dan (22b) dituliskan kembali sampai suku kedua

1
cos ω∆t ≈ 1 − ω 2 (∆t ) ,
2
(30a)
2
1
sin ω∆t ≈ ω∆t − ω 3 (∆t ) .
3
(30b)
6

Substitusi kedua persamaan tersebut ke Persamaan (29) akan memberikan

 1 2  1 3
x(t + ∆t ) + x(t − ∆t ) = 2 x(t ) 1 − ω 2 (∆t )  − cos ωt ω∆t − ω 3 (∆t )  . (31)
 2   6 

Bila diambil hanya suku sin ω∆t ≈ 0 maka Persamaan (31) akan menjadi

[
x(t + ∆t ) = 2 − ω 2 (∆t )
2
] x(t ) − x(t − ∆t ) ,
yang tak lain adalah Persamaan (28) yang dicari.
Untuk fungsi-fungsi yang lebih sederhana, seperti gerak jatuh bebas

dv
= −g , (32)
dt
akan memberikan solusi numerik

v(t + ∆t ) = v(t ) − gt , (33)

yang dapat dengan mudah dibuktikan lewat


v(t ) = v0 − gt , (34)

sehingga

v(t + ∆t ) = v0 − gt − g∆t = v(t ) − gt . (35)


78

4 Metode pencarian akar Newton-Raphson


Akar dari suatu persamaan f(x) dapat dicari dengan menggunakan
f (x n )
x n +1 = x n − (36)
df (x n ) / dx

yang diperoleh menggunakan persamaan garis lurus dengan menyamakan gradien


f ( x ) − f ( x n ) f ( x n +1 ) − f ( x n )
= (37)
x − xn x n +1 − x n

dari sembarang titik terhadap dua buah titik xn dan xn+1. Titik xn adalah titik tebakan
pertama yang memberikan nilai fungsi f(xn). Persamaan garis yang lewat titik [xn, f(xn)]
dan gradiennya f '(xn) adalah
y = f ' ( x n )( x − x n ) + f ( x n ) . (38)

Titik xn+1 diperoleh dengan membuat y = 0, sehingga diperoleh

0 = f ' ( x n )( x n +1 − x n ) + f (x n ) . (39)

Sedikit pengaturan akan menghasilkan


f (x n )
x n +1 = x n − ,
f ' (xn )

yang merupakan Persamaan (36).

5 Persamaan diferensial
Deret pangkat yang dapat merupakan hasil ekspansi suatu fungsi f(x) menggunakan
deret Taylor ataupun deret Maclaurin, dalam bentuk

f ( x) = ∑ c n x n . (40)
n=0

dapat menjadi solusi dari suatu persamaan diferensial. Sebagai ilustrasi, terdapat suatu
persamaan diferensial
dy
− y −1 = −x 2 . (41)
dx
Turunkan Persamaan (40) terhadap x sehingga diperoleh
79


df ( x)
= ∑ nc n x n −1 . (42)
dx n =1

Substitusi Persamaan (40) dan (42) ke Persamaan (41) sehingga diperoleh


∞ ∞

∑ nc x
n =1
n
n −1
− ∑ cn x n − 1 + x 2 = 0 .
n=0
(43)

Persamaan (43) dapat diuraikan menjadi

(c1 − c0 − 1) + (2c2 − c1 )x + (3c3 − c2 + 1)x 2 + (4c4 − c3 )x 3 = 0 . (44)

Denga melihat suku-suku pangkat tiga dan lebih tinggi yang tidak ada, maka dapat
ditetapkan bahwa cn = 0 untuk n ≥ 3. Suku-suku pangkat yang berbeda harus bebas
linier sehingga diperoleh bahwa c2 = 1, c1 = 2, dan c0 = 1 sehingga solusinya adalah

y = 1 + 2x + x 2 . (45)

6 Pertanyaan
1. Turunkan Persamaan (7) dan (8) dengan menerapkan Persamaan (1) pada sin x
dan cos x, lalu pilih x0 = 0 sehingga kedua persamaan tersebut dapat diperoleh.
2. Dengan menggunakan Persamaan (7) dan (8) tunjukkan sin2x + cos2x = 1.
3. Turunkan Persamaan (36) dengan menggambarkan prosesnya!
4. Carilah dengan menggunakan Persamaan (40) solusi dari persamaan diferensial
 d 2 y   dy 
 2    − 18 y − 18 = 0 .
 dx   dx 

7 Rujukan
1. Wikipedia contributors, "Euler method", Wikipedia, The Free Encyclopedia, en:
731969033, 28 Jul 2016 | 18:25.
2. Wikipedia-Autoren, "Newton-Verfahren", Wikipedia, Die freie Enzyklopädie, de:
156737549, 5 Aug 2016 | 05:55.
3. James Stewart, "Using Series to Solve Differential Equations" in Calculus. Concepts
& Contexts, 4th edition, 2015, URL http://www.stewartcalculus.com/data
/CALCULUS%20Concepts%20and%20Contexts/upfiles/3c3-UseSeries-SolveDEs
_Stu.pdf [20160823].
80

4. Eric W. Weisstein, "Maclaurin Series", MathWorld--A Wolfram Web Resource,


URL http://mathworld.wolfram.com/MaclaurinSeries.html [20160824].
5. Murray Bourne, "1. Limits and Differentiation", Interactive Mathematics, 6 Nov
2014, URL http://www.intmath.com/differentiation/1-limits-and-differentiation
.php [20160823].
Sparisoma Viridi, 201609190 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Integrasi Numerik
diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Terdapat berbagai persoalan fisis yang dapat diungkapkan dalam bentuk suatu fungsi,
yang penyelesaiannya memerlukan proses integrasi. Kadang fungsi tersebut tidak dapat
dengan mudah diselesaikan secara analitik. Untuk inilah integrasi numerik diperlukan.
Dalam bagian ini dibahas beberapa metode integrasi numerik, yaitu persegi panjang
[1], trapezium [2], dan Simpson [3].

1 Integral dan diferensial


Bila terdapat suatu fungsi f(x) maka dapat dicari F(x) melalui integrasi

F (x ) = ∫ f (x ) dx (1)

atau

dF ( x )
= f (x ) . (2)
dx
Integrasi dapat dilakukan dengan x ∈ [xa, xb] sehingga
xb

F ( xb ) − F ( x a ) = ∫ f (x )dx . (3)
xa

Persamaan (1) merupakan solusi analitik integrasi suatu fungsi bila dapat dilakukan.
Bila tidak, solusi numerik digunakan untuk memperoleh Persamaan (3).

2 Luas di bawah kurva


Persamaan (3) tak lain adalah mencari luas di bawah kurva mulai dari x = xa sampai
dengan x = xb sebagai mana diilustrasikan dalam Gambar 1.

f(x)

xa xb
Gambar 1. Luas di bawah kurva A adalah hasi integrasi f(x) antara xa dan xb.

81
82

Luas A dapat dicari dengan menggunkan berbagai pendekatan, bergantung bagaimana


f(x) dimodelkan, misalnya dalam bentuk
M
f (x ) = ∑ cm x m , (4)
m=0

di mana M = 0 terkait dengan metode persegi panjang, M = 1 dengan metode


trapezium, dan M = 2 dengan metode Simpson. Untuk ketiga metode tersebut perlu
didefinisikan lebar pita dx yang bergantung dari banyaknya pita N
xb − x a
∆x = , (5)
N
sehingga dapat dituliskan

xi = x a + i∆x, i = 0, .., N . (6)

3 Metode persegi panjang


Luas A dapat didekati dengan
xb N −1
A= ∫ f ( x ) dx ≈ Appan =∑ f (xi ) ∆x , (7)
xa i =0

dengan menganggap bahwa f(x) = c0, di mana c0 = f(xi). Ruang yang tidak terisi antara A
dan Appan adalah error dari metode persegi panjang ini.

4 Metode trapsium
Pada metode ini digunakan asumsi bahwa f(x) = c0 + c1x sehingga luas trapesium dapat
dicari lewat
xb N −1
∆x
A= ∫ f (x ) dx ≈ Atrap = ∑ [ f ( xi ) + f ( xi +1 )] . (8)
xa i =0 2

Perhitungan luas dapat pula dilakukan dengan terlebih dahulu mencari nilai-nilai c0 dan
c1 baru dihitung luasnya, akan tetapi Persamaan (8) memberikan cara yang lebih cepat.

5 Metode Simpson
Untuk metode Simpson tidak terdapat cara cepat dalam menemukan rumusan seperti
dalam Persamaan (7) dan (8) akan tetapi harus melalui pencarian terlebih dahulu nilai-
nilai c0, c1, dan c2, melakukan integrasi dalam selang xi dan xi+1, lalu mencari rumusan
umumnya yang memiliki bentuk
83

xb N −1
∆x
A= ∫ f ( x ) dx ≈ Asimp =∑  f ( xi ) + 4 f  xi + 1  + f ( xi +1 ) , (9)
xa i=0   2  2

di mana

1
xi + 1 = (xi + xi +1 ) . (10)
2 2

6 Syarat fungsi integran


Fungsi integran f(x) harus memiliki nilai di dalam selang xa ≤ x ≤ xb sehingga saat
diperlukan, misalnya menambah jumlah pita N, nilai-nilai f(x) tetap dapat diperoleh. Bila
hanya terdapat sejumlah data diskrit xi dan f(xi) maka dapat terlebih dahulu dilakukan
interpolasi sehingga diperoleh fungsi yang kontinu.

7 Penentuan jumlah pita


Semakin banyak jumlah pita, maka dx akan semakin kecil sehingga pendekatan
xb N −1

∫ f (x ) dx ≈∑ f ( xi ) ∆x (11)
xa i =0

akan semakin baik. Apabila diketahui solusi analitik dari hasil integralnya, jumlah pita
yang baik adalah saat selisih perhitungan teori dan numerik telah lebih kecil dari suatu
error

ε = Ateori − Anumerik . (12)

Akan tetapi apabila hasil integrasinya tidak dapat diperoleh secara teori, yang umumnya
terjadi saat suatu metode numerik digunakan, maka error dapat didefinisikan sebagai

ε = Atnumerik , N / 2 − Atnumerik , N . (13)

Apabila dengan penambahan jumlah N hasil integrasi numerik sudah tidak lagi banyak
berubah dan selisihnya telah lebih kecil dari suatu error yang ditentukan, dapat
dikatakan bahwa hasil telah memadai dan perhitungan dapat dihentikan.
Umumnya metode numerik, algoritma, dan program diuji dulu untuk kasus-kasus di
mana solusi analitiknya ada sehingga digunakan Persamaan (12). Selanjutnya digunakan
untuk fungsi integrannya yang solusi analitiknya belum ada. Hal ini dapat menunjang
kepercayaan bahwa, setidaknya, metode numerik, algoritma, dan program telah diuji
untuk hal-hal yang telah diketahui dan memberikan hasil yang benar. Apakah ini
84

menjamin bahwa hasil integrasi numerik untuk sistem yang tidak ada solusi analitiknya
telah benar? Jawabannya tidak. Pembuktian lain yang dapat dicari adalah melalui
eksperimen apabila memungkinkan untuk dilakukan.

8 Algoritma

9 Program
Dengan x ∈ [0, 1] ..

f1 (x ) = 1 , (14.a)

f 2 (x ) = 1 + x , (14.b)

f 3 (x ) = 1 + x 2 . (14.c)

10 Pertanyaan
1. Buktikan Persamaan (8) dengan terlebih dahulu mencari c0 dan c1, lalu
menghitung integralnya dari xi sampai xi+1!
2. Hitunglah untuk x ∈ [0, 1] fungsi-fungsi berikut secara analitik dan dengan ketiga
metode integrasi numerik. Jelaskan kedekatan hasilnya dengan hasil analitik.
Cukup gunakan N = 1.
a. f(x) = 2
b. f(x) = 3x + 2
c. f(x) = x2 + 1
3. Turunkan rumus integrasi metode Simpson!

Rujukan
1. Wikipedia contributors, "Rectangle method", Wikipedia, The Free Encyclopedia,
en:717292601, 26 Apr 2016 | 20:55.
2. Wikipedia contributors, "Trapezoidal rule", Wikipedia, The Free Encyclopedia,
en:739231688, 13 Sept 2016 | 14:29.
85

3. Wikipedia contributors, "Simpson's rule", Wikipedia, The Free Encyclopedia,


en:739726994, 16 Sept 2016 | 15:40.
86
Sparisoma Viridi, 201609240 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Mencari Akar
diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Akar suatu persamaan dapat dicari dengan menggunakan berbagai metode, misalnya
saja Newton-Raphson [1], Secant [2], titik-tetap [3], bisection [4], dan grafik.

1 Akar
Bila xa adalah akar dari suatu persamaan f(x), maka akan terpenuhi bahwa

f (xa ) = 0 . (1)

Ada pula yang mengatakan bila terdapat dua buah fungsi g(x) dan h(x), maka akar xa
adalah titik potong dari kedua persamaan tersebut atau
g ( x a ) = h( x a ) . (2)

Persamaan (2) dapat diubah sehingga memenuhi Persamaan (1) dengan cara
f ( x ) = g ( x ) − h( x ) . (3)

2 Metode Newton-Raphson
Akar dari suatu persamaan f(x) dapat dicari dengan menggunakan
f (x n )
x n +1 = x n − , (4)
df ( x n ) / dx

di mana saat akar xa diperoleh saat

x a = lim x n +1 (5)
n →∞

atau
x n +1 ≈ x n . (6)

Untuk itu dapat didefinsikan suatu ketelitian

f (x n )
ε = x n +1 − x n = . (7)
df ( x n ) / dx

Saat nilai xn+1 tidak lagi teramati berubah dari xn, maka suku kedua dalam ruas kanan
Persamaan (4) akan menjadi amat kecil atau dapat dikatakan nol.

87
88

3 Metode secant
Apabila fungsi f(x) tidak dapat memberikan data yang kontinu, misalkan saja data
merupakan hasil akuisisi suatu pengukuran sehingga hanya pasangan data x dan f(x)
yang dimiliki untuk suatu resolusi tertentu, maka Persamaan (4) dapat dimodifikasi
dengan menggunakan
df (x ) f ( x ) − f (x − ∆x )
≈ (8)
dx ∆x
atau secara eksplisit
df ( x n ) f (x n ) − f ( x n −1 )
≈ . (9)
dx x n − x n −1

Substitusi Persamaan (9) ke Persamaan (4) akan memberikan


f ( x n )( x n − x n −1 )
x n +1 = x n − .
f ( x n ) − f ( x n −1 )

Bila indeksnya digeser dari n  n + 1 maka akan diperoleh


f ( x n +1 )( x n +1 − x n )
x n + 2 = x n +1 − (10)
f ( x n +1 ) − f ( x n )

yang merupakan metode secant. Perhatikan bahwa baik metode Newton-Raphson


maupun secant, keduanya memerlukan dua data sebelumnya seperti ditabelkan berikut
ini.
Tabel 1. Perbandingan metode Newton-Raphson dan secant.
Metode Newton-Raphson Secant
f(x) kontinu diskrit
df(x)/df diperlukan tidak diperlukan
data yang dicari xn+1 xn+2
data yang diperlukan xn, f '(xn) xn+1, xn

Dengan demikian dapat dimengerti bahwa walaupun seakan-akan metode secant


memerlukan lebih banyak data, sebenarnya data tambahan tersebut tak lain adalah
data turunan fungsi yang diperlukan dalam metode Newton-Raphson.
89

4 Metode titik tetap


Akar dapat pula dicari dengan mendefinisikan fungsi secara umum dalam bentuk
x n +1 = f ( x n ) , (11)

dengan salah satu implementasinya adalah metode Newton-Raphson pada Persamaan


(4) dengan
g (x n )
f (xn ) = xn − , (12)
dg ( x n ) / dx

di mana g(x) adalah fungsi yang ingin dicari akarnya.


Tabel 2. Hasil pencarian akar dari fungsi g(xn) = (xn2 + 8) / 6 dengan beberapa tebakan awal x0
yang berbeda-beda.
n xn
0 0.2 1.2 2.5 3.5
1 1.3400 1.5733 2.3750 3.3750
2 1.6326 1.7459 2.2734 3.2318
3 1.7776 1.8414 2.1948 3.0741
4 1.8600 1.8984 2.1362 2.9083
5 1.9099 1.9340 2.0939 2.7430
6 1.9413 1.9567 2.0640 2.5874
7 1.9614 1.9715 2.0434 2.4491
8 1.9745 1.9811 2.0292 2.3330
9 1.9831 1.9875 2.0196 2.2405
10 1.9888 1.9917 2.0132 2.1700
11 1.9926 1.9945 2.0088 2.1181
12 1.9950 1.9963 2.0059 2.0811
13 1.9967 1.9975 2.0039 2.0551
14 1.9978 1.9984 2.0026 2.0373
15 1.9985 1.9989 2.0017 2.0251
16 1.9990 1.9993 2.0012 2.0168
17 1.9993 1.9995 2.0008 2.0113
18 1.9996 1.9997 2.0005 2.0075
19 1.9997 1.9998 2.0003 2.0050
20 1.9998 1.9999 2.0002 2.0034
21 1.9999 1.9999 2.0002 2.0022
22 1.9999 1.9999 2.0001 2.0015
23 1.9999 2.0000 2.0001 2.0010
90

Misalkan terdapat suatu fungsi

g (x ) = x 2 − 6 x + 8 , (13)

yang ingin dicari akarnya dalam rentang


x ∈ [0,4) . (14)

Persamaan (13) akan diubah dalam bentuk Persamaan (11) menjadi

f ( xn ) = (xn + 8) .
1 2
(15)
6
Dengan menggunakan beberapa syarat awal x0 berbeda, yaitu 0.2, 1.2, 2.5, 3.5, dapat
diperoleh nilai-nilai x23 sebagaimana disajikan dalam Tabel 2, di mana akar yang dicari
adalah xa = 2.

5 Metode bisection
Bila dalam suatu rentang x ∈ [x0 , x1 ] terdapat satu akar xa dari f(x), maka berlaku bahwa

f ( x0 ) f (x1 ) < 0 . (16)

Nilai x2 dicari dengan membagi rentang x sama besar

1
x2 = (x0 + x1 ) . (17)
2
Perkalian fungsi yang memenuhi Persamaan (16) diperoleh lewat

f ( x2 ) f ( x1 ) = min[ f ( x2 ) f ( x1 ), f ( x2 ) f ( x0 )] , (18)

yang dapat dioleh lebih lanjut sehingga memberikan

 1 
x1 = f −1  min[ f ( x2 ) f ( x1 ), f (x2 ) f ( x0 )] . (19)
 f (x2 ) 
Persamaan (19) akan memberikan nilai baru x1 = x1 ataupun x1 = x0 bergantung hasil
dari fungsi min(). Dengan mengintegrasikannya dengan Persamaan (17) akan dapat
diperoleh rumus rekursifnya

1   1 
xn+3 = xn + 2 + f −1  min[ f ( xn + 2 ) f (x n +1 ), f (x n + 2 ) f ( xn )]  . (20)
 f (xn + 2 )
2  

91

6 Menggunakan grafik
Dengan menggunakan grafik posisi akar dapat dengan mudah ditentukan. Sayangnya
metode ini memerlukan f(x) yang kontinu atau bila berbentuk diskrit, diperlukan cukup
banyak data sehingga dapat dilakukan interpolasi. Cara ini akan dapat dengan cepat
menentukan apakah terdapat akar atau tidak dalam suatu rentang x tertentu. Akan
tetapi kemudian tidak dapat dengan akurat menentukan nilai dari x = xa karena
bergantung dari resolusi zooming gambar terhadap f(x). Sebaiknya cara ini digunakan
untuk penerangan awal mengenai ada tidaknya akar dalam suatu rentang x.

7 Metode pemindaian
Secara membabi-buta akar dapat dicari dengan melakukan pemindaian x dengan
pengubahan sebesar ∆x dari x1 sampai x2. Nilai ∆x besar akan membuat akar cepat
ditemukan (atau terlewati) dengan akurasi rendah, sedangkan nilai yang kecil akan
membuat akar lambat ditemukan dengan akurasi yang tinggi. Metode ini dapat
digabungkan dengan menggunakan grafik untuk mencari terlebih dahulu daerah dekat
tempat akar mungkin terdapat baru kemudian dilakukan pemindaian.

8 Faktorisasi
Untuk fungsi yang merupakan hasil dari perkalian fungsi-fungsi yang lebih sederhana,
misalnya perkalian (x – xq), q = a, b, c, .. yang menghasilkan suatu polinomial, pencarian
akar dapat dilakukan dengan menggunakan faktorisasi. Fungsi kuadrat

ax 2 + bx 2 + c = 0 . (21)
memiliki formula kuadrat [5]

b ± b 2 − 4ac
x1, 2 = , (22)
2a
sehingga Persamaan (21) dapat difaktorkan menjadi
(x − x1 )(x − x2 ) = 0 , (23)

dengan akar-akarnya adalah x1 dan x2.

9 Membuat metode lain


Dengan memanfaatkan metode beda hingga dalam mencari turuan pertama dan kedua
suatu fungsi f(x) suatu metode pencarian akar, namakan saja X, dapat diperoleh.
92

Langkah pertama yang dilakukan adalah dengan menggunakan menuliskan turuan


pertama dengan menggunakan beda maju dan beda mundur
f (x + ∆x ) − f (x )
f ' (x ) ≈ , (24)
∆x
f (x ) − f (x − ∆x )
f ' (x ) ≈ , (25)
∆x

serta turunan keduanya


f (x + ∆x ) − 2 f (x ) + f (x − ∆x )
f " (x ) ≈ . (26)
(∆x )2
Selanjutnya, ekspansi deret Taylor sampai tiga suku pertama dapat dimodifikasi
menggunakan Persamaan (24)-(26) sehingga menjadi
f (x ) − f (x − ∆x ) 1 f (x ) − 2 f (x − ∆x ) + f (x − 2∆x )
f (x + ∆x ) − f (x ) ≈ ∆x + (∆x )2 . (27)
∆x 2 (∆x )2
Representasi turunan pertama akan dapat dituliskan dalam bentuk
f (x + ∆x ) − f (x ) f (x ) − 4 f ( x − ∆x ) + f (x − 2∆x )
f ' (x ) ≈ ≈ . (28)
∆x 2∆x

Apabila Persamaan (28) ini digunakan dalam metode Newton-Raphson pada (4) akan
diperoleh rumusan baru
2 f (x n + 2 )(x n + 2 − x n +1 )
x n+3 = xn+ 2 − . (29)
f (x n + 2 ) − 4 f ( x n +1 ) − f ( x n )

untuk mencari akar. Lalu bagaimana dengan fitur metode X ini? Apakah lebih baik dari
metode Newton-Raphson ataupun secant? Kebutuhan akan data dari metode ini apabila
dibandingkan dengan dua metode sebelumnya diberikan dalam Tabel 3 berikut.
Tabel 2. Perbandingan metode Newton-Raphson (NR), secant, dan metode X.
Metode NR Secant X
f(x) perlu perlu perlu
f '(x) perlu - perlu
xn-1 perlu perlu perlu
xn-2 - perlu perlu
xn-3 - - perlu
93

Sebagai ujicoba digunakan

f (x ) = −50 − 14 x + 20 x 2 − 3 x 3 , (30)

dengan xn-1 = 4.5, xn-2 = 4.4, dan xn-3 = 4.3. Selisih hasil akhir xn dan xn-1 diberikan dalam
Gambar 1.

1.5

NR
1
S
0.5 X
xn - x n -1

-0.5

-1

-1.5
0 2 4 6 8 10 12
n

Gambar 1. Selisih xn dan xn-1 untuk ketiga metode Newton-Raphson (NR), secant (S) dan X.
Metode X cepat mendekati x∞ di langkah awal tetapi sulit mencapainya pada langkah
selanjutnya sebagaimana terlihat pada Gambar 1. Dengan demikian metode ini bagus
untuk tebakan awal yang dapat dilakukan cukup dengan satu langkah. Setelah itu dapat
dilanjutkan dengan metode lain.

10 Pertanyaan
1. Tunjukkan bagaimana cara memperoleh metode Newton-Raphson dalam
Persamaan (4)!
2. Tunjukkan keberlakukan metode bisection dalam Persamaan (20) dengan
menggunakan suatu contoh.
3. Substitusi Persamaan (22) ke Persamaan (21) sehingga terbukti bahwa persamaan
tersebut merupakan solusinya.
4. Buatlah skema campuran antara penerapan metode Newtwon-Raphson dengan X
atau secant dengan X dengan melakukan variasi jumlah langkah-langkah yang
perlu dilakukan masing-masing metode sehingga secara total jumlah langkah
menjadi minimum dan dan juga selisih xn dan xn-1.
94

10 Rujukan
1. Wikipedia-Autoren, "Newton-Verfahren", Wikipedia, Die freie Enzyklopädie, de:
156737549, 5 Aug 2016 | 05:55.
2. Eric W. Weisstein, "Secant Method", MathWorld--A Wolfram Web Resource, URL
http://mathworld.wolfram.com/SecantMethod.html [20160830].
3. Wikipedia contributors, "Fixed-point iteration", Wikipedia, The Free Encyclopedia,
en:724688240, 10 Jun 2016 | 21:00.
4. Douglas Wilhem Harder, Richard Khoury, "Topic 10.1: Bisection Method
(Examples)" in Numerical Analysis for Engineering, University of Waterloo, URL
https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/10RootFinding/bisection
[20160830].
5. Wikipedia contributors, "Quadratic formula", Wikipedia, The Free Encyclopedia,
en:736790164, 29 Aug 2016 | 21:21.
Sparisoma Viridi, 201609120 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Matriks 2-D
diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Terdapat banyak pemanfaatan dari matriks 2-d, yang komponen-komponennya dirujuk


dengan dua indeks -- misalnya i dan j, seperti operasi terkait geometri (translasi, rotasi,
pengubahan skala), operasi vektor, manipulasi citra, dan lain-lain seperti dalam
komputer, optik, serta kelistrikan [1].

1 Matriks 1-D
Matriks 1-d lebih dikenal dengan bentuk vektor yang dapat direpresentasikan dalam
bentuk
N
r
r= ∑ r eˆ
i =1
i i , (1)

dengan N adalah jumlah komponen vektor. Umumnya dalam kinematika dan dinamika
nilai N = 3. Persamaan (1) dapat pula direpresentasikan dalam bentuk matriks 2-d

 r1 
r 
r  
2

r = r3  , (2)
 
M
rN 
 

yang memiliki N baris dan 1 kolom, atau dikatakan merupakan matriks N×1.

2 Matriks 2-D
Untuk matriks 2-d komponennya dirujuk dengan dua indeks, di mana indeks pertama
menggambarkan baris dan indeks kedua menggambarkan kolom. Ukuran matriks
dinyatakan dengan, misalnya M×N, yang berarti matriks memiliki M baris dan N baris.
Matriks 2-d dilambangkan dengan

 r11 r12 r13 L r1N 


r r22 r23 L r2 N 
 21
R =  r31 r32 r33 L r3 N  , (3)
 
 M M M O M 
rM 1 rM 2 rM 3 L rMN 

95
96

untuk M baris dan N kolom. Komponen mariks R pada baris i dan kolom j dinyatakan
dengan rij [2].

3 Penjumlahan dan pengurangan matriks


Dua buah matriks dapat dijumlahkan
A = X+Y, (4)
yang berlaku untuk setiap komponennya
a ij = xij + y ij . (5)

Demikian pula untuk pengurangan


S = X+Y, (6)
dan untuk setiap komponennya
s ij = xij + y ij . (7)

4 Perkalian dua buah matriks


Matriks 2-d berukuran (M1×N1) dapat dikalikan dengan matriks berukuran (M2×N2) bila
terpenuhi N1 = M2, yang akan menghasilkan matriks berukuran (M1×N2), dengan

t11 t12   x11 x12 x13 x14 x15   y11 y12 


t t 22  =  x 21 x 22 x 23 x 24 x 25   y 21 y 22  (8)
 21
t 31 t 32   x31 x32 x33 x34 x35   y 31 y 32 

sebagai contoh dengan M1 = 3, N1 = 3, M2 = 3, dan N2 = 2, sehingga hasilnya adalah


matriks berukuran 3×2. Hubungan antara komponen matriks T, X, dan Y adalah

t ij = ∑ xik y kj . (9)
k

Persamaan (9) secara langsung telah menerapan bahwa jumlah kolom matriks pertama
harus sama dengan jumlah baris matriks kedua atau N1 = M2.

5 Beberapa operasi geometri


Sebuah titik (x, y) dalam ruang 2-d dapat dirotasikan terhadap sumbu z sebesar sudut θ
searah putaran jarum jam dengan menggunakan matriks

 cos θ sin θ 
Rθ =  , (10)
− sin θ cos θ 
97

yang digunakan dengan cara

 x'  x
  = Rθ   . (11)
 y '  y

Koordinat (x', y') adalah koordinat baru dari (x, y) yang telah dirotasikan. Penarikan atau
strechting pada arah x sebesar kx dan pada arah y sebesar ky direpresentasikan dengan

k x 0
S= . (12)
0 k y 

Suatu titik dapat direfleksikan terhadap suatu garis yang dinyatakan menggunakan
vektor (lx, ly) dengan menggunakan

1 l x − l y 2l x l y 
2 2
Rl =  . (13)
l x2 + l y2  2l x l y l y2 − l x2 

Titik dapat pula diproyeksikan secara ortogonal terhadap suatu garis menggunakan

1  u x2 u xu y 
Po =  . (14)
l x2 + l y2 u x u y u 2y 

6 Transformasi affine
Persamaan (10), (12) – (14) tidak terlalu memudahkan dalam penggunaannya terutama
bila di dalam operasinya diperlukan translasi. Transformasi affine [3] lebih praktis untuk
digunakan, yang untuk dinyatakan dalam bentuk

 x'  cos θ sin θ 0  x


 y ' = − sin θ cos θ 0  y (15)
    
 1   0 0 1  1 

untuk rotasi terhadap sumbu z sebesar sudut θ searah putaran jarum jam,

 x' 1 0 t x   x 
 y ' = 0 1 t   y  (16)
   y  
 1  0 0 1   1 

untuk translasi sebesar tx pada arah x dan ty pada y, dan

 x' s x 0 0  x
 y ' = 0 sy 0  y (17)
    
 1   0 0 1  1 
98

untuk proses scalling sebesar sx pada arah x dan sebesar sy pada arah y.
Untuk proses yang berurutan misalnya translasi (tx, ty), penskalaan, rotasi, dan translasi
kembali (tx', ty'), dapat diperoleh [3]

 s x cos θ − s y sin θ t x s x cos θ − t y s y sin θ + t 1x 


 
T' RST =  s y sin θ s y cos θ t x s x sin θ + t y s y cos θ + t 1y  . (18)
 0 0 1 
 

7 Matriks diagonal dan persamaan nilai eigen


Persamaan nila eigen memiliki bentuk
r r
Aei = λi ei , (18)
r
dengan matriks A berbentuk diagonal dan ei merupakan suatu vektor. Bila terdapat N
buah komponen vektor, maka umumnya terdapat pula N buah nilai eigen. Sebagai
contoh kedua vektor eigennya, matriksnya

1 0 3 0
 ,  ,  , (19)
0 1 0 2

dan nilai-nilai eigennya adalah 3 dan 2. Kedua vektor eigen juga bersifat ortogonal.

8 Pertanyaan
1. Buktikan Persaman (10), (13), dan (14) dengan menggambarkannya terlebih
dahulu dalam bidang xy.
2. Buktikan Persamaan (18).
2 0 0 
3. Carilah vektor dan nilai eigen dari matriks 0 5 0 .
0 0 3

9 Rujukan
1. Mike DeHaan, "Practical Uses of Matrix Mathematics", Decoded Science, 17 Dec
2013, URL http://www.decodedscience.org/practical-uses-matrix-mathematics
/40494 [20160912].
2. Wikipedia contributors, "Matrix (mathematics)", Wikipedia, The Free
Encyclopedia, en:737926831, 5 Sept 2016 | 21:51.
99

3. Wikipedia contributors, "Transformation matrix", Wikipedia, The Free


Encyclopedia, en: 737571945, 3 Sept 2016 | 18:24.
100
Sparisoma Viridi, 201609250 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Sekilas Metode Beda Hingga


diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Metode Beda Hingga atau Finite Difference Method akan dibahas secara sekilas dalam
tulisan ini.

1 Deret Taylor
Secara umum setiap fungsi f(x) dapat direpresentasikan dalam suatu deret pangkat

f (x ) = ∑c n xn , (1)
n=0

di mana konstanta-konstanta cn dapat diambil dalam bentuk

1 d n f (x )
cn = , (2)
n ! dx n x =0

yang akan membuat Persamaan (1) menjadi deret Maclaurin. Bentuk yang lebih umum
dikenal sebagai deret Taylor [1]

( x − x 0 )n d n f (x )
f (x ) = ∑ . (3)
n =0 n! dx n x = x
0

Jadi, deret Maclaurin tak lain adalah deret Taylor dengan x0 = 0.

2 Aproksimasi turunan pertama


Persamaan (3) dapat dibatasi hanya sampai dua suku pertama
df ( x 0 )
f (x ) ≈ f ( x 0 ) + (x − x 0 ) . (4)
dx

Selanjutnya, dapat didefinisikan


∆x = x − x 0 , (5)

sehingga Persamaan (4) dapat dituliskan menjadi


df ( x 0 )
f ( x 0 + ∆x ) ≈ f ( x 0 ) + ∆x . (6)
dx

Sedikit pengaturan dari Persamaan (6) akan memberikan

101
102

df ( x0 ) f (x 0 + ∆x ) − f ( x0 )
≈ . (7)
dx ∆x

Dengan membuat variabel baru x ≡ x0 maka dapat diperoleh rumusan beda depan untuk
turunan pertama suatu fungsi f(x), yaitu
df (x ) f ( x + ∆x ) − f ( x )
≈ . (8)
dx ∆x

Persamaan (5) dapat pula membuat Persamaan (4) menjadi berbeda dari Persamaan
(6), yaitu
df (x 0 )
f (x ) ≈ f ( x − ∆x ) + ∆x , (9)
dx

yang akan memberikan rumusan beda belakang untuk turuan pertama suatu fungsi f(x)
df (x ) f ( x ) − f (x − ∆x )
≈ , (10)
dx ∆x

kembali dengan membuat x0 ≡ x untuk ∆x yang kecil.

3 Aproksimasi turunan kedua


Dengan menggunakan beda depan, turunan kedua suatu fungsi dapat dituliskan
terhadap turuan pertamanya
f ′(x + ∆x ) − f ′(x )
f ′′(x ) ≈ , (11)
∆x

yang selanjutnya dengan menggunakan Persamaan (10) akan memberikan

 f (x + ∆x ) − f (x )   f (x ) − f (x − ∆x ) 
 ∆x − ∆x 
f ′′( x ) ≈    
∆x
(12)
f ( x + ∆x ) − 2 f ( x ) + f ( x − ∆x )
≈ ,
(∆x )2
yang merupakan perumusan beda hingga untuk turunan kedua suatu fungsi f(x).
Persamaan (11) dapat pula diawali dengan beda belakang untuk turunan keduanya
f ′(x ) − f ′( x − ∆x )
f ′′(x ) ≈ , (13)
∆x

baru kemudian dilanjutkan dengan penggunaan Persamaan (8)


103

 f (x + ∆x ) − f (x )   f (x ) − f (x − ∆x ) 
 ∆x − ∆x 
f ′′( x ) ≈    
∆x
(14)
f ( x + ∆x ) − 2 f ( x ) + f ( x − ∆x )
≈ ,
(∆x )2
yang akan memberikan hasil yang sama seperti dalam Persamaan (12).

4 Persamaan gelombang tali stasioner


Suatu ψ(x, t) merupakan dikatakan sebagai fungsi gelombang bila merupakan solusi dari
persamaan gelombang

d 2ψ 1 d 2ψ
2
− 2 =0, (15)
dx v dt 2

dengan v adalah laju rambat gelombang dalam medium. Bila terdapat suatu tali dengan
panjang L, bermassa m, dan diberi tegangan F, maka laju rambatnya adalah

F
v= , (16)
µ

dengan µ adalah rapat massa per satuan panjang


m
µ= . (17)
L

Persamaan (17) berlaku bila tali memiliki rapat massa yang homogen. Bila tidak tidak
maka
dm dm
µ= ≡ , (18)
dL dx

dan Persamaan (16) harus dimodifikasi. Solusi dari Persamaan (15) adalah
ψ = A± cos(kx m ωt ) + B± sin (kx m ωt ) , (19)

dengan tanda + menyatakan gelombang yang merambat ke arah +x dan tanda – untuk
gelombang yang menuju –x. Solusi dapat dipilih dengan mengambil B± = B/2 dan A± = 0
apabila diterapkan syarat batas ψ(0, t) = ψ(L, t) = 0, sehingga
ψ = 12 B sin (kx − ωt ) + 12 B sin (kx + ωt ) = B sin kx cos ωt . (20)

Persamaan (15) dapat dituliskan dalam bentuk


104

1 d2X
= k2 (21)
X dx 2

dan

1 1 d 2T
= k2 , (22)
T v 2 dt 2

dengan menggunakan separasi variabel dari fungsi


ψ (x, t ) = X (t )T (t ) . (23)

Dengan demikian Persamaan (21) dan (22) telah menggambarkan masing-masing hanya
merupakan fungsi spasial dan temporal yang terpisah. Selanjutnya Persamaan (22) dan
(23) dapat dipilih berdasarkan Persamaan (20) dan (23) menjadi
X (x ) = B sin (kx ) (24)

dan
T (t ) = cos(ωt ) , (25)

yang sudah merupakan solusinya. Solusi ini seharusnya dapat pula diperoleh dari
metode beda hingga, yang menerapkan Persamaan (12) ke Persamaan (21) dan (22).
Suku spasial dalam Persamaan (21) menarik untuk dibahas, yang dapat dituliskan
kembali menjadi

d2X
−k2X = 0 (26)
dx 2

atau dalam bentuk beda hingganya


X ( x + ∆x ) − 2 X ( x ) + X ( x − ∆x )
− k 2 X (x ) = 0 . (27)
(∆x )2
Persamaan (27) dapat dituliskan kembali menjadi
X (x + ∆x ) + X (x − ∆x )
X (x ) = (28)
2 + (k∆x )
2

dengan syarat batas yang harus dipenuhi adalah


X (0) = X (L ) = 0 . (29)

Dalam proses perhitungannya tidak serta-merta Persamaan (28) akan memberikan


jawaban yang diinginkan, melainkan perlu dilakukan iterasi berulang-ulang, sehingga
105

Persamaan (28) lebih tepat apabila dituliskan sebagai berikut ini, yang telah memuai
langkah iterasi ke-n nya
X n (x + ∆x ) + X n ( x − ∆x )
X n +1 ( x ) = . (30)
2 + (k∆x )
2

Persamaan (29) harus berlaku untuk semua n. Iterasi akan berhenti saat hasilnya
mendekati hasil prediksi teori
M
ε= ∑ X (i∆x ) − X (i∆x )
i=0
n teori (31)

dengan L = M∆x atau


M
ε= ∑ X (i∆x ) − X (i∆x)
i=0
n n −1 (32)

yang berarti bahwa hasilnya tidak lagi berubah secara numerik. Persamaan (31)
digunakan bila solusi analitik diketahui dan Persamaan (32) bila tidak ada solusi analitik
(atau sulit diperoleh). Saat n = 1 diperlukan pula syarat awal iterasi yang berpengaruh
pada hasil akhirnya. Hasil-hasil berikut ini diberikan dengan B = 1, ∆x = 0.04, M = 50
(atau 48 untuk λ = 4/3), L = 2, dan λ = 4, 2, 4/3, serta N = 300. Amplitudo A diperlukan
untuk fungsi

 2πx 
X teori (x ) = A sin (kx ) = A sin   (33)
 λ 

sebagai pembanding dari teori.


0.45
0.4
0.35
0.3
0.25
X(x)
0.2
0.15
0.1
0.05
0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
x

Gambar 1. Solusi beda hingga (□) dan teori (–) dengan λ = 4 dan A = 0.39B.
106

Untuk λ = 4 digunakan syarat awal X(0 < x < L) = 1 sehingga dapat diperoleh hasil
seperti dalam Gambar 1 seperti yang diharapkan. Sementara belum dapat diperoleh
penjelasan mengapa A = 0.39B. Selanjutnya adalah untuk λ = 4 yang memerlukan syarat
awal iterasi yang berbeda dengan hasilnya diberikan dalam Gambar 2.
0.08

0.06

0.04

0.02

X(x) 0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
-0.02

-0.04

-0.06

-0.08
x

(a)
0.016 0.016

0.012 0.012

0.008 0.008

0.004 0.004

X(x) 0 X(x) 0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
-0.004 -0.004

-0.008 -0.008

-0.012 -0.012

-0.016 -0.016
x x
(b) (c)
Gambar 2. Hasil untuk λ = 4 dengan: (a) penerapan syarat batas sebelumnya, (b) X(L/2) = 0, dan
(c) X(L/2) = 0 dan X(L/2 < x < L) = -1.

Pada Gambar 2 digunakan berturut-turut nilai A/B = 0.068, 0.0115, 0.0115 agar hasilnya
cocok dengan amplitudo menurut teori. Gambar 2(b) terlihat bahwa syarat terdapat
simpul pada X = L/2 tidaklah cukup, melainkan perlu pula dibuat bahwa amplitudo
untuk L/2 < x < L bernilai negatif sehingga dapat diperoleh Gambar 2(c), sebagaimana
solusinya diharapkan. Kembali nilai A = 0.115B untuk sementara sumbernya belum
dapat dijelaskan. Selanjutnya adalah kasus untuk λ = 4/3, yang nilai M perlu diubah
terlebih dahulu menjadi 48 agar genap dibagi dengan tiga bagian untuk menerapkan
syarat awal iterasi X(0) = X(L/3) = X(2L/3) = X(L) = 0 sebagai posisi simpul. Hasilnya
dapat dilihat dalam Gambar 3.
107

0.004

0.003

0.002

0.001

X(x) 0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
-0.001

-0.002

-0.003

-0.004
x

(a)
0.000015 0.000015

0.00001 0.00001

0.000005 0.000005

X(x) 0 X(x) 0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
-0.00000 -0.00000

-0.00001 -0.00001

-0.00001 -0.00001
x x

(b) (c)
Gambar 3. Hasil untuk λ = 4/3 dengan: (a) penerapan syarat batas sebelumnya, (b) X(L/3) =
X(2L/3) = 0, dan (c) X(L/3) = X(2L/3) = 0 dan X(L/3 < x < 2L/3) = -1.

Kembali pada hasil dalam Gambar 3 ini perlu ditentukan terlebih dahulu posisi simpul
dan nilai amplitudonya yang harus negatif untuk selang L/3 < x < 2L/3. Diperoleh bahwa
A/B = 1.3×10-5.
2E-09 2.5E-13
2E-13
1.5E-09
1.5E-13
1E-09
1E-13
5E-10 5E-14
X(x) 0 X(x) 0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 -5E-14 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
-5E-10
-1E-13
-1E-09
-1.5E-13
-1.5E-09 -2E-13
-2E-09 -2.5E-13
x x

-9 -13
Gambar 4. Hasil untuk: (a) λ = 1, M = 48, A/B = 1.27×10 dan (b) λ = 1, M = 50, A/B = 2.1×10 .
108

1.0E+02

A/B
1.0E-02
A/B = 3.34E-04e1.77E+00λ
R² = 1.00E+00
1.0E-06

1.0E-10 A/B = 1.10E-28e4.41E+01 λ


R² = 1.00E+00
1.0E-14
0 1 2 3 λ 4

Gambar 5. Hubungan antara A/B dan λ untuk ∆x = 0.04.


Diperoleh hubungan antara A/B dengan λ secara empirik-numerik, yaitu

A  3.34 × 10 −4 e1.77 λ , 0.8 ≤ λ ≤ 1.333,


= (34)
B 1.10 × 10 − 28 e 44.1λ , 1.333 ≤ λ ≤ 4,

yang dirasakan cukup baik untuk kasus ini. Akan tetapi dengan melihat kembali hasil
dalam Gambar 4(b), puncak-puncak sudah digambarkan dengan tiga titik yang bernilai
sama, hal ini menunjukkan bahwa nilai M kurang banyak atau ∆x kurang kecil. Perlu
dikaji lebih lanjut mengenai hal ini.

5 Pertanyaan
1. Carilah perumusan f '''(x) dengan menggunakan metode beda hingga.
2. Dengan menggunakan nilai Δx yang lebih kecil dan M yang lebih besar, buatlah
gambar yang mirip dengan Gambar 5 dan temukan suatu rumusan empirik-
numerik yang lebih universal.

6 Rujukan
1. Mary L. Boas, "Mathematical Methods in the Physical Sciences", John Wiley &
Sons, New York, 2nd edition, 1983, p. 23.
Sparisoma Viridi, 201610030 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Jaringan Saraf Tiruan


diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Dalam bidang kajian pembelajaran mesin (machine learning) dan sains kognitif
(cognitive science) terdapat jaringan saraf tiruan (artificial neural network) yang
terinspirasi oleh jaringan saraf biologis (sistem pusat sarat, secara khusus merupakan
otak), yang digunakan untuk melakukan estimasi atau sebagai fungsi aproksimasi, di
mana sistem ini bergantung dari sejumlah besar masukan yang secara umum belum
diketahui [1].

1 Komponen
Penjelasan mengenai algoritma suatu saringan saraf tiruan (JST) secara khusus
melibatkan tiga hal, yaitu [2]
i. Arsitektur. Komponen ini memberikan spesifikasi variabel-variabel yang terlibat
dalam jaringan dan hubungan-hubungan topologinya, termasuka di dalamnya
pembobotan koneksi antara neuron, bersama-sama terkait dengan aktivitas
neuron-neuron.
ii. Aturan aktivitas. Aturan ini mendefinisikan bagaimana aktivitas perubahan
neuron sebagai tanggapan atas sinyal dari neuron lain, yang menyebabkan
dinamika dalam skala waktu yang pendek. Secara khusus aturan aktivitas
bergantung dari bobot (parameter) dalam jaringan.
iii. Aturan belajar. Bagaimana cara bobot dalam jaringan berubah dengan waktu
dispesifikasikan dalam aturan ini. Proses pembelajaran ini dipandang sebagai
sesuatu yang terjadi untuk skala waktu yang lebih panjang dari dinamika yang
terjadi akibat aturan aktivitas. Aturan ini bergantung pada aktivitas neuron-
neuron, dan dapat pula bergantung pada target yang diasup oleh pengajara
dan nilai saat ini dari bobot-bobot dalam jaringan.

2 Neuron tunggal
Pendefinisian suatu neuron tunggal diawali dengan pendefinisian ketiga komponennya,
yaitu arsitektur, aturan aktivitas, dan aturan belajar.
Arsitektur. Suatu neuron tunggal memiliki sejumlah I masukan xi dan satu keluaran y.
Terkait dengan setiap masukan adalah bobot wi (i = 1, .., I). Selain itu dapat pula

109
110

terdapat parameter tambahan yang dikenal dengan panjar (bias) w0, yang dapat
dipandang sebagai bobot yang terkait dengan sebuah input x0 yang secara permanen
dibuat sama dengan 1. Neuron tunggal merupakan suatu devais feedforward – yang
berarti bahwa koneksi terahkan dari masukan menuju keluaran neuron-neuron.
Aturan aktivitas. Terdapat dua tahap dalam aturan aktivitas.
1. Pertama, sebagai respons dari vektor input x, dapat dihitung aktivasi neuron
I
a = ∑ wi xi , (1)
i =0

di mana i dimulai dari 1 bila tidak terdapat panjar.


2. Kedua, keluaran y ditetapkan sebagai suatu fungsi dari aktivasi, sehingga
keluaran dikatakan pula sebagai aktivitas dari neuron, yang jangan tertukar
degan aktivasi a. Terdapat berbagai fungsi aktivasi, yang sering digunakan.
a. Fungsi aktivasi determistik
i. Linier

y (a ) = a , (1)

ii. Sigmoid (fungsi logistik)


1
y (a ) = , y ∈ (0,1) , (1)
1 + e −a
iii. Sigmoid (tanh)

y (a ) = tanh (a ), y ∈ (− 1,1) , (1)

iv. fungsi ambang (treshold)

 1, a > 0,
y (a ) = θ (a ) ≡  (1)
− 1, a ≤ 0,
b. Fungsi aktivasi stokastik (y dipilih secara stokastik dari ±1
i. kolam hangat (heat bath)

 1
 1, dengan probabilitas
y (a ) = 
,
1 + e −a (1)
− 1, lainnya,
111

ii. aturan metropolis menghasilkan keluaran dengan suatu cara yang


bergantung dari keadaan keluaran sebelumnya y
Hitung ∆ = ay
Bila ∆ ≤ 0, ubah (flip) y ke keadaan lain
Bila tidak ubah (flip) y ke keadaan lain dengan probabilitas e–∆.
Neuron tunggal disebut juga sebagai satuan penghitung (computing unit).

3 Jaringan McCulloch-Pitts
Satuan penghitung McCulloch-Pitts (MP) lebih sederhana dari neuron tunggal di mana
sinyal masukan dan keluaran bernilai biner, yaitu 0 atau 1. Jaringannya tersusun atas sisi
terarah yang tak diberi bobot yang terdiri dari dua jenis: pengeksitasi (excitatory) dan
penghambat (inhibitory). Nilai ambang (treshold) dari neuron MP adalah θ.
Aturan dalam melakukan evaluasi suatu satuan peghitung MP adalah [3]
- masukan pengeksitasi adalah x1, x2, .., xN, dan masukan penghambat adalah y1, y2,
.., yM,
- bila M ≥ 1 dan terdapat satu masukan penghambat yang bernilai 1 maka hasil
perhitungan adalah 1,

- bila tidak perlu dihitung x = ∑ xi dan bila x ≥ θ maka hasilnya adalah 1, bila tidak
i

0.

4 Pertanyaan
1. Carilah perumusan f '''(x) dengan menggunakan metode beda hingga.
2. Dengan menggunakan nilai Δx yang lebih kecil dan M yang lebih besar, buatlah
gambar yang mirip dengan Gambar 5 dan temukan suatu rumusan empirik-
numerik yang lebih universal.

5 Rujukan
1. Wikipedia contributors, "Artificial neural network", Wikipedia, The Free
Encyclopedia, en:742261055, 2 Oct 2016 | 17:39.
2. D. J. C. MacKay, "Information Theory, Inference, and Learning Algorithms",
Cambridge University Press, version 7.2 (4th printing), 2005, p. 470.
112

3. R. Rojas, "Neural Networks: A Systematic Introduction", Springer-Verlag, Berlin,


1996, pp. 31-32.
Sparisoma Viridi, 201612200 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Lengkungan Batang
diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Pemodelan lengkungan batang berdasarkan sifat elastisitas bahan disajikan dalam


bagian ini.

1 Modulus Young
Terdapat sebuah batang panjang dengan luas penampang A dan panjang L seperti
pada diberikan dalam Gambar 1. Gaya F diberikan tegak lurus pada penampang
sehingga terjadi perubahan panjang ∆L. Modulus Young diperoleh lewat [1]
F/A
E= . (1)
∆L / L
Gaya F disebut juga dengan tegangan (stress) σ dan pertambahan panjang ∆L disebut
juga sebagai regangan (strain) ε.
F

A ∆L

Gambar 1. Pertambahan panjang panjang ∆L saat batang dengan panjang L diberikan gaya F
pada penampangnya A.
Dengan demikian dapat pula dinyatakan bahwa
σ
E= . (2)
ε
Kurva tegangan regangan umumnya digunakan untuk menentukan elastisitas suatu
bahan, yang bagian liniernya akan memberikan informasi modulus Young.
113
114

2 Modulus geser
Gaya F yang diberikan pada penampang A dapat pula tidak berarah tegak lurus
melainkan searah, sehingga terjadi pergeseraan posisi penampang A sebesar ∆x
sehingga dapat didefinisikan modulus geser [2]

F/A
G= , (3)
∆x / L
yang ilustrasinya diberikan dalam Gambar 2 berikut.

θ
∆x
A F

Gambar 2. Pergeseran posisi penampangnya A sejauh ∆x saat diberi gaya F yang berarah sejajar
dengan luas penampang tersebut.
Sudut θ yang dibentuk memenuhi hubungan

∆x
tan θ = . (4)
L
Perhatikan bahwa untuk panjang batang tetap digunakan notasi yang sama L.

3 Konstanta puntir
Dapat pula, alih-alih gaya sejajar penampang A yang berikan, suatu torsi τ dapat juga
diterapkan pada penampang sehingga batang dengan panjang L akan terpuntir sejauh θ
sebagaimana divisualisasikan dalam Gambar 3. Konstanta puntir J yang terkait dengan
modulus geser G dapat diperoleh lewat [3]

τL
JG = . (5)
θ
Nilai θ ini diukur pada ujung bebas yang diberi torsi τ.
115

4 Pertanyaan
1. Turunkan rumusan lengkungan batang dengan Persamaan (5).
2. Jelaskan apa yang dimaksud dengan rasio Poisson [4]?
3. Pelajari hasil-hasil yang diperoleh dalam Gambar 3 dan buat model empirik
kelengkungan batang sebagai fungsi dari G dan M.
1 1
G = 10×10 4 M =2 g M=8 g
G = 5×10 4
0.8 M = 12 g
0.8
G = 4×10 4

0.6 0.6

y y M = 16 g

0.4 G = 3×10 4 0.4

0.2 0.2 M = 20 g
G = 2.5×10 4
M = 22 g
0 0
0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1
x x

Gambar 3. Kelengkungan batang sebagai hasil rumusan yang diperoleh [5] untuk berbagai
nilai modulus geser (kiri) dan massa total batang (kanan).
4. Bandingkan hasil dalam Gambar 3 dengan perumusan dalam [6]. Jelaskan
perbedaan fenomena fisis yang dibahas dalam kedua rujukan tersebut.

5 Rujukan
1. Wikipedia contributors, "Young's modulus", Wikipedia, The Free Encyclopedia,
en:740068517, 18 Sept 2016 | 21:40.
2. Wikipedia contributors, "Shear modulus", Wikipedia, The Free Encyclopedia,
en:733816162, 10 Aug 2016 | 08:39.
3. Wikipedia contributors, "Torsion modulus", Wikipedia, The Free Encyclopedia,
en:740941587, 24 Sep 2016 | 09:11.
4. Wikipedia contributors, "Poisson's ratio", Wikipedia, The Free Encyclopedia,
en:742426408, 3 Oct 2016 | 17:05.
5. S. Viridi1, M. Abdullah, N. Amalia, "Two-dimension curvature of a wire: A simple
model using shear modulus concept", Sympsium Nanotechnologi, Denpasar,
Indonesia, 28-29 October 2016.
116

6. M. Abdullah, S. Khairunnisa, F. Akbar, "Bending of Sparklers", European Journal


of Physics 35 (3) 035019 (2014).
Sparisoma Viridi, 201612200 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Monte-Carlo untuk Aliran Fluks


diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Sederhana
Dalam bagian ini disajikan contoh aplikasi metode Monte-Carlo [1] dalam C++ untuk
aliran fluks sederhana.

1 mcssf.cpp
/*
mcssf.cpp
Monte-Carlo implementation in simple flux flow

Sparisoma Viridi | dudung@gmail.com

Compile: g++ mcssf.cpp -o mcssf


Execute: ./mcssf

20160324
Create this program.
*/

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>

using namespace std;

int main(int argc, char *argv[]) {


// Define program name
const char *pname = "mcssf";

// Verbose usage
if(argc < 4) {
cout << "Usage: " << pname << " ";
cout << "[N0 prob ofile]" << endl;
cout << "N0\tInitial number of particles" << endl;
cout << "prob\tDecaying probability" << endl;
cout << "ofile\tOutput file" << endl;
return 1;
}

117
118

// Get arguments and set the related parameters


int N0 = atoi(argv[1]);
double prob = atof(argv[2]);
const char *ofn = argv[3];

// Start pseudo random generator


srand(time(NULL));

// Open file and write header


ofstream fout;
fout.open(ofn);
fout << "# t\tN" << endl;

// Set initial number of particles


int N = N0;

// Generate Ne events
int Ne = N0 * 10;
for(int ie = 0; ie < Ne; ie++) {
// Show results
fout << ie << "\t";
fout << 1.0 * N / N0 << endl;

// Set probability of events between Imin and Imax


int Imin = 1;
int Imax = N;
int Iprob = prob * (Imin + Imax);

// Allow or disallow decaying process


for(int je = 0; je < N; je++) {
int I = Imin + rand() % (Imax - Imin + 1);
bool is_accepted = I <= Iprob;
if(is_accepted && N > 0) {
N--;
}
}

// Force terminate iteration


if(N == 0) {
break;
}
}

// Close file
fout.close();

// Terminate program with success state


return 0;
119

2 plot-data.gps
# plot-data.gps
set term png
set output "data.png"

# Define fitting functions


f1(x) = exp(-l1 * x)
f2(x) = exp(-l2 * x)

fit f1(x) "data-050.txt" via l1


fit f2(x) "data-080.txt" via l2

t1 = sprintf("N(t) = e^{%f t}", l1)


t2 = sprintf("N(t) = e^{%f t}", l2)

set xrange [0:20]

plot \
"data-050.txt" u 1:2 w p pt 4 ps 2.0 lc 1 t "p = 0.5", \
f1(x) t t1 lt 1 lw 2, \
"data-080.txt" u 1:2 w p pt 6 ps 2.5 lc 2 t "p = 0.8", \
f2(x) t t2 lt 2 lw 2

3 Pertanyaan
1. Ketik program mcssf.cpp, kompilasi
g++ mcsff.cpp -o mcsff
dan jalankan dengan cara
./mcsff 1000 0.50 data-050.txt
./mcsff 1000 0.80 data-080.txt
lalu, lanjutkan dengan mengetik script gnuplot plot-data.gps dan jalankan
gnuplot plot-dat.gps
sehingga diperoleh Gambar 1 berikut.
120

Gambar 3. Hasil simulasi aliran fluks dengan metode Monte-Carlo dan hasil fittingnya
menggunakan Gnuplot.

2. Lakukan variasi N0 dan prob saat memanggil program mcssf.cpp dan petakan nilai
prob ke persamaan
N (t ) = e − λt (1)

sehingga diperoleh hubungan antara prob dan λ.

4 Rujukan
1. Wikipedia contributors, "Monte Carlo method", Wikipedia, The Free
Encyclopedia, en: 755048141, 15 Dec 2016 | 23:31.
Sparisoma Viridi, 201612200 dalam Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya

Catatan Penutup
diperbolehkan selama untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Komputasi Fisika merupakan suatu catatan kuliah yang bagian-bagian materinya


diberikan dalam perkuliahan FI2283 Pemrograman dan Simulasi Fisika dan FI5005
Komputasi Sistem Fisis bergantung tingkat kerumitannya pada Semester I Tahun
2016/2017.
Draft versi 20161220 ini belum selesai dan akan dilanjutkan.

Bandung, 20 Desember 2016

Dr. rer. nat. Sparisoma Viridi, S.Si., M.Si.


Associate Professor in Granular Physics
GS: https://scholar.google.com/citations?user=_HjSaE0AAAAJ
ORCID: http://orcid.org/0000-0002-7588-4539
Scopus: 14829794900

121
122
View publication stats
Sparisoma Viridi, Komputasi Fisika, Departemen Fisika, Institut Teknologi Bandung | Lisensi ITB 2016 | Penyebaran dalam bentuk aslinya diperbolehkan selama
untuk tujuan pendidikan dan tak-komersial. Modifikasi dan pembuatan karya turunan memerlukan ijin dari penulis | dudung@gmail.com

Anda mungkin juga menyukai