Modul 1 Persamaan Diferensial Numerik: Pengenalan GNU Octave

Modul 1 Persamaan Diferensial Numerik: Pengenalan GNU Octave

Kembali ke Persamaan Diferensial Numerik

Octave adalah software dan bahasa pemrograman yang umum digunakan dalam analisis numerik. Syntax pada Octave kompatibel dengan MATLAB, bahkan script file dari Octave juga menggunakan ekstensi yang sama (.m). Pada praktikum ini, akan dijelaskan tentang penggunaan Octave dan pengaplikasiannya dalam Persamaan Diferensial Numerik.

Pastikan Octave telah terinstal pada computer kalian. Kalian dapat mengunduh Octave di https://www.gnu.org/software/octave/download

Alternatif untuk macOS: https://octave-app.org/

Operasi, Variabel, Matriks

Setelah terinstal, akan ada dua jenis launcher, yaitu “Octave (GUI)” dan “Octave (CLI)”. Jalankan “Octave (GUI)”, lalu akan muncul jendela seperti ini:

Secara default, Terdapat 4 sub-jendela, yaitu File Explorer, Workspace, Command History, dan Command Window (dll.)

  • File Explorer berisi path yang dituju pada address bar. File Explorer berguna untuk membuka file .m ataupun file-file lain tanpa harus membuka Windows Explorer.
  • Workspace berisi data tentang variabel yang didefinisikan saat menjalankan pemrograman nantinya. Data-data yang disajikan berupa identitas dari tiap variabel, seperti nama, kelas, dimensi, value, dan atribut.
  • Command History berisi Riwayat dari semua command yang dijalankan pada Command Window.
  • Command Window sebenarnya mempunyai 3 sub-jendela lain yang dapat ditukar ataupun ditumpuk.
    • Command Window adalah command line utama dari Octave dan digunakan untuk menjalankan semua kode maupun program dari Octave. Untuk menjalankan kode dari Command Window, ketikkan kode yang diinginkan, lalu tekan Enter.
    • Documentation berisi dokumentasi dari Octave, seperti tutorial, detail dari fungsi-fungsi built-in, penerapan, dll.
    • Variable Editor berguna untuk mengubah variabel yang ada di Workspace. Variable Editor berbentuk baris dan kolom sehingga memudahkan untuk membuat matriks.
    • Editor adalah jendela scripting utama dari Octave. Script yang dibuat di Editor dapat disimpan dalam file ekstensi .m dan dijalankan dengan Command Window ataupun dengan menekan F5.

Aritmatika Standar

Octave dapat digunakan untuk kalkulasi numerik dasar. Octave mengenal operator aritmatika (+, -, *, /), operator pangkat (^) (berbeda dengan kebanyakan Bahasa pemrograman), fungsi eksponen dan logaritma (exp, log), dan fungsi trigonometri (sin, cos, …). Kalkulasi pada Octave juga bekerja pada bilangan real ataupun imajiner (I, j). Beberapa konstanta, seperti bilangan Euler (e) dan bilangan pi (pi), sudah pre-defined pada Octave. Anda juga dapat menambahkan komentar pada kode dengan menggunakan persen (%).

1 + 2 %Operasi Aritmatika Standar
ans = 3

Terlihat bahwa value hasil running disimpan dalam suatu variabel yang bernama ans. Variabel ini akan menyimpan seluruh hasil dari ekspresi yang di-input dan akan ditimpa jika ada ekspresi baru yang menyimpan hasil.

Ekspresi tersebut juga dapat disimpan ke suatu variabel.

a = 2 + 3
a = 5

Terlihat bahwa output menunjukkan variabel a, bukan ans.

Jika tidak ingin print hasilnya, beri titik koma (;) pada akhir line…

a = 1 + 3;

… dan jika ingin menampilkan lagi outputnya, cukup memanggil variabelnya.

a
a = 4

Untuk update variabel, dapat menggunakan cara ini:

