R:如何获得插值样条的分段系数以进行分析积分?

时间:2018-07-27 01:46:03

标签: r interpolation spline integral polynomials

动机

我正在数值上评估一个深度嵌套的多重积分。在每个嵌套级别,我都在下面的级别得到一个积分向量,将其与密度函数的向量相乘,以得到该级别上的整数y的向量。 x值间隔不均匀。

被积物是弯曲的,梯形积分不够准确,所以我想做一个允许曲率的积分。辛普森规则不适用,因为横坐标没有均匀分布。因此,我建议进行三次样条插值,然后通过分析计算每个段中三次的积分来计算样条函数的积分。

问题

我一直在研究splinesplinefun之类的功能以及splines2软件包中的功能。但是我找不到任何能告诉我三次多项式系列的系数-结之间的每个线段的系数。

如果有人能将我指向一个函数进行样条插值并使立方系数数组可用,我将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:4)

这是一个很好的机会,可以在这里扩展我的新答案:How to save and load spline interpolation functions in R?有了分段参数化,可以很容易地计算分段积分。

enter image description here

这里是一个(向量化的)函数,用于其计算:

## 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