Universitas : UIN Malang

Jurusan : Teknik Informatika

Dosen Pengampu : Prof. Dr. Suhartono, M.Kom

Integrasi adaptif menyediakan pendekatan yang berbeda untuk memperoleh nilai intergral suatu fungsi. Salah satu prinsip utama dari analisis numerik adalah bahwa kita harus berkomitmen pada semacam analisis manusia terhadap suatu masalah sebelum mencoba menyelesaikannya secara algoritmik. Metode analisis numerik umumnya tidak dapat menyelesaikan semua masalah dengan sangat baik. Jadi pengetahuan terhadap masalah yang hendak diselesaikan dapat memungkinkan kita memilih metode numerik yang lebih baik sesuai dengan masalah. Misalnya, dalam konteks integrasi numerik, diskontinuitas pada titik akhir tidak akan cocok untuk solusi Newton-Cotes yang bersifat tertutup.

Tentu saja, akan lebih baik jika kita bisa memprogram komputer untuk mempelajari sesuatu tentang masalah, daripada kita melakukan itu sendiri. Metode adaptif memberikan pendekatan untuk melakukan hal ini. Metode integrasi adaptif memeriksa integral yang mereka operasikan dan mengubah parameter mereka sendiri untuk meningkatkan kualitas integrasi. Algoritma adaptif yang paling sederhana memberikan pendekatan brute force untuk peningkatan kualitas dengan memeriksa error integrasi. Di sisi lain, jika kita tahu error-nya, secara teoritis kita bisa memperbaiki estimasi. Di situlah batas error pada algoritma Newton-Cotes dapat membantu.

Jika kita dapat menemukan sesuatu tentang error tersebut, kita dapat menggunakan informasi itu untuk memperbaiki estimasi pada proses integrasi. Bayangkan kita sedang mengintegrasikan suatu fungsi,
f ( x ) pada batas
[ a , b] . Jika kita menggunakan metode titik tengah (integral Riemann). Kita telah menetahui error maksimum yang mungkin terjadi pada metode tersebut melalui Persamaan (9.9). Dua pengamatan segera menjadi jelas. Terlepas dari apa fungsi
f ( x ) itu, atau turunan keduanya, dua perubahan dapat dilakukan pada integrasi untuk meningkatkan kualitasnya. Pertama, error adalah proporsi terhadap kubik dari panjang domain integrasi. Mengurangi panjang meningkatkan kualitas dan memotong panjang menjadi dua memberikan peningkatan kualitas delapan kali lipat. Kedua, error berbanding terbalik dengan jumlah panel m yang digunakan . Meningkatkan panel mengurangi error dan menggandakan jumlah panel yang disediakan dapat meeningkatkan kualitas empat kali lipat.

Kita dapat merancang algoritma di sekitar pengamatan ini. Pertama, kita dapat memperkirakan nilai integral
Q 1 , menggunakan aturan titik tengah 1-point. Kedua, kita bisa memperkirakannya lagi menggunakan aturan titik tengah 2-point
Q 2 . Karena kita telah menggandakan jumlah titik dalam aturan, kita sekarang tahu bahwa perbedaan maksimum antara
Q 1 dan
Q , nilai sebenarnya dari integral, tidak lebih dari 4 kali lebih besar dari perbedaan maksimum antara
Q 2 dan
Q . Jika
Q 2 − Q kurang dari toleransi tertentu, maka perbedaan antara
Q 1 dan
Q 2 harus kurang dari tiga kali toleransi yang sama.

Kita peeriksa perbedaan antara dua perkiraan. Jika perbedaannya lebih besar dari toleransi, kita mungkin masih berada dalam toleransi, tetapi kita belum pasti. Jadi proses membagi wilayah integrasi menjadi dua, dan menerapkan integrator adaptif untuk kedua bagian, secara terpisah, menjumlahkan hasilnya akan terus dilakukan.

Kita dapat membangun sebuah fungsi integral adaptif menggunakan algoritma tersebut. Sintaks fungsi tersebut adalah sebagai berikut:

riemann_adaptint <- function(f, a, b, m=10, tol=1e-8){
  if(m<1){
    stop("m harus >= 1")
  }else if(m==1){
    m <- 2
    n_width <- (b-a)/m
    x <- seq(a, b-n_width, length.out = m) + n_width/2
    y <- f(x)
    area <- sum(y)*abs(b-a)/m
  }else{
    
    m1 <- 1
    n_width1 <- (b-a)/m1
    x1 <- seq(a, b-n_width1, length.out = m1) + n_width1/2
    y1 <- f(x1)
    q1 <- sum(y1)*abs(b-a)/m1
    
    m2 <- 2
    n_width2 <- (b-a)/m2
    x2 <- seq(a, b-n_width2, length.out = m2) + n_width2/2
    y2 <- f(x2)
    q2 <- sum(y2)*abs(b-a)/m2
    
    if(abs(q1-q2)>3*tol){
      m <- m-1
      tol <- tol/2
      c <- (a+b)/2
      lt <- riemann_adaptint(f, a, c, m=m, tol=tol)
      rt <- riemann_adaptint(f, c, b, m=m, tol=tol) 
      area <- lt+rt
    }else{
      area <- q2
    }
  }
  
  return(area)
}