a = a + 6 %Variabel a ditambah 6
a = 10
a = a / 5 %Dapat disesuaikan dengan operator lainnya
a = 2
a -= 6 %Idem
a = -4
a *= -5 %Idem
a = 20
a = "ayam" %Update variabel a dengan nilai baru
a = ayam

Sebagai tambahan, tidak seperti Mathematica, value pada Octave menggunakan presisi mesin (machine precision), sehingga beberapa hasil yang ditampilkan mungkin saja tidak bulat. Sebagai contoh, akan ditampilkan hasil dari \(e^{i \pi}\) (Identitas Euler)

e^(i*pi)
ans = -1.0000e+00 + 1.2246e-16i

Harusnya tepat -1, tetapi ternyata ada sedikit error \(10^{-16}\).

Pendefinisian dan Pemanggilan Matriks

Matriks ataupun vektor akan menjadi hal esensial untuk analisis numerik. Untuk mendefinisikan matriks, gunakan kurung siku ([]) untuk membuat matriks. Elemen pada baris dipisahkan dengan koma (,), dan elemen pada kolom dipisahkan dengan titik koma (;)

Contoh:

A = [1, 2, 3; 4, 5, 6; 7, 8, 9]
A =

   1   2   3
   4   5   6
   7   8   9

Catatan: Sebenarnya kita dapat mendefinisikan kode untuk matriks tanpa menggunakan koma ataupun titik koma. Cukup dengan menggunakan spasi dan Enter…

B = [1 2 3
4 5 6
7 8 9]
B =

   1   2   3
   4   5   6
   7   8   9

… namun hal ini dapat menyebabkan beberapa ambiguitas dalam pendefinisian beberapa elemen dalam matriks. Disarankan tetap menggunakan titik dan titik koma, kecuali untuk matriks yang isinya simpel.

Selanjutnya, untuk memanggil elemen dari matriks, gunakan tanda kurung ((a, b)) dengan a adalah indeks baris dan b adalah indeks kolom. Catatan: Indeks pada Octave dimulai dari 1.

A(2, 3)
ans = 6

Jika ingin memanggil lebih dari satu elemen, kalian dapat menggunakan titik dua (a:b) ataupun kurung siku ([a,b]). Titik dua (a:b) akan memanggil elemen baris/kolom dari a hingga b…

Contoh: Memanggil elemen baris ke-2 dan kolom dari 2 hingga 3:

A(2, 2:3)
ans =

   5   6

… dan kurung siku ([a,b]) akan memanggil elemen baris/kolom ke-a dan ke-b.

Contoh: Memanggil elemen baris ke-1 dan kolom ke-1 dan ke-3:

A(1, [1,3])
ans =

   1   3

Contoh: Memanggil elemen baris ke-1 dan ke-3, dan kolom dari 2 hingga 3:

A([1,3], 2:3)
ans =

   2   3
   8   9

Operasi Matriks

Matriks yang telah dibuat dapat diubah isinya, ditranspos, diinvers, dll. Untuk mengubah isi dari matriks, dapat menggunakan pemanggilan indeks.

A
A =

   1   2   3
   4   5   6
   7   8   9
A(2, 3) = 5 %Mengubah satu elemen
A =

   1   2   3
   4   5   5
   7   8   9
A(2, [1,3]) = 3 %Mengubah banyak elemen dengan 1 nilai 
A =

   1   2   3
   3   5   3
   7   8   9

Mengubah banyak elemen dengan nilai yang bersesuaian dengan tempat:

A(1:3, 1) = [2; 4; 8]
A =

   2   2   3
   4   5   3
   8   8   9

Jika posisi salah, akan dicoba dengan transpose nya:

A(1:3, 3) = [2, 4, 8] 
A =

   2   2   2
   4   5   4
   8   8   8

Jika masih tidak bisa dengan transpose nya, akan ada pesan error

A(2, 1:3) = [2, 4]
error: =: nonconformant arguments (op1 is 1x3, op2 is 1x2)

