0

我正在尝试f <- x^3 + 2 * x^2 - 7使用bisection方法和函数在 R 中找到以下函数的根repeat。此代码导致错误:

x <- 1.3
tolerance <- 0.000001

repeat {
  f <- x^3 + 2 * x^2 - 7
  if (abs(f) < tolerance) break
  x <- (x^3 + 2 * x^2 - 7)/2
}

Error in if (abs(f) < tolerance) break : 
  missing value where TRUE/FALSE needed

我将初始设置x为 1.3,设置tolerance为 0.000001,并且我知道根位于 1 和 2 之间。我已经尝试将代码的最后一行替换为 f 而不是重新键入函数,但同样的错误出现。有人能帮我吗?

4

2 回答 2

1

基于对该bisection方法的非常简短的阅读,我认为您的调整x不正确。您应该平分 x 的域(输入 f 的 x 值),而不是 f 的范围

您的函数没有执行您想要的操作的原因有很多,但一个主要原因是您甚至没有使用您所拥有的关于 x 的合理值的信息,即 x 的值靠近函数的根。您永远不应该将您的 x 值设置为您试图为其查找根的函数的某个值……没有理由将这两个值关联起来。例如,如果函数的根接近 100,则函数 f(100) 的值将是一个较小的数字。那么可能接近 0 的 f 的值是一个非常高的数字。所以如果你从 f(x=100) 开始,你会将 x 移动到 0 附近,然后运行 ​​f(0) 并得到一个非常大的数字,所以你会将 x 移动到那个大数字,依此类推。您将根据 f 的值来回弹跳,但不会以与查找根有关的方式来回弹跳。

于 2015-07-17T18:53:16.837 回答
0

Let's try this:

x <- 1.3
tolerance <- 0.001

repeat {
  message(x)
  f <- x^3 + 2 * x^2 - 7
  if (abs(f) < tolerance) break
  x <- (x^3 + 2 * x^2 - 7)/2
  }
#1.3
#-0.7115
#-3.1738598729375
#-9.4123720943868
#-331.84120816267
#-18160827.4603406
#-2.99486226359293e+21
#-1.34307592742051e+64
#-1.21135573473788e+192
#Error in if (abs(f) < tolerance) break : 
#  missing value where TRUE/FALSE needed

As you see the x value becomes more and more negative until it's absolute value is too large for double:

x <- -1.21135573473788e+192
x^3 + 2 * x^2 - 7
#[1] NaN

You should look up the algorithm of the bisection method, because what you have implemented here is clearly not the correct algorithm.

于 2015-07-17T18:46:14.043 回答