在这种情况下,如何运行牛顿方法?

时间:2019-01-26 22:14:20

标签: r newtons-method

有一个类似的功能: 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”,没有默认值

我该如何解决? 谢谢您的帮助!

1 个答案:

答案 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

最好!