Algoritma Iteratif

Tugas Praktikum 8 STA561 Pemrograman Statistika

Nur Andi Setiabudi1

2021-10-25

Soal 1: Penjumlahan Deret

Susunlah sintaks R untuk penjumlahan deret berikut!

\(Z = 1 + 1 + \frac{1}{2} + \frac{1}{3} + \frac{1}{5} + \frac{1}{8} + ...\)

Untuk menjumlahkan deret takhingga (\(\infty\)), kita terlebih dahulu harus menemukenali pola dari deret tersebut. Untuk mendapatkan \(Z\) di atas, pola deret dapat diuraikan sebagai berikut:

\[ \begin{aligned} Z &= 1 + 1 + \frac{1}{2} + \frac{1}{3} + \frac{1}{5} + \frac{1}{8} + ... \\ &= \frac{1}{1} + \frac{1}{1} + \frac{1}{1+1} + \frac{1}{1+2} + \frac{1}{2+3} + \frac{1}{3+5} + ... \end{aligned} \] Terlihat bahwa deret tersebut membentuk pola \(\frac{1}{x_1} + \frac{1}{x_2} + \frac{1}{x_1 + x_2} + \frac{1}{x_2 + x_3} + \frac{1}{x_3 + x_4} + \frac{1}{x_4 + x_5} + ...\).

Dengan kata lain, kita membutuhkan dua nilai awal (initial values) \(x_1\) dan \(x_2\), sedangkan untuk elemen ketiga dan seterusnya, merupakan penjumlahan dari dua elemen sebelumnya. Atau dapat ditulis dalam notasi sigma sebagai berikut :

\[ Z = \frac{1}{x_1} + \frac{1}{x_2} + \sum_{i=3}^{\infty} \left(\frac{1}{x_{i-2} + x_{i-1}}\right) \]

Algoritma

  1. Mulai
  2. Tentukan dua nilai awal, misalnya \(x_1 = 1\) dan \(x_2 = 1\)
  3. Tentukan batas toleransi
  4. Hitung \(Z = \frac{1}{x_1} + \frac{1}{x_2}\)
  5. Hitung elemen berikutnya, \(x_i\) dengan menjumlahkan dua elemen sebelumnya, \(x_{i-2} + x_{i-1}\),
  6. Hitung \(Z= Z + \frac{1}{x_i}\)
  7. Periksa apakah elemen deret masih dalam batas toleransi
  8. Ulangi langkah 5, 6 dan 7 hingga batas toleransi tidak lagi terpenuhi
  9. Print nilai \(Z\)
  10. Selesai

Sintaks R

series.sum1 <- function(init.values = c(1,1), tolerance = 1e-6 ){
  
  series.sum <- sum(1/init.values)
  
  end.loop <- FALSE
  while(!end.loop){
    new.value <- sum(init.values) 
    new.value.inv <- 1/new.value
    series.sum <- series.sum + new.value.inv
  
    init.values <- c(init.values, new.value)[-1]

    # periksa kriteria stoping
    if(new.value.inv < tolerance){ end.loop <- TRUE }
    
    }
  
  return(series.sum)
  
}

Aplikasi

Z <- series.sum1()
Z
## [1] 3.359884

Soal 2: Penjumlahan Deret

Susunlah sintaks R untuk penjumlahan deret berikut!

\(Z = 10 - 2 + 0.4 - 0.08 + ...\)

Deret tersebut membentuk pola

\[ Z = 10\left(-\frac{1}{5} \right)^0 + 10 \left(-\frac{1}{5} \right)^1 + 10 \left(-\frac{1}{5} \right)^2 + 10 \left(-\frac{1}{5} \right)^3 + ... \] Dan dapat ditulis dalam notasi sigma sebagai berikut

\[ Z = \sum_{i=0}^{\infty} 10 \times \left(-\frac{1}{5} \right)^i \]

Algoritma

  1. Mulai
  2. Tentukan batas toleransi
  3. Tentukan awalan \(Z=0\)
  4. Untuk \(i=0\), hitung \(Z = Z + [10 \times (-\frac{1}{5})^0 ]\)
  5. Ulangi langkah ke-4 untuk \(i = i+1\) hingga batas toleransi tidak lagi terpenuhi
  6. Print nilai \(Z\)
  7. Selesai

Sintaks R

