You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Python版Fibonacci Search Method改写为R时遇参数长度为零错误

问题分析与解决

错误根源

你遇到的argument is of length zero错误,本质是迭代过程中Li变成了空向量,原因有三点:

  1. 斐波那契数列生成函数的循环范围错误:原fibonacci函数的for (i in 2:n+1)运算顺序不符合预期(R中:优先级高于+,实际是(2:n)+1),生成的数列长度超出需求,后续索引逻辑混乱。
  2. 搜索函数的循环范围错误:同样因运算顺序问题,for (i in 2:n+1)会让i取值过大,当i=n时n-i=0,R中向量索引0返回空向量,导致Li为空。
  3. 区间长度引用错误:更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:45:20