Как я могу запустить метод моего Ньютона в этом случае? - PullRequest
0 голосов
/ 27 января 2019

Есть такая функция: у = (е ^ х - 2) ^ н

x неизвестен, для n = 2,3,4, ..., 8 Теперь я хочу использовать метод NR, чтобы найти корень этой функции (начальный x равен 0).

Я знаю, как написать метод NR, если n является фиксированным значением, вот мой исходный код 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 голосов
/ 27 января 2019

Надеюсь, вы найдете мой ответ полезным: Если вы попробуете ?genD, вы прочтете это:

Использование

genD(func, x, method="Richardson",
               method.args=list(), ...)
## Default S3 method: genD(func, x, method="Richardson",
  method.args=list(), ...) Arguments

func функция, для которой первый (векторный) аргумент используется как вектор параметров. x Параметр вектора - первый аргумент функции.

А в нижней части документации R этот пример:

Примеры * +1014 *

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

Best!

...