Алгоритм Ньютона-Рафсона Root - PullRequest
1 голос
/ 19 апреля 2020

Краткое описание проблемы

Моя цель - создать функцию с именем newton.raphson для реализации алгоритма поиска Ньютона-Рафсона root.

Root Алгоритм поиска: x1 = X0 - f (xo) / f '(x0)

У меня есть 2 аргумента:

  1. iter = количество итераций (значение = 10 ^ 5)
  2. epsilon = для допуска (значение = 10 ^ -10)

Не может зависеть от переменных вне функции

newton.raphson <- function(f, x0, iter=1e5, epsilon=1e-10) {
    x <- x0
    h <- 1e-5
    for (t in 1:iter) {
        drvt <- f((x+h)) - f((x-h)) / (2 * h)
        update <- x - f(x)/ drvt
        if (abs(update) < epsilon) {
            break
        }
        x <- update
    }
    root <- x
    return(root)
}
# Define some function to test
f <- function(x) {
    x^2 - 4 * x - 7
}

Я получаю следующие результаты:

> newton.raphson(f, 0)
[1] 2.000045
> newton.raphson(f, 3)
[1] 5.000024

Но результаты должны быть:

-1.316625
5.316625

1 Ответ

1 голос
/ 19 апреля 2020

Ваш производный расчет немного искажен - вы забыли круглые скобки вокруг разницы между f(x+h) и f(x-h):

drvt <- ( f(x+h) - f(x-h) ) / (2 * h)

Кроме того, вы должны сравнить разницу между старым и новым root приближение к допуску. Чтобы сделать вещи более понятными, переименуйте свою вводящую в заблуждение переменную update во что-то вроде new.x. Затем вы должны проверить if (abs(new.x - x) < epsilon).

...