Operasi matriks pada Octave mengikuti operasi pada aljabar linear biasa, dimana perkalian matriks harus mengikuti baris dan kolom yang sesuai.

A * 2 %Perkalian scalar
ans =

    4    4    4
    8   10    8
   16   16   16
A + B %Penjumlahan matriks 
ans =

    3    4    5
    8   10   10
   15   16   17
A * B %Perkalian matriks 
ans =

    24    30    36
    52    65    78
    96   120   144

Untuk memanggil transpos dari matriks, gunakan tanda petik satu (’), dan untuk memanggil invers dari matriks, gunakan fungsi inv. Jika matriks yang diinvers singular (det = 0), maka akan muncul pesan peringatan dan elemennya akan menjadi Inf.

D = [1, 2, 3; 4, 5, 6]
D =

   1   2   3
   4   5   6
D' %Transpos dari matriks 
ans =

   1   4
   2   5
   3   6
E = [1, 2; 5, 7]
E =

   1   2
   5   7
inv(E) %Invers dari matriks
ans =

  -2.3333   0.6667
   1.6667  -0.3333
F = [1, 2; 4, 8]
F =

   1   2
   4   8
inv(F) %Contoh invers untuk matriks singular
warning: matrix singular to machine precision
ans =

   Inf   Inf
   Inf   Inf

Octave juga mempunyai operator khusus, yaitu (\). Operator ini adalah operator “pembagian” matriks. Pendefinisian untuk A \ b ekuivalen dengan inv(A) * b. Operasi ini sangat berguna untuk penyelesaian sistem linear. Sebagai contoh, misalkan kita mempunyai sistem linear berikut:

\[4x_1 - 2x_2 = 20\] \[-5x_1 - 5x_2 = -10\]

Jika kita ubah dalam bentuk perkalian matriks \(Ax=b\) (dengan penyelesaian \(x = A^{-1} b\)), diperoleh:

\[A = \begin{pmatrix} 4 & -2 \\ -5 & -5 \end{pmatrix}\]

\[x = \begin{pmatrix} x_1 \\ x_2 \end{pmatrix}\]

\[b = \begin{pmatrix} 20 \\ -10 \end{pmatrix}\]

Jika dimasukkan ke Octave, kita akan memperoleh:

A = [4, -2; -5, -5]
A =

   4  -2
  -5  -5
b = [20; -10]
b =

   20
  -10
x = inv(A) * b
x =

   4.0000
  -2.0000
x = A \ b
x =

   4
  -2

Diproleh \(x_1 = 4\) dan \(x_2 = -2\).

Variable Editor

Sesuai namanya, Variable Editor digunakan untuk mengubah nilai dari suatu variabel. Untuk menggunakannya, double-click variabel yang ingin diubah pada workspace. Variabel tersebut akan muncul pada tab Variable Editor (atau tekan Ctrl+6).

Antarmuka dari Variable Editor mirip seperti Excel, sehingga kalian bisa langsung mengubah nilai matriks yang ada dengan memilih kotak yang berisi elemen yang ingin diubah, lalu mengetik nilai yang baru.

Jika kalian memberi nilai baru pada kotak kosong di Variable Editor, matriks tersebut akan mengalami perubahan bentuk, menyesuaikan dengan posisi elemen nilai baru tersebut.

Pada gambar di atas, nilai baru dimasukkan pada baris 5 kolom 5, sehingga matriks tersebut berubah menjadi 5x5.

Untuk menghapus suatu baris/kolom, klik kanan angka baris/kolom (atau pilih lebih dari satu baris/kolom dengan Ctrl/Shift), lalu klik Delete rows/Delete columns.

File dan Editor untuk kode

Sejauh ini, kita menggunakan command line untuk menjalankan kode. Namun, kalian juga bisa melakukan scripting seperti pemrograman pada umumnya dengan menggunakan Editor. Untuk memunculkan Editor, klik Tab Editor (atau tekan Ctrl+4).

