Algoritma Iteratif
Soal
Susunlah sintaks R untuk penjumlahan deret berikut! \[\begin{equation} z=1+1+\frac{1}{2}+\frac{1}{3}+\frac{1}{5}+\frac{1}{8}+ \cdots \end{equation}\]
Susunlah sintaks R untuk penjumlahan deret berikut! \[\small{Z = 10 - 2 + 0.4 - 0.08 + \cdots}\]
Buatlah fungsi untuk mengurutkan vektor berikut. Bandingkan hasilnya dengan menggunakan fungsi sort yang ada di R. \[x = [13,7,6,45,21,9,101,102]\]
Jawaban Soal 1
Penjumlahan Deret \[\begin{equation} z=\frac{1}{1}+\frac{1}{1}+\frac{1}{2}+\frac{1}{3}+\frac{1}{5}+\frac{1}{8}+ \cdots \end{equation}\]
Perhatikan bahwa penyebut dari deret ini membentuk barisan fibonacci. Agar memudahkan, perlu dibuat sebuah fungsi yang menghasilkan nilai untuk tiap suku barisan fibonacci.
Fungsi untuk menghasilkan suku ke-i barisan bilangan fibonacci.
# Bottom Up Method
fibonacci = function(n){
fib <- numeric(n)
for (i in 1:n){
if (i<=2){
fib[i] <- 1
} else{
fib[i] <- fib[i-1] + fib[i-2]
}
}
#return(fib)
return(fib[i])
}
#Contoh 10 suku pertama barisan fibonacci
sapply(1:10,fibonacci)## [1] 1 1 2 3 5 8 13 21 34 55
Rumus untuk soal 1
Rumus dari deret pada soal dapat dituliskan sebagai \[z = \sum_{n=1}^{\infty} \frac{1}{fibonacci(n)}\]
#Rumus fungsi
z <- function(n){
1/fibonacci(n)
}
#nilai awal
e <- 10
z0 <- 0
n <- 1
#Mencari jumlah deret
while (e > 10^(-7)) {
z1 <- z0 + z(n)
e <- abs(z1-z0)
z0 <- z1
n <- n+1
}
cbind.data.frame(Hasil=z1,Selisih=e)## Hasil Selisih
## 1 3.359886 6.697766e-08
Nilai pendekatan untuk deret ini adalah 3.359886 dimana suku terakhir yang dijumlahkan pada deret ini mengakibatkan perubahan nilai sebesar 6.697766 x \(10^{-8}\). Perubahan yang cukup kecil. Artinya, jika penjumlahan pada deret ini dilanjutkan ke suku berikutnya, akan mengakibatkan perubahan kecil terhadap nilai yang didapatkan ini.
Jawaban Soal 2
Penjumlahan Deret
Perhatikan bahwa \[\small{Z = 10 - 2 + 0.4 - 0.08 + \cdots}\] dapat dituliskan menjadi \[\small{Z = \frac{10}{5^0} - \frac{10}{5^1} + \frac{10}{5^2} - \frac{10}{5^3} + \cdots}\]
Rumus untuk soal 2
\[z = \sum_{n=0}^{\infty} (-1)^{n} \frac{10}{5^{n}}\]
#Rumus fungsi
z <- function(n){
(-1)^(n) * (10/(5^n))
}
#Nilai awal
e <- 10
z0 <- 0
n <- 0
#Mencari jumlah deret
while (e > 10^(-7)) {
z1 <- z0 + z(n)
e <- abs(z1-z0)
z0 <- z1
n <- n+1
}
cbind.data.frame(Hasil=z1,Selisih=e)## Hasil Selisih
## 1 8.333333 4.096e-08
Nilai pendekatan untuk deret ini adalah 8.333333 dimana suku terakhir yang dijumlahkan pada deret ini mengakibatkan perubahan nilai sebesar 4.096 x \(10^{-8}\). Perubahan yang cukup kecil. Artinya, jika penjumlahan pada deret ini dilanjutkan ke suku berikutnya, akan mengakibatkan perubahan kecil terhadap nilai yang didapatkan ini.
Jawaban Soal 3
Mengurutkan vektor
Vektor
(x <- c(13,7,6,45,21,9,101,102))## [1] 13 7 6 45 21 9 101 102
Fungsi untuk mengurutkan vektor kecil ke besar.
Alur dari algoritma berikut adalah mengumpulkan bilangan yang paling besar ke bagian belakang dalam setiap kali iterasi.
sort_asc <- function(v){
n <- length(v)
for (i in 1:(n-1)){ # iterasi luar: Lihat iterasi dalam dulu!
for (j in 1:(n-i)){ # iterasi dalam: membawa bilangan paling besar ke belakang.
if (v[j]>v[j+1]){ # Jika bil. pertama lebih besar daripada yg kedua, tukarkan!
tmp <- v[j]
v[j] <- v[j+1]
v[j+1] <- tmp
}
}
}
return(v)
}Perbandingan
sort_asc(x) # buatan## [1] 6 7 9 13 21 45 101 102
sort(x) # bawaan R## [1] 6 7 9 13 21 45 101 102
Fungsi untuk mengurutkan vektor dari besar ke kecil
Alur dari algoritma berikut adalah mengumpulkan bilangan yang paling kecil ke bagian belakang dalam setiap kali iterasi.
sort_desc <- function(v){
n <- length(v)
for (i in 1:(n-1)){ # iterasi luar: Lihat iterasi dalam dulu!
for (j in 1:(n-i)){ # iterasi dalam: membawa bilangan paling kecil ke belakang.
if (v[j]<v[j+1]){ # Jika bil. pertama lebih kecil daripada yg kedua, tukarkan!
tmp <- v[j]
v[j] <- v[j+1]
v[j+1] <- tmp
}
}
}
return(v)
}Perbandingan
sort_desc(x) # buatan## [1] 102 101 45 21 13 9 7 6
sort(x,decreasing = T) # bawaan R## [1] 102 101 45 21 13 9 7 6
Kesimpulan: Hasilnya sama, maka fungsi buatan sort_asc dan sort_desc berjalan dengan baik.