我正在尝试使用R编写Romberg算法。我认为这样做应该很接近代码,但是尝试时出现一些错误。
library(pracma)
trapzfun <- function(f,a,b,maxit){
h=(b-a)/maxit
xi=seq(a,length.out=maxit+1)
fi=f(xi)
s=0
for (i in 1:maxit) {
s=s+fi[i]
}
s=(h/2)*(fi[0]+fi[maxit])+h*s
return(s)
}
romberg <- function(f,eps,nmax) {
Q=matrix(0,nmax,nmax)
converged = 0
for (i in 0:(nmax)) {
N=2^i
Q[i,0] = trapzfun(f,maxit)
for (k in 0:(i)) {
n=k+2
Q[i,k+1]=1.0/(4^(n-1)-1)*(4^(n-1)*Q[i,k] - Q[i-1,k])
}
if (i>0) {
if (abs(Q[i,k+1] - Q[i,k]) < eps) {
converged = 1
}
}
}
print(Q[i,k+1],maxit,converged)
return(Q[i,converged)
}
f1 <- function(x) {
x^4
}
a=0.0;b=1.0;maxit=2
romberg(f1,1.0e-12,10)
完成后,应在(i,k + 1)处打印Q矩阵以及间隔数和收敛位置。但是,我收到错误消息:
Error in x[[jj]] :
attempt to select less than one element in get1index <real>
当我显示回溯时,它给出:
3.
`[<-.data.frame`(`*tmp*`,i,value = numeric(0))
2.
`[<-`(`*tmp*`,value = numeric(0))
1.
romberg(f1,1e-12,10)
我不太确定我在哪里出错。有人知道是什么原因造成的吗?