Untuk membuat file baru, klik New Script (ikon kertas). Kalian juga dapat membuka file .m (file MATLAB) yang tersimpan dengan double-click file tersebut di File Explorer pada Octave ataupun di Windows Explorer (atau /root atau lainnya).

Script bekerja layaknya Bahasa pemrograman biasa. Kalian dapat menjalankan script yang telah dibuat dengan menekan F5 (jika file belum di-save, akan muncul kotak dialog untuk save). Output dari script tersebut akan muncul pada Command Window.

Catatan: Jika kalian menggunakan Editor, disarankan mengubah layout dari Editor dan Command Window untuk mempermudah melihat output (tidak perlu ganti tab). Untuk memindahkan layout, klik dan drag tulisan Editor pada bagian atas jendela Editor ke tempat yang diinginkan. Contohnya seperti gambar berikut:

Pemrograman dan Fungsi

I/O

Dalam pemrograman, seringkali pengguna diminta memberi suatu input, entah suatu nilai, string, dll., ke program, lalu program tersebut akan menggunakan input tersebut sebagai nilai dari suatu variabel. Hal ini juga dapat dilakukan pada Octave. Untuk membuat Octave meminta input dari user, gunakan syntax input(prompt), dengan prompt adalah string yang berisi pesan dalam input.

A = input("Masukkan suatu angka: ")
Masukkan suatu angka:  135
A = 135

Jika tidak ingin membuat pesan input, cukup isi “” sebagai prompt.

A = input("")
 100
A = 100

Perlu diketahui bahwa input yang diberikan pengguna akan dievaluasi sebagai ekspresi. Jadi, bisa saja input yang diberikan akan dievaluasi sebagai kode Octave (sebagaimana eval(input(...)) pada Python). Sebagai contoh, jika kita memasukkan operasi bilangan pada input…

B = input("Operasi bilangan: ")
Operasi bilangan:  2 + 3
B = 5

…, maka operasi tersebut akan dievaluasi dan memberikan hasil operasinya. Jika kita memasukkan kode Octave, seperti meng-assign suatu variabel…

C = input("Assign variabel: ")
Assign variabel:  x = 25
C = 25

…, maka nilai dari variabel yagn di-assign akan masuk ke variabel input…

x
x = 25

… sekaligus variabel yang di-assign di dalam input. Jika kalian ingin agar input yang dimasukkan tidak dievaluasi, input tersebut dapat diubah terlebih dahulu menjadi string.

D = input("Masukkan string: ")
Masukkan string:  "x + 25"
D = x + 25
typeinfo(D) % untuk menanyakan tipe data variabel
ans = string

Ternyata tipe data string, sesuai yang kita harapkan.

Cara lain, bisa juga dengan menambah argumen pada input() menjadi input(prompt, “s”). Jika menambahkan argumen, maka apapun input yang kalian masukkan akan menjadi string tanpa perlu menggunakan tanda petik.

E = input("Masukkan string: ", "s")
Masukkan string:  x + 25
E = x + 25
typeinfo(E)
ans = sq_string

Note: Syntax input() sebaiknya digunakan sebagai nilai dari suatu variabel.

Selain menggunakan input(), kita juga bisa menggunakan syntax menu(title, op1, op2, …). Syntax tersebut akan memunculkan kotak dialog dengan judul title dan pilihan op1, op2, dst. (sesuai yang dimasukkan). Syntax ini sangat berguna untuk program-program interaktif karena mempunyai GUI sendiri.

F = menu("Pilih buah favorit.", "Apel", "Jeruk", "Pisang")

F = 1

Tergantung pilihan kalian, variabel yang mengandung menu() akan diisi bilangan dari 1 hingga n tergantung banyaknya pilihan. Dalam contoh di atas, pilihan “Apel” akan memberi nilai 1, “Jeruk” akan memberi nilai 2, dan “Pisang” akan memberi nilai 3. Jika kalian memilih Cancel atau membuat pilihan yang tidak valid, maka variabelnya akan diberi nilai 0.

Untuk output, mungkin cukup untuk memanggil variabel itu sendiri, seperti…

