Tugas/Ujian Sains Komputasi: Algoritma dan Perancangan Software - UTS I Soal 1a
SOAL 1a
Soal Utama
Diketahui sebuah fungsi:
Sub Soal Ia i
Gambarlah fungsi tersebut. Hitunglah luas area di bawah kurva pada kuadran pertama untuk nilai dengan metode partisi trapesium.
Jawaban Sub Soal Ia i
Gambar Fungsi Berikut adalah gambar fungsi yang saya buat dengan R.
Sekarang kita akan menghitung luas area pada kuadran I di selang . Saya akan gambarkan selang tersebut dengan garis merah sebagai berikut:
Mengubah Fungsi Untuk memudahkan, kita perlu memodifikasi fungsi ke dalam bentuk yang lebih sederhana.
Karena kita akan menghitung luas area di kuadran I, maka nilai akar yang dihasilkan kita akan ambil hanya yang bernilai positif saja.
Luas Area di Bawah Kurva Ide dasar untuk menghitung luas area di bawah kurva adalah:
Pada partisi trapesium, tinggi yang akan digunakan adalah:
Pada metode trapesium ini, penentuan berapa banyak selang akan mempengaruhi seberapa akurat hasilnya.
Barikut adalah program luastrap yang saya buat di R:
luas_trap = function(x0, # titik awal
xn, # titik akhir
n, # banyak selang
f){ # fungsi y = f(x)
# menghitung delta x
h = (xn - x0) / n
# menghitung f di x0
f0 = f(x0)
# selang pertama
i = 1
k = x0 + i*h
fn = f(k)
integration = (f0+fn)/2
# iterasi untuk selang berikutnya hingga selesai
for(i in 2:n){
f0 = fn
k = x0 + i*h
fn = f(k)
temp = (f0+fn)/2
integration = integration + temp
}
# menghitung hampiran luas
integration = integration * h
return(integration)
}
Sekarang kita akan bandingkan hasilnya untuk berbagai banyak selang.
n banyak selang | Luas aproksimasi |
---|---|
10 | 8.64494288 |
50 | 8.65494631 |
100 | 8.65526330 |
200 | 8.65534260 |
1000 | 8.65536798 |
2500 | 8.65536887 |
5000 | 8.65536899 |
100000 | 8.65536904 |
250000 | 8.65536904 |
500000 | 8.65536904 |
750000 | 8.65536904 |
1000000 | 8.65536904 |
Hasil Perhitungan Luas Trapesium
Terlihat bahwa semakin banyak selangnya, hasilnya konvergen ke suatu nilai yang sama yakni: 8.65536904.
Sub Soal Ia ii
Buatlah algoritma dan flowchart untuk menghitung luas soal sebelumnya dengan metode Monte Carlo. Lakukan analisa hasil yang diperoleh dengan jumlah sampling yang diberikan. Anggaplah perhitungan analitis adalah yang benar sehingga merupakan rujukan nilai.
Jawaban Sub Soal Ia ii
Perhitungan Analitis Kita bisa menghitung secara analitis luas area di bawah kurva dengan cara melakukan integral tentu berikut ini:
Metode Monte Carlo Analogi dari metode ini adalah seperti melempar sekian banyak darts ke suatu target. Luas area di bawah kurva didefinisikan sebagai rasio dari banyaknya darts yang jatuh di bawah kurva dengan total semua darts yang dilempar.
Berikut adalah flowchart-nya:
Hal terpenting dalam metode ini adalah mendefinisikan batas titik untuk di-random. Kenapa?
Kita tidak ingin darts yang kita lempar jatuh ke area sembarang! Kita harus definisikan di mana area bermain darts.
Perhatikan kembali grafik di bawah ini:
Saya akan menjadikan area di dalam kotak warna hijau sebagai area random titik metode Monte Carlo. Jika titik tersebut jatuh ke bawah kurva, maka akan dihitung sebagai on target. Jika jatuh di atasnya, berarti off target.
Kelak luas akan dihitung dengan cara:
Berikut adalah programnya dalam R:
brute_force = function(f,x1,x2,y1,y2,N){
# generating random number
x = runif(N,x1,x2)
y = runif(N,y1,y2)
# pengecekan y <= f(x)
rekap =
data.frame(x,y) %>%
mutate(f_x = f(x),
on_target = ifelse(y <= f_x,1,0))
# hitung rasio on target vs all dots
rasio = sum(rekap$on_target) / N
# hitung luas
luas = (x2-x1)*(y2-y1)*rasio
# perbandingan dengan eksak
eksak = 8.65536904
delta = abs(eksak - luas)
# output plot
plot_sim =
soal +
geom_point(data = rekap,aes(x,y,color = on_target)) +
theme(legend.position = "none") +
labs(subtitle = paste0("Didapat nilai rasio sebesar ",rasio))
# output
output = list(
"Plot Brute Force" = plot_sim,
"Luas area di bawah kurva" = luas,
"Absolute selisih dg solusi eksak" = delta
)
return(output)
}
Saya menghitung error atau selisih solusi numerik dengan solusi eksak dengan cara:
![\Delta = |eksak - numerik|](https://latex.codecogs.com/svg.latex?%5CDelta%20%3D%20%7Ceksak%20-%20numerik%7C “\Delta = | eksak - numerik | ”) |
Sekarang kita akan coba program tersebut untuk N = 100
$`Plot Brute Force`
$`Luas area di bawah kurva`
[1] 8.33463846
$`Absolute selisih dg solusi eksak`
[1] 0.320730584
Sekarang kita akan coba program tersebut untuk N = 200
$`Plot Brute Force`
$`Luas area di bawah kurva`
[1] 8.77330364
$`Absolute selisih dg solusi eksak`
[1] 0.117934598
Sekarang kita akan coba program tersebut untuk N = 500
$`Plot Brute Force`
$`Luas area di bawah kurva`
[1] 8.77330364
$`Absolute selisih dg solusi eksak`
[1] 0.117934598
Masalah pada Brute Force Salah satu prinsip metode ini adalah random bumber generator. Oleh karena itu, bisa jadi pada N besar hasilnya tidak lebih baik pada N kecil dalam sekali run.
Untuk mengatasi hal tersebut kita harus melakukan run berulang-ulang dan menghitung nilai rata-ratanya sebagai output finalnya. Saya akan coba melakukan pengulangan sebanyak 100 kali setiap kali run untuk mendapatkan aproksimasi yang lebih baik.
Berikut adalah modifikasi program sebelumnya yang saya berikan nama luasmc.
luas_mc = function(f,x1,x2,y1,y2,N){
# membuat template vector luas
luas = c()
# lakukan 100 x pengulangan
for(ikanx in 1:100){
# generating random number
x = runif(N,x1,x2)
y = runif(N,y1,y2)
# pengecekan y <= f(x)
rekap =
data.frame(x,y) %>%
rowwise() %>%
mutate(f_x = f(x),
on_target = ifelse(y <= f_x,1,0)) %>%
ungroup()
# hitung rasio on target vs all dots
rasio = sum(rekap$on_target) / N
# hitung luas
luas_temp = (x2-x1)*(y2-y1)*rasio
# memasukkan ke dalam template
luas = c(luas,luas_temp)
}
# menghitung rata-rata luas
return(mean(luas))
}
Kita akan coba hitung untuk nilai N yang berbeda-beda sebagai berikut:
n banyak titik | Luas aproksimasi | Absolute selisih dengan eksak |
---|---|---|
10 | 8.71847049 | 0.063101450 |
50 | 8.68776393 | 0.032394887 |
100 | 8.64609073 | 0.009278305 |
200 | 8.67953895 | 0.024169915 |
500 | 8.68140328 | 0.026034242 |
1000 | 8.63282111 | 0.022547927 |
2500 | 8.65824176 | 0.002872720 |
Hasil Perhitungan Luas Monte Carlo
Kita bisa lihat bahwa ada indikasi semakin tinggi N yag digunakan, nilai absolut selisih aproksiasi dengan eksak relatif semakin kecil.
Namun agar metode ini lebih stabil dan konvergen, kita bisa mengulang komputasi lebih banyak per nilai N dengan konsekuensi runtime yang semakin panjang. Pada soal ini, saya menggunakan 100 x pengulangan.
if you find this article helpful, support this blog by clicking the ads.