我正在尝试使用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的代码而不是重新输入函数,但出现相同的错误。有人能帮助我吗?
答案 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
您应该查找二分法的算法,因为您在此处实现的内容显然不是正确的算法。