C
C = 25

…, namun kalian juga bisa hanya memunculkan nilai dari variabelnya tanpa sekaligus memunculkan variabel tersebut dengan menggunakan syntax disp(). Syntax ini digunakan jika yang di-output hanya suatu variabel atau string simpel, dll.

disp(C)
25
disp("Simple string")
Simple string

Jika yang ingin dimunculkan adalah pesan yang membutuhkan banyak formatting, kalian bisa menggunakan syntax printf(). Syntax tersebut dapat melakukan formatting pesan agar dapat menerima variabel selain string.

Note: Gunakan \n pada akhir string di printf() agar program memasukkan “Enter”.

x = input("Masukkan angka: "); printf("Anda memasukkan angka %d\n", x)
Masukkan angka:  25Anda memasukkan angka 25

Pada contoh di atas, kita ingin agar variabel x dapat di-output bersama dengan pesan string. Kita menggunakan %d agar nilai x dapat di-print sebagai bilangan desimal. Jika variabelnya berisi string, maka gunakan %s. Jika variabelnya berisi float, gunakan %f untuk print dalam bentuk desimal, atau %.nf untuk sekaligus mengatur angka di belakang koma sebanyak n.

printf("pi = %f\n", pi)
pi = 3.141593
printf("pi = %.12f\n", pi)
pi = 3.141592653590

Jika float tersebut ingin di-print dalam notasi saintifik, gunakan %e atau %E. Keduanya hanya berbeda di hasil output yang berupa E (besar) ataupun e (kecil).

printf("euler = %e\n", e)
euler = 2.718282e+00
printf("euler = %E\n", e)
euler = 2.718282E+00

Jika ingin print karakter persen itu sendiri (%), gunakan %%.

Jika ada lebih dari satu formatting di satu printf(), maka variabelnya juga harus dimasukkan secara berurutan.

nama = input("Masukkan nama: ", "s");
Masukkan nama:  Burden
minuman_fav = input("Minuman favorit: ", "s");
Minuman favorit:  Kopi
harga = input(["Harga " minuman_fav ": "]);
Harga Kopi:  25000
printf("%s suka %s seharga Rp%d", nama, minuman_fav, harga);
Burden suka Kopi seharga Rp25000

Struktur Bersyarat: If-Else-Elseif, Switch-Case

Seperti halnya bahas pemrograman, Octave pun juga memiliki conditional statements (pernyataan kondisional, pernyataan bersyarat, atau struktur bersyarat). Secara umum, conditional statement pada Octave berbentuk:

cond
  body
endcond

Pada potongan kode di atas, cond adalah jenis conditional statement yagn digunakan, bisa berupa if, for, dan lainnya, body berisi kode yang dijalankan ketika cond terpenuhi, dan endcond adalah bagian penutup dari conditional statement, bisa berupa endif, endfor, dan lainnya tergantung cond apa yang digunakan.

Operasi dasar yang digunakan pada conditional statements adalah operasi perbandingan, dimana pada dasarnya, dua atau lebih nilai dibandingkan dengan operator dan dicek apakah memenuhi atau tidak. Jika memenuhi, maka nilainya 1, dan jika tidak, maka nilainya 0. Ada 6 operator dasar untuk perbandingan:

  • sama dengan (==)
  • lebih dari (>)
  • kurang dari (<)
  • lebih dari atau sama dengan (>=)
  • kurang dari atau sama dengan (<=)
  • tidak sama dengan (!= atau ~=)
2 < 3
ans = 1
4 == 5
ans = 0

Selain operator di atas, ada juga syntax untuk perbandingan:

  • isequal(a, b, c, …)

    mengecek apakah a, b, dan c semuanya sama.

  • strcmp(s1, s2)

    mengecek apakah s1 dan s2 adalah string yang sama.

  • strncmp(s1, s2, n)

    mengecek apakah n karakter pertama pada s1 dan s2 sama.

  • strcmpi(s1, s2)

    mirip strcmp(), namun tidak case-sensitive.

  • strncmpi(s1, s2, n)

    mirip strncmp(), namun tidak case-sensitive.

