二分法R函数报错求助:参数查找失败及语法问题排查
二分法R函数的错误解析与修正
我来帮你逐一排查代码里的问题,这些都是R语法和逻辑上的常见坑:
主要错误点
elseif语法错误:R里的正确写法是else if(中间必须有空格),你写的elseif会被R识别成未知函数,直接导致语法解析失败。stop未加括号:R的stop()是函数,必须加括号才能调用,直接写stop不会触发报错终止,还会引发语法问题。- 初始条件判断逻辑错误:你原来的条件写反了,二分法要求区间
[a,b]两端的函数值必须异号(一个正一个负),如果同号才应该终止。你原来的条件是当一端负一端正的时候停止,这完全搞反了。 - 循环内的语法错误:
elseif(sign(f(c))==sign(f(a)),a<-c,b<-c)这里用了逗号分隔语句,R里应该用大括号或者分号,而且逻辑不完整——如果sign(f(c))和sign(f(a))不同,应该更新b而不是a。 - 分段执行导致的变量未定义:你运行代码的时候是分段输入的,所以当执行
for (i in 1:n)的时候,n还没被定义(因为函数还没完整定义),这是控制台分段运行的问题,完整定义函数后就不会出现。
修正后的完整代码
bisection <- function(f, a, b, n = 1000, tol = 1e-9) { # 检查区间两端函数值是否同号,同号则终止 if (sign(f(a)) == sign(f(b))) { stop("区间两端函数值必须异号,请重新选择a和b") } for (i in 1:n){ c <- (a + b) / 2 # 找到根或者达到精度要求就返回 if (f(c) == 0 || ((b - a)/2) < tol) { return(c) } # 根据函数值符号更新区间 if (sign(f(c)) == sign(f(a))) { a <- c } else { b <- c } } # 如果循环结束还没返回,说明达到最大迭代次数 warning("已达到最大迭代次数n,未满足精度要求") return((a + b)/2) }
代码验证示例
你可以用一个简单函数测试,比如找f(x) = x^2 - 2的正根:
f <- function(x) x^2 - 2 bisection(f, 1, 2) # 会返回接近sqrt(2)的数值
内容的提问来源于stack exchange,提问作者AnnieFrannie
相关产品推荐
相关产品推荐

