Algoritma Iteratif

SOAL 1

Susunlah sintaks R untuk penjumlahan deret berikut:

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

Jawab:

Pola Deret

\[Z=1+1+\frac{1}{2}+\frac{1}{3}+\frac{1}{5}+\frac{1}{8}+...\]

Pola penyebut dari deret tersebut menyerupai pola bilangan fibonacci:

\(1,1,2,3,5,8,...\)

Sehingga, deret dapat dituliskan sebagai berikut:

\[Z=\frac{1}{1}+\frac{1}{1}+\frac{1}{2}+\frac{1}{3}+\frac{1}{5}+\frac{1}{8}+...\]

Rumus untuk penyebut deret di atas yaitu:

\[Zn=\frac{1}{\sqrt{5}}\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1+\sqrt{5}}{2}\right)^n\]

Jadi, rumus deret di atas yaitu:

\[Z=\sum_{n=1}^{\infty}{\frac{1}{Zn}}\]

Sintaks

  1. Menuliskan rumus dalam bentuk function
fz<-function(n){
  1/((1/sqrt(5))*((((1+sqrt(5))/2)^n)-(((1-sqrt(5))/2)^n)))
}
  1. Mendefinisikan kriteria stopping
stop.kriteria<-function(ycurrent, ybefore){
  abs(ycurrent-ybefore)
}
  1. Mendefinisikan nilai-nilai awal
bataserror<-10 #nilai awal kriteria stopping
nilaiawal<-0 #nilai awal deret
n<-1 #nilai awal iterasi
  1. Menuliskan iterasi untuk mencari jumlah deret
while(bataserror>0.000001) {
  nilaiZ<-nilaiawal+fz(n)
  bataserror<-stop.kriteria(nilaiZ,nilaiawal)
  nilaiawal<-nilaiZ
  n<-n+1
}
  1. Jumlah Deret dan Error
nilaiZ #jumlah deret
## [1] 3.359884
bataserror #nilai error
## [1] 7.427936e-07

SOAL 2

Susunlah sintaks R untuk penjumlahan deret berikut:

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

Jawab:

Pola Deret

Deret \(Z=10-2+0.4-0.08+...\) merupakan deret Geometri dengan nilai rasio \(r=-\frac{1}{5}\) dan suku pertamanya adalah \(Z_{1}=10\). Sehingga rumusnya dapat dituliskan sebagai berikut:

\[Z_{n}=10\times \left(-\frac{1}{5} \right)^{n-1}\]

Sintaks

  1. Menuliskan rumus dalam bentuk function
fz2<-function(n){
  (10) * ((-1/5)^(n-1))
}
  1. Mendefinisikan kriteria stopping
stop.kriteria<-function(ycurrent, ybefore){
  abs(ycurrent-ybefore)
}
  1. Mendefinisikan nilai-nilai awal
bataserror<-10 #nilai awal kriteria stopping
nilaiawal<-0 #nilai awal deret
n<-1 #nilai awal iterasi
  1. Menuliskan iterasi untuk mencari jumlah deret
while(bataserror>0.000001) {
  nilaiZ2<-nilaiawal+fz2(n)
  bataserror<-stop.kriteria(nilaiZ2,nilaiawal)
  nilaiawal<-nilaiZ2
  n<-n+1
}
  1. Jumlah Deret dan Error
nilaiZ2 #jumlah deret
## [1] 8.333333
bataserror #nilai error
## [1] 2.048e-07

SOAL 3

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

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

Jawab:

Program untuk mengurutkan

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

#mendefinisikan objek baru yang akan digunakan untuk menampilkan hasil sortir
x_sort <- x

#jumlah amatan 
n_x <- length(x)

#iterasi tingkat 1
for(i in 1:(n_x-1)){
  #iterasi tingkat 2
  for(j in 1:(n_x-i)) {
    # Pemeriksaan kondisi apakah elemen ke-j+1 lebih besar dari elemen ke-j
    if(x_sort[j+1] > x_sort[j]) {
      # jika terpenuhi
      #Buat tempat sementara untuk menyimpan elemen ke-j yang akan ditukar
      tmp <- x_sort[j]
      # Ganti nilai elemen ke-j dengan nilai yang ada pada elemen ke j+1
      x_sort[j] <- x_sort[j+ 1]
      # Ganti nilai elemen j+1 dengan nilai yang ada dalam objek temp
      x_sort[j+1] <- tmp
    }
  }
  }

x_sort
## [1] 102 101  45  21  13   9   7   6

Fungsi untuk mengurutkan

fungsi_urutan <- function(x){
n_x <- length(x)

for(i in 1:(n_x-1)){
  for(j in 1:(n_x-i)) {
    if(x[j+1] > x[j]) {
      tmp <- x[j]
      x[j] <- x[j+1]
      x[j+1] <- tmp
    }
  }
  }
  return(x)
}

#menerapkan fungsi urutan
fungsi_urutan(x)
## [1] 102 101  45  21  13   9   7   6

Perbandingan dengan fungsi sort

#hasil urutan X dengan menggunakan fungsi sort di R
hasil_sortX<-sort(x, decreasing = TRUE)
hasil_fungsiurutan<-fungsi_urutan(x)
hasilurutan<-rbind(hasil_sortX, hasil_fungsiurutan)
hasilurutan
##                    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## hasil_sortX         102  101   45   21   13    9    7    6
## hasil_fungsiurutan  102  101   45   21   13    9    7    6

Berdasarkan hasil perbandingan di atas dapat dilihat bahwa fungsi urutan yang dibuat (user-defined-function) memberikan hasil yang sama dengan fungsi sort di R.

Perbandingan kecepatan running

Berikut merupakan perbandingan kecepatan running user-defined-function dan fungsi sort dengan menggunakan package microbenchmark.

microbenchmark::microbenchmark(sort(x),fungsi_urutan(x))
## Unit: microseconds
##              expr    min      lq     mean  median       uq     max neval
##           sort(x) 57.502 99.1515 110.3291 107.501 112.7010 312.101   100
##  fungsi_urutan(x)  8.901 25.0505  29.1779  30.301  34.0505  67.401   100

Berdasarkan nilai median dan mean, terlihat bahwa fungsi urutan yang dibuat (user-defined-function) memiliki kecepatan running lebih cepat dibandingkan dengan fungsi sort di R.