首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >牛顿-拉斐逊寻根算法

牛顿-拉斐逊寻根算法
EN

Stack Overflow用户
提问于 2020-04-19 19:02:26
回答 1查看 277关注 0票数 1

问题摘要

我的目标是创建一个名为newton.raphson的函数来实现牛顿-拉斐逊寻根算法。

寻根算法: x1 = X0 - f(xo)/f'(x0)

我有两个论点:

  1. iter =迭代次数(值= 10^5)
  2. epsilon =公差(值= 10^-10)

)

不能依赖于函数之外的变量

代码语言:javascript
复制
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)
}
代码语言:javascript
复制
# Define some function to test
f <- function(x) {
    x^2 - 4 * x - 7
}

我得到以下结果:

代码语言:javascript
复制
> newton.raphson(f, 0)
[1] 2.000045
> newton.raphson(f, 3)
[1] 5.000024

但结果应该是:

代码语言:javascript
复制
-1.316625
5.316625
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 19:47:52

你的导数计算有点不正确--你忘记了f(x+h)f(x-h)之间的差异。

代码语言:javascript
复制
drvt <- ( f(x+h) - f(x-h) ) / (2 * h)

此外,您应该比较新旧根近似与公差之间的差异。为了使事情更清楚,将误导的update变量重命名为类似于new.x的变量。然后,您应该检查if (abs(new.x - x) < epsilon)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61310003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档