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

按指定元素个数积分向量时遇向量长度不匹配问题求助

解决向量分段辛普森积分的问题

我来帮你搞定这个问题!你遇到的unequal vector lengths报错,根源很明确:你在调用sintegral的时候,把整个向量的x坐标序列(1:length(v))和单个元素v[i]传进去了,两者长度当然不匹配~

下面我给你修正后的代码,优先用你提到的Bolstad2包的辛普森积分,同时也提供替代方案:

方案一:使用Bolstad2包的sintegral

核心思路是把向量v按每s个元素拆分成子段,给每个子段匹配对应的x坐标(这里假设x是从1开始的连续整数,你可以根据实际需求调整x的取值),再分别做积分:

library(Bolstad2)

myfunc <- function(s, v) {
  # 生成每个子段的起始索引,最后补一个超出长度的索引用来确定结束位置
  group_starts <- seq(1, length(v), by = s)
  group_starts <- c(group_starts, length(v) + 1)
  
  # 遍历每个子段计算积分
  sapply(seq_along(group_starts)[-length(group_starts)], function(idx) {
    start_idx <- group_starts[idx]
    end_idx <- group_starts[idx + 1] - 1
    # 子段对应的x和y值
    x_sub <- start_idx:end_idx
    y_sub <- v[start_idx:end_idx]
    # 调用辛普森积分并返回结果
    Bolstad2::sintegral(x = x_sub, y = y_sub)$int
  })
}

# 测试用例
v <- c(1,2,3,4,5,6,7,8,9,10)
s <- 2
p <- myfunc(s, v)
print(p)

运行这段代码后,你会得到每2个元素分段的积分结果,比如第一个子段[1,2]的积分是1.5,第二个[3,4]是3.5,以此类推。

方案二:使用pracma包的simpson函数(替代方案)

如果你不想依赖Bolstad2,pracma包的simpson函数也是常用的辛普森积分工具,用法类似:

library(pracma)

myfunc_pracma <- function(s, v) {
  group_starts <- seq(1, length(v), by = s)
  group_starts <- c(group_starts, length(v) + 1)
  
  sapply(seq_along(group_starts)[-length(group_starts)], function(idx) {
    start_idx <- group_starts[idx]
    end_idx <- group_starts[idx + 1] - 1
    x_sub <- start_idx:end_idx
    y_sub <- v[start_idx:end_idx]
    pracma::simpson(y = y_sub, x = x_sub)
  })
}

# 测试
p2 <- myfunc_pracma(s, v)
print(p2)

小提示

辛普森法理论上要求区间数为偶数(也就是子段的元素个数为奇数),如果你的s是偶数,部分子段可能不满足这个条件。不过Bolstad2和pracma的函数都会自动处理这种情况(比如对最后一个区间用梯形法),不用太担心。

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:37:51