isequal(1, 3, 5)
ans = 0
strcmp("ayam", "Ayam")
ans = 0
strcmpi("ayam", "Ayam")
ans = 1
strncmp("sayamakan", "saya makan", 4)
ans = 1

Berikut beberapa jenis conditional statement pada Octave. Kode-kode ini akan ditulis di editor dan output akan dipisahkan oleh >>

If, Elseif, Else

If adalah conditional statement dasar dalam decision-making melalui perbandingan nilai. If memiliki 3 bentuk. Bentuk pertama:

if (cond)
  body
endif

Bentuk ini adalah bentuk paling simpel dalam menggunakan if. Jika cond bernilai 1, maka body dieksekusi, dan sebaliknya. Contoh:

x = input("Masukkan nilai x: ");
if (x > 0)
  printf("%d adalah bilangan positif\n", x);
endif
Masukkan nilai x:  2525 adalah bilangan positif

Seringkali if dipasangkan dengan else. Untuk itu, cukup menyelipkan bagian else layaknya if, sehingga menjadi:

if (cond)
  body1;
else
  body2;
endif

Contoh:

x = input("Masukkan x: ");
if mod(x, 2) == 0
  printf("x genap\n");
else
  printf("x ganjil\n");
endif
Masukkan x:  5x ganjil

Kita pun juga dapat membuat lebih dari 2 condition selain if dan else. Cukup tambahkan bagian elseif. Kita dapat menambahkan berapapun banyaknya elseif sesuka hati, selama bagian akhirnya adalah else.

if (cond1)
  body1;
elseif (cond2)
  body2;
else
  body3;
endif

Switch-Case

Untuk beberapa kasus, sudah jelas jika kita menggunakan model kode seperti di atas. Namun, terkadang kita ingin membuat program berjalan sesuai input, dan jika menggunakan if-else, kodenya akan terlihat jelek. Maka, kita juga bisa menggantinya dengan kode switch. Bentuk umum dari switch adalah:

switch (var)
  case nilai1
    body1;
  case nilai2
    body2;
  otherwise
    body3;
endswitch

Pada kode di atas, var akan dicocokkan dengan nilai1, nilai2, dst. yang sesuai. Jika tidak ada yang sesuai, kode akan masuk ke bagian otherwise. Layaknya elseif, kita juga dapat menambahkan berapapun banyaknya case sesuka hati, selama terdapat paling tidak satu case (bahkan bagian otherwise opsional).

Contoh:

pilihan = input("Masukkan pilihan warna (1-4): ");
switch (pilihan)
  case 1
    printf("Warna merah")
  case 2
    printf("Warna hijau")
  case 3
    printf("Warna biru")
  case 4
    printf("Warna kuning")
  otherwise
    printf("Input tidak valid")
endswitch
Masukkan pilihan warna (1-4):  4Warna kuning

Jika case berisi array, kode akan masuk case tersebut jika var sesuai dengan salah satu elemen di array tersebut.

Struktur Berulang: For, While-Do, Do-Until

For Loop

Bentuk umum dari for adalah:

for var = expr
  body;
endfor

Biasanya isi dari expr adalah a:b, yang menyebabkan var diiterasi dari a hingga b. Secara umum, for akan meng-assign tiap kolom pada expr ke var (bentuk range a:b secara umum adalah vektor baris, sehingga iterasi kolom pada a:b adalah dari a hingga b). Contoh:

fib = ones(1, 10); % matriks 1x10 berisi nilai 1 semua
for i = 3:10
  fib(i) = fib(i-1) + fib(i-2);
endfor
disp(fib)
    1    1    2    3    5    8   13   21   34   55

Karena iterasinya antar kolom, maka jika expr adalah suatu matriks, maka var akan diiterasi sebagai vektor kolom.

for i = [1, 2, 3; 4, 5, 6; 7, 8, 9]
  disp(i)
