Joseph Edwards
12/3/20
romberg <- function(f,a,b,m,tab = FALSE) {
R <- matrix(NA, nrow = m, ncol = m)
R[1, 1] <- trap(f,a,b,m = 1)
for (j in 2:m) {
R[j,1] <- trap(f,a,b,m = 2^(j-1))
for (k in 2:j) {
k4 <- 4^(k-1)
R[j,k] <- k4 * R[j,k-1] - R[j-1,k-1]
R[j,k] <- R[j,k] / (k4-1)
}
}
if (tab == TRUE)
return (R)
return (R[m,m])
}
romberg(sin, 0, pi, m = 5, tab = TRUE)
[,1] [,2] [,3] [,4] [,5]
[1,] 1.923607e-16 NA NA NA NA
[2,] 1.570796e+00 2.094395 NA NA NA
[3,] 1.896119e+00 2.004560 1.998571 NA NA
[4,] 1.974232e+00 2.000269 1.999983 2.000006 NA
[5,] 1.993570e+00 2.000017 2.000000 2.000000 2
f <- function(x) {sin(x)^2 + log(x)}
romberg(f, 1, 10, m = 3)
[1] 18.48497
romberg(f, 1, 10, m = 5)
[1] 18.52473
romberg(f, 1, 10, m = 10)
[1] 18.52494