Laporan 4 Praktikum Pemrograman Statistik - Tugas Satria June Adwendi
Praktikum Pertemuan 8 - Algoritma Iteratif
Latihan 1
Sorting
Misalkan saja ada sebuah vektor x={3,1,4,1,5,9,2,6,5}, buat program untuk mengurutkan vektor tersebut dari kecil ke besar, kemudian bandingkan hasilnya dengan fungsi sort! Gunakan algoritme pada slide kuliah ke-16 !
Jawaban:
Ada beberapa algoritme iteratif yang bisa diterapkan untuk melakukan pengurutan:
Bubble Sort
Selection Sort
Insertion Sort
Merge Sort
Quick Sort
Algoritme yang digunakan pada slide kuliah adalah Bubble Sort. Untuk melakukan pengurutan, iterasi yang akan digunakan terdiri dari dua tingkat:
Iterasi untuk memastikan semua elemen diperiksa
Iterasi untuk mengakses elemen-elemen vektor yang digunakan untuk penukaran antar elemen
Pada iterasi tingkat kedua nilai-nilai yang kecil akan dipindahkan ke depan sehingga selanjutnya elemen-elemen di bagian depan tidak perlu diperiksa lagi. Misal pada saat iterasi tingkat pertama sama dengan 3 maka elemen yang akan dibandingkan hanya dari element 4 sampai 7 saja (ingat ada j+1). Semakin meningkat iterasi tingkat 1 maka banyaknya iterasi tingkat 2 semakin mengecil (pada kasus ini diakomodir dengan nx-i).
x <- c(3,1,4,1,5,9,2,6,5)
# Mendefinisikan objek baru yang akan digunakan untuk menampilkan hasil sortir
x_sort <- x
# Banyaknya amatan
nx <- length(x)
# Iterasi tingkat 1
for (i in 1:(nx-1)) {
# Iterasi tingkat 2
for (j in 1:(nx-i)) {
# Pemeriksaan kondisi apakah elemen ke-j lebih besar dari elemen ke-j+1
if (x_sort[j] > x_sort[j+1]) {
# Jika terpenuhi, lakukan algoritme penukaran
tmp <- x_sort[j]
x_sort[j] <- x_sort[j+1]
x_sort[j+1] <- tmp
}
}
}
x_sort## [1] 1 1 2 3 4 5 5 6 9
Latihan 2
Berdasarkan jawaban Latihan 1, buatlah fungsi yang bernama urut dengan yang membutuhkan input vektor x dan outputnya merupakan vektor yang sudah terurut!
urut <- function(x){
x_sort <- x
nx <- length(x)
# Iterasi tingkat 1
for (i in 1:(nx-1)) {
# Iterasi tingkat 2
for (j in 1:(nx-i)) {
# Pemeriksaan kondisi apakah elemen ke-j lebih besar dari elemen ke-j+1
if (x_sort[j] > x_sort[j+1]) {
# Jika terpenuhi, lakukan algoritme penukaran
tmp <- x_sort[j]
x_sort[j] <- x_sort[j+1]
x_sort[j+1] <- tmp
}
}
}
return(x_sort)
}
# output fungsi urut
x <- c(3,1,4,1,5,9,2,6,5)
urut(x)## [1] 1 1 2 3 4 5 5 6 9
Latihan 3
Menggambar Pola
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 1 1 1 1 1
## [2,] 1 1 1 1 1 NA
## [3,] 1 1 1 1 NA NA
## [4,] 1 1 1 NA NA NA
## [5,] 1 1 NA NA NA NA
## [6,] 1 NA NA NA NA NABuatlah pola seperti gambar di atas menggunakan algoritme iteratif!
# Membuat pola dasar
mat <- matrix(NA,6,6)
mat## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] NA NA NA NA NA NA
## [2,] NA NA NA NA NA NA
## [3,] NA NA NA NA NA NA
## [4,] NA NA NA NA NA NA
## [5,] NA NA NA NA NA NA
## [6,] NA NA NA NA NA NA
# Membuat pola sesuai yang diinginkan
for (i in 1:6) {
for (j in 1:(6-i+1)) {
mat[i,j] <- 1
}
}
# Hasil Akhir
mat## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 1 1 1 1 1
## [2,] 1 1 1 1 1 NA
## [3,] 1 1 1 1 NA NA
## [4,] 1 1 1 NA NA NA
## [5,] 1 1 NA NA NA NA
## [6,] 1 NA NA NA NA NA
Latihan 4
Deret Bilangan
Susunlah syntax R untuk menghitung penjumlahan deret tak hingga berikut!
z=2 − 6/5 + 8/10 − 10/17 + 12/26 − …
Hint: Cari formula/pola dari deret tersebut terlebih dahulu
Jawaban:
Formula dari deret tersebut adalah
# Menuliskan rumus fungsi dalam bentuk function
fz1 <- function(n){
(-1)^(n+1)*((2*n+2)/((n^2)+1))
}
# Mendefinisikan nilai-nilai awal (initial value)
error <- 10 #Nilai awal kriteria berhenti
z0 <- 0 #Nilai awal deret
n <- 1 #Nilai awal iterasi
# Membuat iterasi untuk mencari jumlah deret
while (error>0.00001) {
z <- z0 + fz1(n)
error <- abs(z-z0)
z0 <- z
n <- n+1
}
# Hasil Akhir
z ## [1] 1.267197
# Banyaknya Iterasi
n## [1] 200002
Latihan 5
Susunlah syntax R untuk menghitung penjumlahan deret tak hingga berikut!
z=2/5 + 3/40 + 6/135 + 11/320 + 18/625 + 27/1080 + …
Hint: Cari formula/pola dari deret tersebut terlebih dahulu
Jawaban:
Formula dari deret tersebut adalah
# Menuliskan rumus fungsi dalam bentuk function
fz2 <- function(n){
((n^2) - 2*n + 3) / (5*n^3)
}
# Mendefinisikan nilai-nilai awal (initial value)
error <- 10 #Nilai awal kriteria berhenti
z0 <- 0 #Nilai awal deret
n <- 1 #Nilai awal iterasi
# Membuat iterasi untuk mencari jumlah deret
while (error>1e-6) {
z <- z0 + fz2(n)
error <- abs(z-z0)
z0 <- z
n <- n+1
}
# Hasil Akhir
z ## [1] 2.61992
# Banyaknya Iterasi
n## [1] 2e+05
Latihan 6
Berdasarkan jawaban Latihan 4 dan 5, buatlah fungsi yang bernama deret dengan ketentuan:
Jika inputnya hanya fungsi deret bilangan, outputnya adalah jumlah deret dan banyaknya iterasi
Jika inputnya fungsi deret bilangan dan bilangan n, outputnya adalah n dan suku ke-n dari deret tersebut
deret <- function(x,n){
if(missing(n)) {
#Input Fungsi Deret Bilangan (1 input)
# Mendefinisikan nilai-nilai awal (initial value)
error <- 10 #Nilai awal kriteria berhenti
z0 <- 0 #Nilai awal deret
n <- 1 #Nilai awal iterasi
# Membuat iterasi untuk mencari jumlah deret
while (error>1e-6) {
z <- z0 + fz2(n)
error <- abs(z-z0)
z0 <- z
n <- n+1
}
output <- matrix(c(z,n),nrow =2, ncol =1)
rownames(output)<- c("hasil akhir","banyaknya iterasi")
return(output)
}
else{
output <- matrix(c(n,fz2(n)),nrow =2, ncol =1)
rownames(output)<- c("n","suku ke-n")
return(output)
}
}
# Menuliskan rumus fungsi latihan 4 dalam bentuk function
fz2 <- function(n){
(-1)^(n+1)*((2*n+2)/((n^2)+1))
}
deret(fz2)## [,1]
## hasil akhir 1.267192e+00
## banyaknya iterasi 2.000002e+06
deret(fz2,4)## [,1]
## n 4.0000000
## suku ke-n -0.5882353
# Menuliskan rumus fungsi latihan 5 dalam bentuk function
fz2 <- function(n){
((n^2) - 2*n + 3) / (5*n^3)
}
deret(fz2)## [,1]
## hasil akhir 2.61992e+00
## banyaknya iterasi 2.00000e+05
deret(fz2,4)## [,1]
## n 4.000000
## suku ke-n 0.034375
Latihan 7
Bilangan Fibonacci
Hitung penjumlahan dari barisan bilangan Fibonacci yang nilainya kurang dari 1000000 dan merupakan bilangan kelipatan 5!
# Membuat barisan Fibonacci
fibo <- c(0,1)
n <- length(fibo)
x <- fibo[n]+fibo[n-1]
while (x<1000000){
n <- n+1
fibo[n] <- x
x <- fibo[n]+fibo[n-1]
}
# Barisan Fibonacci
fibo## [1] 0 1 1 2 3 5 8 13 21 34
## [11] 55 89 144 233 377 610 987 1597 2584 4181
## [21] 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229
## [31] 832040
# Mencari suku barisan Fibonacci kelipatan 5
fibo[fibo %% 5 == 0]## [1] 0 5 55 610 6765 75025 832040
# Menjumlahkan bilangan Fibonacci kelipatan 5
sum(fibo[fibo %% 5 == 0])## [1] 914500
Praktikum Pertemuan 9 - Root Finding
Metode Root Finding
Berikut adalah user-defined function dari metode-metode Root Finding dengan mengikuti algoritme masing-masing metode.
1. Metode Fixed-Point
Fungsi fixedpoint memiliki beberapa argumen yaitu ftn yang berupa function di R, x0 merupakan nilai awal, tol merupakan nilai tolerasi dan max.iter adalah iterasi maksimum. tol dan max.iter masing-masing memiliki nilai default 1e-9 dan 100.
fixedpoint <- function(ftn, x0, tol = 1e-9, max.iter = 100) {
xold <- x0
xnew <- ftn(xold)
iter <- 1
cat("At iteration 1 value of x is:", xnew, "\n")
while ((abs(xnew-xold) > tol) && (iter < max.iter)) {
# xold digunakan untuk menyimpan akar-akar persamaan dari iterasi sebelumnya
xold <- xnew
# xnew digunakan untuk menghitung akar-akar persamaan pada iterasi yang sedang berjalan
xnew <- ftn(xold) #ingat ftn bentuknya fungsi
# iter digunakan untuk menyimpan banyaknya iterasi
iter <- iter + 1
cat("At iteration", iter, "value of x is:", xnew, "\n")
}
# output bergantung pada kesuksesan algoritma
if (abs(xnew-xold) > tol) {
cat("Algorithm failed to converge\n")
return(NULL)
} else {
cat("Algorithm converged\n")
return(xnew)
}
}2. Metode Newton-Raphson
Fungsi newtonraphson memiliki beberapa argumen yaitu ftn yang berupa function di R, x0 merupakan nilai awal, tol merupakan nilai tolerasi dan max.iter adalah iterasi maksimum. tol dan max.iter masing-masing memiliki nilai default 1e-9 dan 100.
newtonraphson <- function(ftn, x0, tol = 1e-5, max.iter = 100) {
x <- x0
fx <- ftn(x)
iter <- 0
while ((abs(fx[1]) > tol) && (iter < max.iter)) {
x <- x - fx[1]/fx[2]
fx <- ftn(x)
iter <- iter + 1
cat("At iteration", iter, "value of x is:", x, "\n")
}
# output bergantung pada kesuksesan algoritma
if (abs(fx[1]) > tol) {
cat("Algorithm failed to converge\n")
return(NULL)
} else {
cat("Algorithm converged\n")
return(x)
}
}3. Metode Secant
Fungsi secant memiliki beberapa argumen yaitu ftn yang berupa function di R, x0 dan x1 merupakan nilai awal, tol merupakan nilai tolerasi dan max.iter adalah iterasi maksimum. tol dan max.iter masing-masing memiliki nilai default 1e-9 dan 100.
secant <- function(ftn, x0, x1, tol = 1e-9, max.iter = 100) {
xa <- x0
fxa <- ftn(xa)
xb <- x1
fxb <- ftn(xb)
iter <- 0
while ((abs(xb-xa) > tol) && (iter < max.iter)) {
xt <- fxb*((xb-xa)/(fxb-fxa))
xc <- xb-xt
# fxc <- ftn(xc)
iter <- iter + 1
cat("At iteration", iter, "value of x is:", xc, "\n")
xa <- xb
xb <- xc
fxa <- ftn(xa)
fxb <- ftn(xb)
}
if (abs(xb-xa) > tol) {
cat("Algorithm failed to converge\n")
return(NULL)
} else {
cat("Algorithm converged\n")
return(xb)
}
}Metode Bisection
Fungsi bisection memiliki beberapa argumen yaitu ftn yang berupa function di R, xl dan xr merupakan nilai awal, tol merupakan nilai tolerasi dan max.iter adalah iterasi maksimum. tol dan max.iter masing-masing memiliki nilai default 1e-9 dan 100.
bisection <- function(ftn, xl, xr, tol = 1e-9,max.iter = 100) {
# Jika tanda dari hasil evaluasi fungsi pada titik xl dan xr berbeda maka program dihentikan
if ((ftn(xl) > 0) && (ftn(xr) < 0)) {
stop('signs of ftn(xl) and ftn(xr) differ')
}
for (iter in 1:max.iter) {
xm <- (xl + xr) / 2 # menghitung nilai tengah
cat("At iteration", iter, "value of x is:", xm, "\n")
# Jika fungsinya sama dengan 0 di titik tengah atau titik tengah di bawah toleransi
# yang diinginkan, hentikan dan keluarkan nilai tengah sebagai akar
if ((ftn(xm) == 0) || abs(xr - xl) < tol) {
return(xm)
}
# Jika diperlukan iterasi lain, periksa tanda-tanda fungsi pada titik xm dan xl
# lalu tetapkan kembali xl atau xr sebagai titik tengah yang akan digunakan
# pada iterasi berikutnya.
ifelse(sign(ftn(xm)) == sign(ftn(xl)), xl <- xm, xr <- xm)
}
}Latihan 1
Misalkan diberikan suatu persamaan x^3 − 2x − 5 = 0 .
Gambarkan fungsi tersebut!
Carilah akar-akar persamaan dengan menggunakan metode fixed-point, newton-raphson, secant dan bisection!
Jawab:
# mendefinikan persamaan dalam bentuk fungsi
fx <- function(x) {
x^3 - 2*x - 5
}
# mendefinisikan persamaan dalam bentuk fungsi untuk fixed-point
fx_fp <- function(x){
5/(x^2-2)
}
# mendefinikan persamaan dalam bentuk fungsi untuk newton-raphson
fx_nr <- function(x) {
rumus_fungsi <- function(x) x^3-2*x-5
fungsi <- rumus_fungsi(x)
# mencari turunan dengan menggunakan fungsi Deriv
# dari package Deriv
rumus_turunan <- Deriv::Deriv(fx)
turunan <- rumus_turunan(x)
return(c("fungsi"=fungsi,"turunan"=turunan))
}- Gambarkan Fungsi
curve(fx,xlim=c(-3,3), col='steelblue',lwd=2)
abline(h=0)
abline(v=0)- Carilah akar-akar persamaan dengan menggunakan metode fixed-point, newton-raphson, secant dan bisection!
# fixed-point
fixedpoint(ftn = fx_fp,x0=0)## At iteration 1 value of x is: -2.5
## At iteration 2 value of x is: 1.176471
## At iteration 3 value of x is: -8.117978
## At iteration 4 value of x is: 0.07824535
## At iteration 5 value of x is: -2.507676
## At iteration 6 value of x is: 1.165925
## At iteration 7 value of x is: -7.804949
## At iteration 8 value of x is: 0.08486483
## At iteration 9 value of x is: -2.509035
## At iteration 10 value of x is: 1.164075
## At iteration 11 value of x is: -7.752778
## At iteration 12 value of x is: 0.08605028
## At iteration 13 value of x is: -2.50929
## At iteration 14 value of x is: 1.163728
## At iteration 15 value of x is: -7.743083
## At iteration 16 value of x is: 0.08627333
## At iteration 17 value of x is: -2.509339
## At iteration 18 value of x is: 1.163662
## At iteration 19 value of x is: -7.741248
## At iteration 20 value of x is: 0.08631566
## At iteration 21 value of x is: -2.509348
## At iteration 22 value of x is: 1.16365
## At iteration 23 value of x is: -7.740899
## At iteration 24 value of x is: 0.08632371
## At iteration 25 value of x is: -2.50935
## At iteration 26 value of x is: 1.163647
## At iteration 27 value of x is: -7.740833
## At iteration 28 value of x is: 0.08632524
## At iteration 29 value of x is: -2.50935
## At iteration 30 value of x is: 1.163647
## At iteration 31 value of x is: -7.74082
## At iteration 32 value of x is: 0.08632553
## At iteration 33 value of x is: -2.50935
## At iteration 34 value of x is: 1.163647
## At iteration 35 value of x is: -7.740818
## At iteration 36 value of x is: 0.08632558
## At iteration 37 value of x is: -2.50935
## At iteration 38 value of x is: 1.163647
## At iteration 39 value of x is: -7.740817
## At iteration 40 value of x is: 0.08632559
## At iteration 41 value of x is: -2.50935
## At iteration 42 value of x is: 1.163647
## At iteration 43 value of x is: -7.740817
## At iteration 44 value of x is: 0.0863256
## At iteration 45 value of x is: -2.50935
## At iteration 46 value of x is: 1.163647
## At iteration 47 value of x is: -7.740817
## At iteration 48 value of x is: 0.0863256
## At iteration 49 value of x is: -2.50935
## At iteration 50 value of x is: 1.163647
## At iteration 51 value of x is: -7.740817
## At iteration 52 value of x is: 0.0863256
## At iteration 53 value of x is: -2.50935
## At iteration 54 value of x is: 1.163647
## At iteration 55 value of x is: -7.740817
## At iteration 56 value of x is: 0.0863256
## At iteration 57 value of x is: -2.50935
## At iteration 58 value of x is: 1.163647
## At iteration 59 value of x is: -7.740817
## At iteration 60 value of x is: 0.0863256
## At iteration 61 value of x is: -2.50935
## At iteration 62 value of x is: 1.163647
## At iteration 63 value of x is: -7.740817
## At iteration 64 value of x is: 0.0863256
## At iteration 65 value of x is: -2.50935
## At iteration 66 value of x is: 1.163647
## At iteration 67 value of x is: -7.740817
## At iteration 68 value of x is: 0.0863256
## At iteration 69 value of x is: -2.50935
## At iteration 70 value of x is: 1.163647
## At iteration 71 value of x is: -7.740817
## At iteration 72 value of x is: 0.0863256
## At iteration 73 value of x is: -2.50935
## At iteration 74 value of x is: 1.163647
## At iteration 75 value of x is: -7.740817
## At iteration 76 value of x is: 0.0863256
## At iteration 77 value of x is: -2.50935
## At iteration 78 value of x is: 1.163647
## At iteration 79 value of x is: -7.740817
## At iteration 80 value of x is: 0.0863256
## At iteration 81 value of x is: -2.50935
## At iteration 82 value of x is: 1.163647
## At iteration 83 value of x is: -7.740817
## At iteration 84 value of x is: 0.0863256
## At iteration 85 value of x is: -2.50935
## At iteration 86 value of x is: 1.163647
## At iteration 87 value of x is: -7.740817
## At iteration 88 value of x is: 0.0863256
## At iteration 89 value of x is: -2.50935
## At iteration 90 value of x is: 1.163647
## At iteration 91 value of x is: -7.740817
## At iteration 92 value of x is: 0.0863256
## At iteration 93 value of x is: -2.50935
## At iteration 94 value of x is: 1.163647
## At iteration 95 value of x is: -7.740817
## At iteration 96 value of x is: 0.0863256
## At iteration 97 value of x is: -2.50935
## At iteration 98 value of x is: 1.163647
## At iteration 99 value of x is: -7.740817
## At iteration 100 value of x is: 0.0863256
## Algorithm failed to converge
## NULL
# newton raphson
newtonraphson(ftn = fx_nr, x0=0)## At iteration 1 value of x is: -2.5
## At iteration 2 value of x is: -1.567164
## At iteration 3 value of x is: -0.5025924
## At iteration 4 value of x is: -3.820706
## At iteration 5 value of x is: -2.549393
## At iteration 6 value of x is: -1.608111
## At iteration 7 value of x is: -0.5761004
## At iteration 8 value of x is: -4.59771
## At iteration 9 value of x is: -3.083543
## At iteration 10 value of x is: -2.022194
## At iteration 11 value of x is: -1.123764
## At iteration 12 value of x is: 1.208652
## At iteration 13 value of x is: 3.58079
## At iteration 14 value of x is: 2.655233
## At iteration 15 value of x is: 2.216106
## At iteration 16 value of x is: 2.102125
## At iteration 17 value of x is: 2.094584
## At iteration 18 value of x is: 2.094551
## Algorithm converged
## fungsi
## 2.094551
# secant
secant(fx,x0=1,x1=3)## At iteration 1 value of x is: 1.545455
## At iteration 2 value of x is: 1.859163
## At iteration 3 value of x is: 2.20035
## At iteration 4 value of x is: 2.079799
## At iteration 5 value of x is: 2.093704
## At iteration 6 value of x is: 2.094559
## At iteration 7 value of x is: 2.094551
## At iteration 8 value of x is: 2.094551
## At iteration 9 value of x is: 2.094551
## Algorithm converged
## [1] 2.094551
# bisection
bisection(fx,xl=-3,xr=3)## At iteration 1 value of x is: 0
## At iteration 2 value of x is: 1.5
## At iteration 3 value of x is: 2.25
## At iteration 4 value of x is: 1.875
## At iteration 5 value of x is: 2.0625
## At iteration 6 value of x is: 2.15625
## At iteration 7 value of x is: 2.109375
## At iteration 8 value of x is: 2.085938
## At iteration 9 value of x is: 2.097656
## At iteration 10 value of x is: 2.091797
## At iteration 11 value of x is: 2.094727
## At iteration 12 value of x is: 2.093262
## At iteration 13 value of x is: 2.093994
## At iteration 14 value of x is: 2.09436
## At iteration 15 value of x is: 2.094543
## At iteration 16 value of x is: 2.094635
## At iteration 17 value of x is: 2.094589
## At iteration 18 value of x is: 2.094566
## At iteration 19 value of x is: 2.094555
## At iteration 20 value of x is: 2.094549
## At iteration 21 value of x is: 2.094552
## At iteration 22 value of x is: 2.094551
## At iteration 23 value of x is: 2.094551
## At iteration 24 value of x is: 2.094552
## At iteration 25 value of x is: 2.094552
## At iteration 26 value of x is: 2.094551
## At iteration 27 value of x is: 2.094551
## At iteration 28 value of x is: 2.094551
## At iteration 29 value of x is: 2.094551
## At iteration 30 value of x is: 2.094551
## At iteration 31 value of x is: 2.094551
## At iteration 32 value of x is: 2.094551
## At iteration 33 value of x is: 2.094551
## At iteration 34 value of x is: 2.094551
## [1] 2.094551
Latihan 2
Misalkan diberikan suatu persamaan x^3 − x − 1 = 0 .
Gambarkan fungsi tersebut!
Carilah akar-akar persamaan dengan menggunakan metode fixed-point, newton-raphson, secant dan bisection!
Jawaban
# mendefinikan persamaan dalam bentuk fungsi
fx <- function(x) {
x^3 - x - 1
}
# mendefinisikan persamaan dalam bentuk fungsi untuk fixed-point
fx_fp <- function(x){
1/(x^2-1)
}
# mendefinikan persamaan dalam bentuk fungsi untuk newton-raphson
fx_nr <- function(x) {
rumus_fungsi <- function(x) x^3-x-1
fungsi <- rumus_fungsi(x)
# mencari turunan dengan menggunakan fungsi Deriv
# dari package Deriv
rumus_turunan <- Deriv::Deriv(fx)
turunan <- rumus_turunan(x)
return(c("fungsi"=fungsi,"turunan"=turunan))
}- Gambarkan Fungsi
curve(fx,xlim=c(-3,3), col='steelblue',lwd=2)
abline(h=0)
abline(v=0)- Carilah akar-akar persamaan dengan menggunakan metode fixed-point, newton-raphson, secant dan bisection!
# fixed-point
fixedpoint(ftn = fx_fp,x0=0)## At iteration 1 value of x is: -1
## At iteration 2 value of x is: Inf
## At iteration 3 value of x is: 0
## At iteration 4 value of x is: -1
## At iteration 5 value of x is: Inf
## At iteration 6 value of x is: 0
## At iteration 7 value of x is: -1
## At iteration 8 value of x is: Inf
## At iteration 9 value of x is: 0
## At iteration 10 value of x is: -1
## At iteration 11 value of x is: Inf
## At iteration 12 value of x is: 0
## At iteration 13 value of x is: -1
## At iteration 14 value of x is: Inf
## At iteration 15 value of x is: 0
## At iteration 16 value of x is: -1
## At iteration 17 value of x is: Inf
## At iteration 18 value of x is: 0
## At iteration 19 value of x is: -1
## At iteration 20 value of x is: Inf
## At iteration 21 value of x is: 0
## At iteration 22 value of x is: -1
## At iteration 23 value of x is: Inf
## At iteration 24 value of x is: 0
## At iteration 25 value of x is: -1
## At iteration 26 value of x is: Inf
## At iteration 27 value of x is: 0
## At iteration 28 value of x is: -1
## At iteration 29 value of x is: Inf
## At iteration 30 value of x is: 0
## At iteration 31 value of x is: -1
## At iteration 32 value of x is: Inf
## At iteration 33 value of x is: 0
## At iteration 34 value of x is: -1
## At iteration 35 value of x is: Inf
## At iteration 36 value of x is: 0
## At iteration 37 value of x is: -1
## At iteration 38 value of x is: Inf
## At iteration 39 value of x is: 0
## At iteration 40 value of x is: -1
## At iteration 41 value of x is: Inf
## At iteration 42 value of x is: 0
## At iteration 43 value of x is: -1
## At iteration 44 value of x is: Inf
## At iteration 45 value of x is: 0
## At iteration 46 value of x is: -1
## At iteration 47 value of x is: Inf
## At iteration 48 value of x is: 0
## At iteration 49 value of x is: -1
## At iteration 50 value of x is: Inf
## At iteration 51 value of x is: 0
## At iteration 52 value of x is: -1
## At iteration 53 value of x is: Inf
## At iteration 54 value of x is: 0
## At iteration 55 value of x is: -1
## At iteration 56 value of x is: Inf
## At iteration 57 value of x is: 0
## At iteration 58 value of x is: -1
## At iteration 59 value of x is: Inf
## At iteration 60 value of x is: 0
## At iteration 61 value of x is: -1
## At iteration 62 value of x is: Inf
## At iteration 63 value of x is: 0
## At iteration 64 value of x is: -1
## At iteration 65 value of x is: Inf
## At iteration 66 value of x is: 0
## At iteration 67 value of x is: -1
## At iteration 68 value of x is: Inf
## At iteration 69 value of x is: 0
## At iteration 70 value of x is: -1
## At iteration 71 value of x is: Inf
## At iteration 72 value of x is: 0
## At iteration 73 value of x is: -1
## At iteration 74 value of x is: Inf
## At iteration 75 value of x is: 0
## At iteration 76 value of x is: -1
## At iteration 77 value of x is: Inf
## At iteration 78 value of x is: 0
## At iteration 79 value of x is: -1
## At iteration 80 value of x is: Inf
## At iteration 81 value of x is: 0
## At iteration 82 value of x is: -1
## At iteration 83 value of x is: Inf
## At iteration 84 value of x is: 0
## At iteration 85 value of x is: -1
## At iteration 86 value of x is: Inf
## At iteration 87 value of x is: 0
## At iteration 88 value of x is: -1
## At iteration 89 value of x is: Inf
## At iteration 90 value of x is: 0
## At iteration 91 value of x is: -1
## At iteration 92 value of x is: Inf
## At iteration 93 value of x is: 0
## At iteration 94 value of x is: -1
## At iteration 95 value of x is: Inf
## At iteration 96 value of x is: 0
## At iteration 97 value of x is: -1
## At iteration 98 value of x is: Inf
## At iteration 99 value of x is: 0
## At iteration 100 value of x is: -1
## Algorithm failed to converge
## NULL
newtonraphson(ftn=fx_nr,x0=0)## At iteration 1 value of x is: -1
## At iteration 2 value of x is: -0.5
## At iteration 3 value of x is: -3
## At iteration 4 value of x is: -2.038462
## At iteration 5 value of x is: -1.390282
## At iteration 6 value of x is: -0.9116119
## At iteration 7 value of x is: -0.3450285
## At iteration 8 value of x is: -1.427751
## At iteration 9 value of x is: -0.9424179
## At iteration 10 value of x is: -0.4049494
## At iteration 11 value of x is: -1.706905
## At iteration 12 value of x is: -1.155756
## At iteration 13 value of x is: -0.6941918
## At iteration 14 value of x is: 0.7424943
## At iteration 15 value of x is: 2.781296
## At iteration 16 value of x is: 1.982725
## At iteration 17 value of x is: 1.536927
## At iteration 18 value of x is: 1.357262
## At iteration 19 value of x is: 1.325663
## At iteration 20 value of x is: 1.324719
## Algorithm converged
## fungsi
## 1.324719
secant(fx,x0=1,x1=3)## At iteration 1 value of x is: 1.083333
## At iteration 2 value of x is: 1.148686
## At iteration 3 value of x is: 1.379925
## At iteration 4 value of x is: 1.314886
## At iteration 5 value of x is: 1.324227
## At iteration 6 value of x is: 1.324722
## At iteration 7 value of x is: 1.324718
## At iteration 8 value of x is: 1.324718
## At iteration 9 value of x is: 1.324718
## Algorithm converged
## [1] 1.324718
bisection(fx,xl=-3,xr=3)## At iteration 1 value of x is: 0
## At iteration 2 value of x is: 1.5
## At iteration 3 value of x is: 0.75
## At iteration 4 value of x is: 1.125
## At iteration 5 value of x is: 1.3125
## At iteration 6 value of x is: 1.40625
## At iteration 7 value of x is: 1.359375
## At iteration 8 value of x is: 1.335938
## At iteration 9 value of x is: 1.324219
## At iteration 10 value of x is: 1.330078
## At iteration 11 value of x is: 1.327148
## At iteration 12 value of x is: 1.325684
## At iteration 13 value of x is: 1.324951
## At iteration 14 value of x is: 1.324585
## At iteration 15 value of x is: 1.324768
## At iteration 16 value of x is: 1.324677
## At iteration 17 value of x is: 1.324722
## At iteration 18 value of x is: 1.324699
## At iteration 19 value of x is: 1.324711
## At iteration 20 value of x is: 1.324717
## At iteration 21 value of x is: 1.324719
## At iteration 22 value of x is: 1.324718
## At iteration 23 value of x is: 1.324717
## At iteration 24 value of x is: 1.324718
## At iteration 25 value of x is: 1.324718
## At iteration 26 value of x is: 1.324718
## At iteration 27 value of x is: 1.324718
## At iteration 28 value of x is: 1.324718
## At iteration 29 value of x is: 1.324718
## At iteration 30 value of x is: 1.324718
## At iteration 31 value of x is: 1.324718
## At iteration 32 value of x is: 1.324718
## At iteration 33 value of x is: 1.324718
## At iteration 34 value of x is: 1.324718
## [1] 1.324718
Latihan 3
Lakukan Modifikasi pada fungsi newtonraphson sehingga output dari fungsi tersebut berupa list dengan tiga object:
Object pertama bernama
rootberisi akar persamaan.Object kedua bernama
x_valuesberisi semua nilai x yang dicobakanObject ketiga bernama
errorberisi nilai dari hasil operasiabs(fx[1])Gunakan persamaan pada Latihan 1 untuk menujukkan hasil outputnya!
newtonraphson.modif <- function(ftn, x0, tol = 1e-5, max.iter = 100) {
x <- x0
fx <- ftn(x)
iter <- 0
vector <- c()
while ((abs(fx[1]) > tol) && (iter < max.iter)) {
x <- x - fx[1]/fx[2]
fx <- ftn(x)
iter <- iter + 1
vector <- c(vector, x)
}
# output depends on success of algorithm
if (abs(fx[1]) > tol) {
cat("Algorithm failed to converge\n")
return(NULL)
} else {
cat("Algorithm converged\n")
list.newtonraphson.modif <- list("Root" = x, "X_values" = vector, "error" = abs(fx[1])) # output berupa list
return(list.newtonraphson.modif)
}
}
#Menentukan akar ciri dari persamaan 1
ftn <- function(x) {
# returns function value and its derivative at x
fx <- x^3 - 2*x - 5 # fungsi f(x)
dfx <- 3*x^2 - 2 # turunan pertama f(x)
return(c(fx, dfx))
}
newtonraphson.modif(ftn, 0)## Algorithm converged
## $Root
## [1] 2.094551
##
## $X_values
## [1] -2.5000000 -1.5671642 -0.5025924 -3.8207065 -2.5493934 -1.6081115
## [7] -0.5761004 -4.5977096 -3.0835431 -2.0221943 -1.1237641 1.2086516
## [13] 3.5807900 2.6552332 2.2161063 2.1021250 2.0945836 2.0945515
##
## $error
## [1] 6.472653e-09
Latihan 4
Selidiki penggunaan fungsi browser() di R. Gunakan fungsi newtonraphson untuk ilustrasi penggunaan. Laporkan hasil penyelidikanmu beserta ilustrasi koding!
Jawaban:
Fungsi browser() dapat digunakan seperti breakpoint yaitu eksekusi kode akan berhenti pada titik yang dipanggil. Kemudian pengguna dapat memeriksa nilai variabel, mengeksekusi kode R arbitrer, dan menelusuri kode baris demi baris. Jadi, fungsi browser() ini digunakan untuk melakukan debugging.
Setelah fungsi masuk ke dalam kode, interpreter interaktif akan mulai. Kode R apa pun dapat dijalankan seperti biasa, seperti contoh akan digunakan fungsi browser() untuk melihat program fungsi newtonraphson.
newtonraphson <- function(ftn, x0, tol = 1e-05, max.iter = 100) {
x <- x0
fx <- ftn(x)
iter <- 0
while ((abs(fx[1]) > tol) && (iter < max.iter)) {
browser() #ditambah fungsi browser()
x <- x - fx[1]/fx[2]
fx <- ftn(x)
iter <- iter + 1
cat("At iteration", iter, "value of x is:", x, "\n")
}
# output bergantung pada kesuksesan algoritma
if (abs(fx[1]) > tol) {
cat("Algorithm failed to converge\n")
return(NULL)
} else {
cat("Algorithm converged\n")
return(x)
}
}
ftn <- function(x) {
fx <- log(x) - exp(-x) # fungsi f(x)
dfx <- 1/x + exp(-x) # turunan pertama f(x)
return(c(fx, dfx))
}
newtonraphson(ftn,x0=3,1e-04)## Called from: newtonraphson(ftn, x0 = 3, 1e-04)
## debug at <text>#7: x <- x - fx[1]/fx[2]
## debug at <text>#8: fx <- ftn(x)
## debug at <text>#9: iter <- iter + 1
## debug at <text>#10: cat("At iteration", iter, "value of x is:", x, "\n")
## At iteration 1 value of x is: 0.2624136
## debug at <text>#5: (while) (abs(fx[1]) > tol) && (iter < max.iter)
## debug at <text>#6: browser()
## debug at <text>#7: x <- x - fx[1]/fx[2]
## debug at <text>#8: fx <- ftn(x)
## debug at <text>#9: iter <- iter + 1
## debug at <text>#10: cat("At iteration", iter, "value of x is:", x, "\n")
## At iteration 2 value of x is: 0.7224658
## debug at <text>#5: (while) (abs(fx[1]) > tol) && (iter < max.iter)
## debug at <text>#6: browser()
## debug at <text>#7: x <- x - fx[1]/fx[2]
## debug at <text>#8: fx <- ftn(x)
## debug at <text>#9: iter <- iter + 1
## debug at <text>#10: cat("At iteration", iter, "value of x is:", x, "\n")
## At iteration 3 value of x is: 1.156032
## debug at <text>#5: (while) (abs(fx[1]) > tol) && (iter < max.iter)
## debug at <text>#6: browser()
## debug at <text>#7: x <- x - fx[1]/fx[2]
## debug at <text>#8: fx <- ftn(x)
## debug at <text>#9: iter <- iter + 1
## debug at <text>#10: cat("At iteration", iter, "value of x is:", x, "\n")
## At iteration 4 value of x is: 1.299908
## debug at <text>#5: (while) (abs(fx[1]) > tol) && (iter < max.iter)
## debug at <text>#6: browser()
## debug at <text>#7: x <- x - fx[1]/fx[2]
## debug at <text>#8: fx <- ftn(x)
## debug at <text>#9: iter <- iter + 1
## debug at <text>#10: cat("At iteration", iter, "value of x is:", x, "\n")
## At iteration 5 value of x is: 1.309759
## debug at <text>#5: (while) (abs(fx[1]) > tol) && (iter < max.iter)
## Algorithm converged
## [1] 1.309759
Latihan 5
Buatlah gambar fungsi pada Latihan 2 dengan menggunakan package ggplot dengan menggunakan fungsi geom_curve!
data.x <- c()
data.y <- c()
for (i in -3:3) {
x = i
y = x^3 - x - 1
data.x <- c(data.x, x)
data.y <- c(data.y, y)
}
df.lat5 <- data.frame(data.x, data.y)
library(ggplot2)## Warning: package 'ggplot2' was built under R version 4.0.5
ggplot (df.lat5)+
geom_curve(aes(x=df.lat5[1,1], y=df.lat5[1,2], xend = df.lat5[4,1], yend = df.lat5[4,2]), curvature = -0.33, color="blue")+
geom_curve(aes(x=df.lat5[4,1], y=df.lat5[4,2], xend = df.lat5[7,1], yend = df.lat5[7,2]), curvature = 0.33, color="blue")+
xlab("x") + ylab("y") +
geom_vline(xintercept = 0, col="grey50")+
geom_hline(yintercept = 0, col="grey50")Praktikum Pertemuan 10 - Integral Numerik
Package
library(pracma)## Warning: package 'pracma' was built under R version 4.0.5
##
## Attaching package: 'pracma'
## The following object is masked _by_ '.GlobalEnv':
##
## secant
library(gaussquad)## Warning: package 'gaussquad' was built under R version 4.0.5
## Loading required package: polynom
##
## Attaching package: 'polynom'
## The following object is masked from 'package:pracma':
##
## integral
## Loading required package: orthopolynom
## Warning: package 'orthopolynom' was built under R version 4.0.5
Metode Integral Numerik
1. Metode Trapezoidal
Metode trapezoidal bisa menggunakan user-defined function dan fungsi trapzfun dari package pracma.
T=(h/2) (f(x0)+2f(x1)+2f(x2)+…+2f(xn−1)+f(xn)) dengan x0=a,xn=b
# User-defined function
trapezoid <- function(ftn, a, b, n = 100) {
h <- (b-a)/n
x.vec <- seq(a, b, by = h)
f.vec <- sapply(x.vec, ftn) # ftn(x.vec)
Trap <- h*(f.vec[1]/2 + sum(f.vec[2:n]) + f.vec[n+1]/2)
return(Trap)
}2. Metode Simpson
S=(h/3) (f(x0)+4f(x1)+2f(x2)+…+4f(xn−1)+f(xn)) dengan x0=a,xn=b
# User-defined function
simpson_n <- function(ftn, a, b, n = 100) {
n <- max(c(2*(n %/% 2), 4))
h <- (b-a)/n
x.vec1 <- seq(a+h, b-h, by = 2*h) # ganjil
x.vec2 <- seq(a+2*h, b-2*h, by = 2*h) # genap
f.vec1 <- sapply(x.vec1, ftn) # ganjil
f.vec2 <- sapply(x.vec2, ftn) # genap
S <- h/3*(ftn(a) + ftn(b) + 4*sum(f.vec1) + 2*sum(f.vec2))
return(S)
}3. Metode Gauss (Adaptive) Quadrature
Metode Gauss (Adaptive) Quadrature bisa menggunakan fungsi integrate dan fungsi legendre.quadrature.rules dari package gaussquad.
4. Metode Integral Monte Carlo
# User-defined function
mc_integral <- function(ftn, a, b,m=1000){
# Membangkitkan x berdistribusi U(a,b)
x <- runif(m,a,b)
# Menghitung rata-rata dari output fungsi
Gx <- ftn(x)
Gx_m <- mean(Gx)
theta.hat <- (b-a)*Gx_m
return(theta.hat)
}Latihan 1
Gunakan metode trapezoidal untuk mengintegralkan fungsi berikut
∫(batas 0,π) sin(x)^2 dx
untuk n=6 dengan menggunakan
Cara Manual
Program di R
Jawaban:
a. Cara Manual
Diketahui
Panjang setiap sub interval adalah sebagai berikut:
Menghitung fungsi f(x) pada setiap xi
Kemudian berdasarkan metode trapezoidal berikut adalah hasil akhirnya Menghitung fungsi f(x) pada setiap xi
Jika kita bandingkan dengan hasil yang didapatkan secara exact adalah sebagai berikut:
b. Program R
# Mendefinisikan fungsi f(x)
f <- function(x){
sin(x)^2
}
# Menggambar kurva f(x)
curve(f,0,pi)
abline(v=seq(0,pi,length.out = 7),col=2,lty=2)# Menghitung integral menggunakan trapezoid
trapezoid(f,0,pi,n = 6)## [1] 1.570796
# Jika menggunakan n lainnya
trapezoid(f,0,pi,n = 1)## [1] 7.066985e-32
# Menghitung integral menggunakan trapzfun
trapzfun(f,0,pi)## $value
## [1] 1.570796
##
## $iter
## [1] 2
##
## $rel.err
## [1] 0
Latihan 2
Gunakan metode Simpson untuk mengintegralkan fungsi berikut
∫(batas 0, 8) (√x) dx
untuk n=4 dengan menggunakan
Cara Manual
Program di R
Jawaban
a. Cara Manual
Panjang setiap sub interval adalah sebagai berikut:
sehinga
Menghitung fungsi untuk setiap titik xi:
Menggantikan semua nilai-nilai diatas ke dalam rumus Simpson
Solusi exact dari integral ini adalah sebagai berikut
b. Program di R
# Mendefinisikan fungsi f(x)
f2 <- function(x){
sqrt(x)
}
# Menggambar kurva f(x)
curve(f2,0,8)
abline(v=seq(0,8,length.out = 5),col=2,lty=2)# Menghitung integral menggunakan metode Simpson
simpson_n(f2,0,8,n = 4)## [1] 14.85549
# Jika menggunakan n lainnya
simpson_n(f2,0,8,n = 15)## [1] 15.04988
Latihan 3
Gunakan metode four-point gaussian quadratur untuk mengintegralkan fungsi berikut
∫(batas 0, 3) exp(−x^2) dx
a. Cara Manual
Rumus Umum
Langkah pengerjaanya adalah sebagai berikut
b. Program di R
# Mendefinisikan fungsi f(x) dan f(t)
f3a <- function(x){
exp(-x^2)
}
f3b <- function(t){
(3/2)*exp((-(3/2*(t+1))^2))
}
# Legendre order 4
Lq = legendre.quadrature.rules(4)[[4]]
xi = Lq$x
wi = Lq$w
# Menghitung integral berdasarkan gaussian quadratur
sum(wi * f3b(xi)) ## [1] 0.8841359
# Menghitung integral dengan fungsi integrate
integrate(f3a,0,3)## 0.8862073 with absolute error < 3.2e-11
Latihan 4
Gunakan metode Monte Carlo untuk mengintegralkan fungsi berikut
∫(batas 0, 1/2) arcsin(√x) dx
dan tentukan berapa banyak sampel yang dibutuhkan agar hasil integral ini sesuai dengan hasil exactnya yaitu 1/4 ! Silahkan kerjakan sebagai latihan. Gunakan user-defined function yang sudah dibuat di atas.
ftn <- function(x) {
asin(sqrt(x))
}
curve(ftn,0,0.5)round(mc_integral(ftn, 0, 0.5,m=1000),4) #banyak sampel 1.000## [1] 0.2499
round(mc_integral(ftn, 0, 0.5,m=100000),4) #banyak sampel 100.000## [1] 0.2501
round(mc_integral(ftn, 0, 0.5,m=1000000),4) #banyak sampel 1.000.000## [1] 0.2499
hasil.exact<- (1/4)
round(hasil.exact,4)## [1] 0.25
#Banyak sampel yang dibutuhkan agar hasil integral sesuai dengan hasil exactnya yaitu 1/4 adalah sebanya 1.000.000 sampelDemikian, Terima Kasih
Satria June Adwendi, IPB University, sjadwendi@apps.ipb.ac.id↩︎