endfor
   1
   4
   7
   2
   5
   8
   3
   6
   9

While Loop

Bentuk umum dari while adalah:

while (cond)
  body;
endwhile

Serupa dengan if, while akan menjalankan body jika cond bernilai taknol. Namun, akan diulang terus hingga cond bernilai nol, baru berhenti.

Contoh:

fib = ones(1, 10);
i = 3;
while (i <= 10)
  fib(i) = fib(i-1) + fib(i-2);
  i++;
endwhile
disp(fib)
    1    1    2    3    5    8   13   21   34   55

Pada contoh di atas, penting untuk memasukkan bagian i++ agar suatu saat nilai i akan lebih dari 10. Hati-hati menggunakan while, karena dapat mengakibatkan infinite loop.

Do-Until

Bentuk umum dari do-until adalah:

do
  body
until (cond)

Sekilas, do terlihat serupa dengan while. Yang membedakannya adalah do akan terus menjalankan body ketika cond bernilai 0 dan berhenti ketika cond bernilai taknol. Kondisi cond pada do juga berada di akhir, sehingga body pasti akan dijalankan paling tidak sekali. Perbedaan kecil selanjutnya adalah do tidak memakai enddo seperti layaknya endif, endwhile, dan sejenisnya.

Contoh:

fib = ones(1, 10);
i = 2;
do
  i++;
  fib(i) = fib(i-1) + fib(i-2);
until (i == 10)
disp(fib)
    1    1    2    3    5    8   13   21   34   55

Break, Continue

break dan continue adalah dua statement yang digunakan dan hanya digunakan dalam loop. Statement break akan langsung mengeluarkan program dari loop, sedangkan continue akan langsung menuju iterasi selanjutnya tanpa menyelesaikan sisa kode pada badan loop.

Contoh perbedaan break dan continue:

a = [];
for i = 1:10
  if mod(i, 5) == 0
    break;
  endif
  a = [a, i];
endfor
disp(a)
   1   2   3   4
a = [];
for i = 1:10
  if mod(i, 5) == 0
    continue;
  endif
  a = [a, i];
endfor
disp(a)
   1   2   3   4   6   7   8   9

Function File dan Script File

Sebelum kita lanjutkan, kita harus terlebih dahulu mengetahui tentang function file dan script file.

Function file adalah file yang dapat digunakan oleh Octave untuk memanggil fungsi yang telah didefinisikan di dalamnya. Function file ini berguna jika kalian ingin menggunakan fungsi tersebut secara berkala.

Script file adalah file yang berisi kumpulan perintah Octave, layaknya script pemrograman. Script file berguna untuk pemrograman dan menjalankan/menyimpan suatu urutan perintah, sehingga bisa dijalankan kembali nantinya. Untuk selanjutnya, script file akan disebut “program”.

Permasalahannya, kedua jenis file tersebut mempunyai ekstensi yang serupa (.m), namun function file tidak dapat dijalankan layaknya program.

