使用R中的二分法找到函数的根

时间:2015-07-17 18:32:29

标签: r bisection

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

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 设置为1.3,x设置为0.000001,我知道根位于1和2之间。我已经尝试替换最后一行f的代码而不是重新输入函数,但出现相同的错误。有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

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

你的功能没有做你想做的事情有很多原因,但主要原因是你甚至没有使用关于x的合理值的信息,即x的值接近函数的根。你永远不应该将x值设置为你试图找到根的函数的某个值......这两个值之间没有必要相关。例如,如果函数的根接近100,则f(100)的函数f的值将是一些低数。那么也许f附近的值是一个非常高的数字。因此,如果你从f(x = 100)开始,你将x移动到0左右,然后运行f(0)并获得一些非常大的数字,这样你就可以将x移动到那个大数字,所以上。你会根据f的价值而蹦蹦跳跳,但不会找到与查找根有关的方式。

答案 1 :(得分:0)

我们试试这个:

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

正如您所看到的,x值变得越来越负,直到它的绝对值对于double来说太大了:

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

您应该查找二分法的算法,因为您在此处实现的内容显然不是正确的算法。