Algoritma iteratif

Nafisa Berliana Indah Pratiwi G1501211044

Soal 1

Susunlah sintaks R untuk penjumlahan deret berikut!
\[z=1+1+1/2+1/3+1/5+1/8+...\]
Jawab :
deret tersebut merupakan deret Reciprocal Fibonacci Constant, sehingga rumus dari deret tersebut adalah
\[z_{n}=\frac{1}{\frac{\phi^n-(1-\phi^n)}{\sqrt5}}\]
dengan \(\phi\) merupakan golden ratio yaitu \[\phi=\frac{1+\sqrt5}{2} = 1.618034...\]

  • menuliskan fungsi dalam bentuk function
fa <- function(n){
  1/(((1.618034)^n - (1-1.618034)^n)/sqrt(5))
  
}
  • mendefinisikan kriteria stopping
stopping_criteria <- function(y_current,y_before){
  abs(y_current-y_before)
}
  • menentukan nilai awal untuk kriteria Stopping
#nilai awal kriteria stopping
error <- 10
#nilai awal deret
z0 <- 0
# nilai awal iterasi
n <- 1
  • menuliskan iterasi untuk jumlah deret
while (error>0.00001) {
  z <- z0 + fa(n)
  error <- stopping_criteria(z,z0)
  z0 <- z
  n <- n+1
}
  • jumlahan deret
z
## [1] 3.359872
  • kriteria Stopping
error
## [1] 8.237706e-06

Soal 1 alternatif

untuk mencari jumlahan deret Reciprocal Fibonacci Constant dapat juga digunakan fungsi sebagai berikut

fib <- function(n) {
  fibonacci = c()
  Un = c()
  fibonacci[1]=1
  fibonacci[2]=1
  Un[1]=1
  Un[2]=1
  if (n<3) {
    return(Un[n])
  }
  else {
    for (i in 3:n) {
      fibonacci[i]=fibonacci[i-1]+fibonacci[i-2]
      Un[i]=1/fibonacci[i]
    }
    return(Un[i])
  }
}
  • kriteria Stopping
stopping_criteria <- function(y_current,y_before){
  abs(y_current-y_before)
}
  • menentukan nilai awal
galat <- 10
#nilai awal deret 
z0 <- 0
#nilai awal iterasi
n <- 1
  • iterasi untuk jumlah deret
while (galat>0.00001) {
  z1 <- z0 + fib(n)
  galat <- stopping_criteria(z1,z0)
  z0 <- z1
  n <- n+1
}
  • jumlahan deret
z1
## [1] 3.359872
  • kriteria stopping
error
## [1] 8.237706e-06

Soal 2

Susunlah sintaks R untuk penjumlahan deret berikut!
\[Z=10-2+0.4-0.08+...\]
Jawab:
deret tersebut merupakan deret geometri dengan suku pertama \(a=10\) dan rasionya \(r=-\frac{1}{5}\), rumus untuk deret geometri tersebut yaitu

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

  • menuliskan rumus kedalam bentuk fungsi
fb<-function(n){
  (10) * ((-1/5)^(n))
}
  • kriteria stopping
stopping_criteria <- function(y_current,y_before){
  abs(y_current-y_before)
}
  • menentukan nilai awal
#nilai awal krtieria stopping
error <- 10
#nilai awal deret 
z0 <- 0
#nilai awal iterasi
n <- 0
  • iterasi untuk jumlahan deret
#iterasi untuk mencari jumlah deret
while (error>0.00001) {
  z <- z0 + fb(n)
  error <- stopping_criteria(z,z0)
  z0 <- z
  n <- n+1
}
  • hasil jumlahan deret
z
## [1] 8.333332
  • kriteria stopping
error
## [1] 5.12e-06

Soal 2 alternatif

untuk mencari jumlahan deret geometri \(Z\) dapat juga menggunakan fungsi berikut

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

fc<-function(n){
  (10) * ((-1/5)^(n-1))
}
#kriteria stopping  
stopping_criteria <- function(y_current,y_before){
  abs(y_current-y_before)
}

#nilai awal krtieria stopping
error <- 10
#nilai awal deret 
z0 <- 0
#nilai awal iterasi
n <- 1

#iterasi untuk mencari jumlah deret
while (error>0.00001) {
  z <- z0 + fc(n)
  error <- stopping_criteria(z,z0)
  z0 <- z
  n <- n+1
}
  • hasil jumlahan deret
z
## [1] 8.333332
  • kriteria Stopping
error
## [1] 5.12e-06

Soal 3

Buat lah 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]\]

Jawab :

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 kecil 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 berikut merupakan fungsi yang memiliki input x dan outputnya merupakan vektor yang sudah terurut
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)
}

#mencoba menerapkan fungsi urutan
fungsi_urutan(x)
## [1] 102 101  45  21  13   9   7   6
  • membandingkan dengan fungsi bawaan descending
sort(x,TRUE)
## [1] 102 101  45  21  13   9   7   6
  • menggunakan library microbenchmark untuk membandingkan kecepatan running user-defined-function antara fungsi_urutan dan fungsi bawaan (sort).
library("microbenchmark")

microbenchmark::microbenchmark(sort(x,TRUE),fungsi_urutan(x))
## Unit: microseconds
##              expr  min    lq   mean median   uq   max neval
##     sort(x, TRUE) 30.8 32.35 40.982   35.3 37.5 189.6   100
##  fungsi_urutan(x)  6.1  7.10  8.646    7.8  8.5  30.4   100