series.sum2 <- function(i=0, tolerance = 1e-6){
  
  series.sum <- 0
  
  end.loop <- FALSE
  while(!end.loop){
    new.value <- (10)*(-1/5)^i
    series.sum <- series.sum + new.value
  
  i <- i+1
  
  if(abs(new.value) < tolerance){ end.loop <- TRUE }
  
  }
  
  return(series.sum)
  
}

Aplikasi

Z <- series.sum2()
Z
## [1] 8.333333

Soal 3: Mengurutkan Bilangan

Buatlah fungsi untuk mengurutkan vektor Berikut dari besar ke kecil. Bandingkan hasilnya dengan mengguakan fungsi sort yang ada di R.

\(X=[13, 7, 6, 45, 21, 9, 101, 102]\)

Ada banyak algoritma yang dapat digunakan untuk mengurutkan bilangan (Wikipedia), antara lain:

  • Quick sort,
  • Selection sort,
  • Bubble sort,
  • Insertion sort,
  • Merge sort, dan lain-lain

Untuk tugas ini, akan dicoba dua algoritma yaitu bubble sort dan insertion sort.

Bubble sort

Algoritma

  1. Mulai
  2. Baca vector
  3. Bandingkan setiap pasang elemen yang berdekatan, misalkan elemen ke-1 dan ke-2. Jika ascending dan nilai ke-1 lebih besar dari nilai ke-2 atau jika descending dan nilai ke-2 lebih besar dari nilai ke-1, mak tukar posisi kedua elemen tersebut
  4. Ulangi langkah ke-3 sampai semua elemen terurut sesuai pola yang diinginkan.
  5. Kembalikan/print vector yang sudah terurut
  6. Selesai

Sintaks R

bubble.sort <- function(vec, mode = "asc"){
  
  n <- length(vec)
  for(i in 1:(n-1)) {
    for(j in (i+1):n) {
      
      if((mode == "asc"  && vec[i] > vec[j]) || 
         (mode == "desc" && vec[i] < vec[j])) {
        
        t <- vec[i]
        vec[i] <- vec[j]
        vec[j] <- t
      }
      
    }
  }
  
  return(vec)
}

Aplikasi

x <- c(13, 7, 6, 45, 21, 9, 101, 102)

# ascending
bubble.sort(x)
## [1]   6   7   9  13  21  45 101 102
# descending
bubble.sort(x, "desc")
## [1] 102 101  45  21  13   9   7   6

Insertion sort

Algoritma

Untuk urutan ascending

  1. Mulai
  2. Iterasi vector, dari elemen ke-2 hingga elemen ke-n (elemen terakhir)
  3. Untuk setiap iterasi, jika elemen yang tengah diiterasi lebih kecil daripada elemen sebelumnya, bandingkan elemen tersebut dengan elemen-elemen sebelumnya
  4. Tukar posisi elemen yang tengah diiterasi dengan elemen-elemen sebelumnya (yang nilai-nilainya lebih besar)
  5. Kembalikan/print vector yang sudah terurut
  6. Selesai

Untuk urutan descending, lakukan sebaliknya di langkah ke-3.

Sintaks R

insertion.sort <- function(vec, mode = "asc"){
  
  n <- length(vec)
  for(i in 2:n){
    
    temp <- vec[i]
    j <- i-1

    while((mode == "asc"  && vec[j] > temp && j > 0) || 
          (mode == "desc" && vec[j] < temp && j > 0)) {
      
      vec[j+1] <- vec[j]
      j <- j-1
      vec[j+1] <- temp
    }
    
  }
  return(vec)
  
}

Aplikasi

# ascending
insertion.sort(x)
## [1]   6   7   9  13  21  45 101 102
# descending
insertion.sort(x, "desc")
## [1] 102 101  45  21  13   9   7   6

Fungsi sort()

Perbandingan dengan fungsi sort():

# ascending
sort(x)
## [1]   6   7   9  13  21  45 101 102
# descending
sort(x, TRUE)
## [1] 102 101  45  21  13   9   7   6

Terlihat bahwa sintaks pengurutan bilangan dengan algoritma bubble sort dan juga insertion sort, baik untuk urutan secara ascending maupun descending, sudah sesuai dengan hasil dari fungsi sort() yang merupakan fungsi bawaan R.


  1. Penulis adalah mahasiswa Pascasarjana Statistika dan Sains Data, Institut Pertanian Bogor, NIM: G1501211061, ↩︎