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
- Menuliskan rumus dalam bentuk function
fz<-function(n){
1/((1/sqrt(5))*((((1+sqrt(5))/2)^n)-(((1-sqrt(5))/2)^n)))
}
- Mendefinisikan kriteria stopping
stop.kriteria<-function(ycurrent, ybefore){
abs(ycurrent-ybefore)
}
- Mendefinisikan nilai-nilai awal
bataserror<-10 #nilai awal kriteria stopping
nilaiawal<-0 #nilai awal deret
n<-1 #nilai awal iterasi
- Menuliskan iterasi untuk mencari jumlah deret
while(bataserror>0.000001) {
nilaiZ<-nilaiawal+fz(n)
bataserror<-stop.kriteria(nilaiZ,nilaiawal)
nilaiawal<-nilaiZ
n<-n+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
- Menuliskan rumus dalam bentuk function
fz2<-function(n){
(10) * ((-1/5)^(n-1))
}
- Mendefinisikan kriteria stopping
stop.kriteria<-function(ycurrent, ybefore){
abs(ycurrent-ybefore)
}
- Mendefinisikan nilai-nilai awal
bataserror<-10 #nilai awal kriteria stopping
nilaiawal<-0 #nilai awal deret
n<-1 #nilai awal iterasi
- Menuliskan iterasi untuk mencari jumlah deret
while(bataserror>0.000001) {
nilaiZ2<-nilaiawal+fz2(n)
bataserror<-stop.kriteria(nilaiZ2,nilaiawal)
nilaiawal<-nilaiZ2
n<-n+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.