有一个类似的功能: y =(e ^ x-2)^ n
x是一个未知数,n = 2,3,4,...,8 现在,我想使用NR方法查找此函数的根(初始x为0)。
如果n是一个固定值,我知道如何编写NR方法,这是我的原始NR代码:
NR <- function(f, x0, tol = 1e-5, ite = 1000){
require(numDeriv) #call the package for computing dx
k <- ite
for (i in 1:ite){
#calculate dx
dx <- genD(func = f, x = x0)$D[1]
#get the x1
x1 <- x0 - (f(x0) / dx)
k[i] <- x1
if(abs(x1 - x0) < tol){
root <- x1
re <- list('root approximation' = root, 'iteration' = length(k))
return(re)
}
x0 <- x1
}
print('Outside the upper iteration')
}
现在我重写我的函数:
f <- function(x, n){
(exp(x) - 2) ^ n
}
如果我想为每个n输出每个根,我想我应该在循环“ for(i in 1:ite)”之前添加另一个循环 所以我重写了NR功能代码:
NR <- function(f, x0, tol = 1e-5, ite = 1000){
require(numDeriv) #call the package for computing dx
k <- ite
for(n in 2:8){
for (i in 1:ite){
#calculate dx
dx <- genD(func = f, x = x0)$D[1]
#get the x1
x1 <- x0 - (f(x0, n) / dx)
k[i] <- x1
if(abs(x1 - x0) < tol){
root <- x1
re <- list('root approximation' = root, 'iteration' = length(k))
return(re)
}
x0 <- x1
}
print('Outside the upper iteration')
}
}
但是当我运行NR(f,0)时,R向我显示错误是: func(x,...)中的错误:缺少参数“ n”,没有默认值
我该如何解决? 谢谢您的帮助!
答案 0 :(得分:0)
希望您对我的回答有所帮助:
如果您尝试使用?genD
,则会阅读以下内容:
用法
genD(func, x, method="Richardson", method.args=list(), ...) ## Default S3 method: genD(func, x, method="Richardson", method.args=list(), ...) Arguments
func一个函数,第一个(向量)参数用作 参数向量。 x func的参数向量第一个参数。
在R文档的底部,此示例:
示例
func <- function(x){c(x[1], x[1], x[2]^2)} z <- genD(func, c(2,2,5))
因此,代码的问题是您需要将向量用作f的参数:
f <- function(c){ (exp(c[1]) - 2) ^ c[2] }
NR <- function(f, x0, tol = 1e-5, ite = 1000){ require(numDeriv)
#call the package for computing dx k <- ite for(n in 2:8){
for (i in 1:ite){
#calculate dx
dx <- genD(func = f, x = c(x0,n))$D[1]
#get the x1
x1 <- x0 - (f(c(x0,n)) / dx)
k[i] <- x1
if(abs(x1 - x0) < tol){
root <- x1
re <- list('root approximation' = root, 'iteration' = length(k))
return(re)
}
x0 <- x1
}
print('Outside the upper iteration') } }
NR(f,0)
如果我运行我的输出是:
$`root approximation` [1] 0.6931375
$iteration [1] 15
最好!