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
- Mulai
- Tentukan dua nilai awal, misalnya \(x_1 = 1\) dan \(x_2 = 1\)
- Tentukan batas toleransi
- Hitung \(Z = \frac{1}{x_1} + \frac{1}{x_2}\)
- Hitung elemen berikutnya, \(x_i\) dengan menjumlahkan dua elemen sebelumnya, \(x_{i-2} + x_{i-1}\),
- Hitung \(Z= Z + \frac{1}{x_i}\)
- Periksa apakah elemen deret masih dalam batas toleransi
- Ulangi langkah 5, 6 dan 7 hingga batas toleransi tidak lagi terpenuhi
- Print nilai \(Z\)
- 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
- Mulai
- Tentukan batas toleransi
- Tentukan awalan \(Z=0\)
- Untuk \(i=0\), hitung \(Z = Z + [10 \times (-\frac{1}{5})^0 ]\)
- Ulangi langkah ke-4 untuk \(i = i+1\) hingga batas toleransi tidak lagi terpenuhi
- Print nilai \(Z\)
- 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
- Mulai
- Baca vector
- 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
- Ulangi langkah ke-3 sampai semua elemen terurut sesuai pola yang diinginkan.
- Kembalikan/print vector yang sudah terurut
- 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
- Mulai
- Iterasi vector, dari elemen ke-2 hingga elemen ke-n (elemen terakhir)
- Untuk setiap iterasi, jika elemen yang tengah diiterasi lebih kecil daripada elemen sebelumnya, bandingkan elemen tersebut dengan elemen-elemen sebelumnya
- Tukar posisi elemen yang tengah diiterasi dengan elemen-elemen sebelumnya (yang nilai-nilainya lebih besar)
- Kembalikan/print vector yang sudah terurut
- 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.
Penulis adalah mahasiswa Pascasarjana Statistika dan Sains Data, Institut Pertanian Bogor, NIM: G1501211061, nur.andi@apps.ipb.ac.id↩︎