将Python版Fibonacci Search Method改写为R时遇参数长度为零错误
问题分析与解决
错误根源
你遇到的argument is of length zero错误,本质是迭代过程中Li变成了空向量,原因有三点:
- 斐波那契数列生成函数的循环范围错误:原
fibonacci函数的for (i in 2:n+1)运算顺序不符合预期(R中:优先级高于+,实际是(2:n)+1),生成的数列长度超出需求,后续索引逻辑混乱。 - 搜索函数的循环范围错误:同样因运算顺序问题,
for (i in 2:n+1)会让i取值过大,当i=n时n-i=0,R中向量索引0返回空向量,导致Li为空。 - 区间长度引用错误:更新
Li时误用了初始区间长度L0,而非当前迭代的区间长度,导致后续计算逻辑偏离斐波那契搜索的规则。
修正后的代码
1. 修正斐波那契数列生成函数
确保生成指定长度的斐波那契数列,避免索引越界:
fibonacci <- function(n) { if (n == 1) return(c(1)) if (n == 2) return(c(1, 1)) fn <- c(1, 1) for (i in 3:n) { fn[i] <- fn[i-1] + fn[i-2] } return(fn) }
2. 修正斐波那契搜索函数
调整循环范围,修正Li的计算逻辑:
fib_search <- function(f, xl, xr, n){ F <- fibonacci(n) current_L <- xr - xl # 用current_L跟踪当前区间长度 R1 <- current_L Li <- (F[n-2]/F[n]) * current_L reduction_ratios <- Li / R1 # 循环范围修正为2到n-1,避免索引为0的情况 for (i in 2:(n-1)) { if (Li > current_L/2) { x1 <- xr - Li x2 <- xl + Li } else { x1 <- xl + Li x2 <- xr - Li } f1 <- f(x1) f2 <- f(x2) if (f1 < f2) { xr <- x2 Li <- (F[n - i]/F[n - i + 1]) * (xr - xl) } else if (f1 > f2) { xl <- x1 Li <- (F[n - i]/F[n - i + 1]) * (xr - xl) } else { xl <- x1 xr <- x2 Li <- (F[n - i]/F[n - i + 1]) * (xr - xl) } current_L <- xr - xl reduction_ratios <- c(reduction_ratios, Li/R1) } # 确定最终最优解 x_opt <- ifelse(f(xl) <= f(xr), xl, xr) f_opt <- f(x_opt) return(list(x_opt = x_opt, f_opt = f_opt, reduction_ratios = reduction_ratios)) }
测试验证
运行你的测试代码:
f <- function(x) { x**5 - 5*x**3 - 20*x + 5 } Fib <- fib_search(f, -2.5, 2.5, 25) # 输出最优解和对应函数值 cat("最优解x:", Fib$x_opt, "\n") cat("最优函数值f(x):", Fib$f_opt, "\n")
此时不会再触发错误,且输出结果符合函数f(x)的最小值特征(理论最小值在x≈2处,f(x)≈-43)。
内容的提问来源于stack exchange,提问作者NrSD
相关产品推荐
相关产品推荐

