r - R:如何获得用于分析积分的插值样条的分段系数?
问题描述
动机
我在数值上评估一个深度嵌套的多重积分。在每个嵌套级别,我得到下一层的积分向量,乘以密度函数向量,得到y
该级别的被积函数向量。这些x
值的间距不均匀。
被积函数是弯曲的,梯形积分不够准确,所以我想做一个允许曲率的积分。辛普森规则不适用,因为横坐标的间距不均匀。所以我建议做一个三次样条插值,然后通过解析计算每个段中三次的积分来计算样条函数的积分。
问题
我一直在研究包中的函数和spline
函数。但是我找不到任何可以告诉我三次多项式系列的系数的东西——每节之间一个。splinefun
splines2
如果有人能指出一个函数来进行样条插值并提供三次系数数组,我将不胜感激。
谢谢你。
解决方案
这是在这里扩展我的新答案的绝佳机会:如何在 R 中保存和加载样条插值函数?使用分段参数化,很容易计算分段积分。
这是一个用于计算的(矢量化)函数:
## a function for integration on a piece
piecewise_int <- function (hi, yi, bi, ci, di) {
yi * hi + bi * hi ^ 2 / 2 + ci * hi ^ 3 / 3 + di * hi ^ 4 / 4
}
下面,我将在那个线程中举一个小例子,展示如何整合样条线。
## the small example in the linked thread
set.seed(0)
xk <- c(0, 1, 2)
yk <- round(runif(3), 2)
f <- splinefun(xk, yk, "natural") ## natural cubic spline
construction_info <- environment(f)$z
## information for integration
int_info <- with(construction_info,
list(h = diff(x), y = y[-n], b = b[-n], c = c[-n], d = d[-n])
)
## cubic spline integration on all pieces
integral <- sum(do.call(piecewise_int, int_info))
#[1] 0.81375
我们还可以执行数值积分来验证这个结果。
integrate(f, 0, 2)
#0.81375 with absolute error < 9e-15
推荐阅读
- php - 如何解决错误 Column not found: 1054 Unknown column '_token' in 'field list' (SQL: update?
- symfony - Symfony 4 和 Nelmio CORS Bundle 的 CORS 错误
- javascript - 如何根据键对数组进行分组并创建以分组数组为值的动态对象?
- java - 处理获取错误
- javascript - 响应式 Javascript 事件
- c# - ASP.NET Core MVC + 实体框架 + GET + 数组
- html - 如何在另一个网格上添加网格?
- javascript - 如何在不限制“点击”、“悬停”和“选择”事件的情况下创建透明图层?
- angular6 - Angular 7 中的反应式表单电子邮件验证
- google-play-console - 在谷歌播放控制台中上传 android apk 时保存错误