Misal kita mempunyai fungsi yang ingin disimpan dalam program bernama testfile.m (untuk sekarang kita akan abaikan dulu maksud dari tiap bagian dari fungsi ini. Intinya fungsi ini akan menampilkan variabel message yang kita masukkan.

function test(message)
  printf("%s\n", message);
endfunction

test("PDNum");
PDNum

Jika program tersebut dijalankan, akan muncul pesan peringatan…

warning: function name 'test' does not agree with function filename...

…dan mungkin saja akan diikuti error lain. Jika kalian ingin membuat program, jangan gunakan function di line pertama yang dieksekusi.

Sekarang kita modifikasi testfile.m di atas.

1;
function test(message)
  printf("%s\n", message);
endfunction

test("PDNum");
PDNum

Di sini, kita menambahkan line yang tidak berpengaruh apa-apa dalam program kita sebelum line pendefinisian fungsi. Untuk membedakan function file dengan program, Octave mengecek perintah pertama yang dieksekusi. Jika perintah tersebut adalah pendefinisian fungsi, maka file tersebut akan dianggap sebagai function file, dan jika bukan, maka file tersebut akan dianggap sebagai program.

Sekarang kita masuk ke fungsi, pendefinisian, dan embel-embelnya. Fungsi adalah suatu bagian dari program yang nantinya akan dipanggil. Fungsi sangat berguna jika bagian program tersebut nantinya akan digunakan berkali-kali. Fungsi juga berguna agar pengorganisasian kode program lebih bagus. Syntax untuk pendefinisian fungsi adalah:

function name
  body
endfunction

Potongan kode di atas akan membuat fungsi name dengan body adalah isi dari fungsi tersebut. Untuk memanggil fungsi tersebut, cukup dengan memanggil name. Contoh:

function bangun
  printf("BANGUN!!!\n");
endfunction

bangun;
BANGUN!!!

Kalian juga bisa menambahkan argumen (biasanya berupa variabel), ke fungsinya.

function bangun(message)
  printf("%s\n", message);
endfunction

bangun("BANGUN WOY!!!");
BANGUN WOY!!!

Pada kedua contoh di atas, fungsinya tidak benar-benar memberikan suatu value, melainkan hanya sekedar output. Dalam kebanyakan kasus, kita menggunakan fungsi agar bisa mendapatkan suatu nilai yang dapat di-assign ke suatu variabel. Agar kita bisa mendapatkan value, maka kita harus meng-assign variabel untuk return. Strukturnya menjadi:

function retval = name (args)
  body
endfunction

retval adalah variabel lokal (namanya tidak harus retval) yang akan digunakan sebagai return value sehingga dapat di-assign. retval bisa berupa variabel, jika kita ingin me-return satu value, ataupun bisa berupa list dari variabel jika ingin me-return lebih dari satu value.

Contoh return satu nilai:

function x = kuadratkan(a)
  x = a^2;
endfunction

y = kuadratkan(5);
disp(y);
25

Contoh return lebih dari satu nilai:

function [y1, y2] = jumlah_kali(x1, x2)
  y1 = x1 + x2;
  y2 = x1 * x2;
endfunction

[z1, z2] = jumlah_kali(5, 7);
disp(z1);
disp(z2);
12
35

Tambahan: mencari nilai di array

Misalkan kita punya array

x_arr = [9, 8, 7, 6]
x_arr =

   9   8   7   6

Apabila kita menerapkan kondisional tertentu pada array, kondisionalnya akan diterapkan per elemen. Misalnya, kita bisa memeriksa, elemen mana saja yang lebih besar dari 7.5

x_arr > 7.5
ans =

  1  1  0  0

Nilai 9 dan 8 memenuhi, sehingga menjadi 1 (artinya true/benar). Sedangkan, nilai 7 dan 6 tidak memenuhi, sehingga menjadi 0 (artinya false/salah).

Ada fungsi find yang menerima suatu array/matriks dan memberikan output berupa indeks-indeks yang nilainya taknol.

find([1, 1, 0, 0])
ans =

   1   2

Kalau digunakan seperti ini, mungkin kelihatannya agak aneh. Namun, kita bisa gabungkan dengan penggunaan kondisional…

find(x_arr > 7.5)
ans =

   1   2

Sehingga fungsi find seolah-olah mencari, indeks mana saja yang memenuhi kondisional.

Contoh lain, kondisional kesamaan:

x_arr == 7
ans =

  0  0  1  0

Hanya nilai 7 (yaitu di posisi ketiga) yang menjadi true, karena memang hanya itu yang sama dengan 7.

Apabila kita gunakan bersama fungsi find, maka sama saja seperti melakukan linear search

find(x_arr == 7)
ans = 3

Yaitu, nilai 7 di array berada pada indeks 3

x_arr(3)
ans = 7

Apabila kita coba cari sesuatu yang tidak ada (misalnya nilai 5), hasilnya kosong:

find(x_arr == 5)
ans = [](1x0)