按指定元素个数积分向量时遇向量长度不匹配问题求助
解决向量分段辛普森积分的问题
我来帮你搞定这个问题!你遇到的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
相关产品推荐
相关产品推荐

