从 R 中的插值样条获取多项式系数
Get polynomial coefficients from interpolation splines in R
我有一组测量值,我想使用三次样条在 R
中进行插值。由于这些只是分段多项式,我随后想对插值函数 代数 进行积分。因此我需要系数。有没有办法获得这些?
调用 splines::interpSpline(foo, bar)$coef
似乎不是 return 实际的多项式系数。
splines::interpSpline(x,y)$coef
的输出给出 x(i) 和 x(i+1) 之间的部分的多项式系数 根据 (x-x(i))[= 的幂37=],不是 x 的幂。这是有道理的,因为所得系数的大小合理并且更容易解释:例如,每个常数项只是 y(i),二次系数给出 x(i) 处的凹度,等等。
比如这个输出
> x <- c(1,3,6,9)
> y <- c(3,1,4,1)
> splines::interpSpline(x,y)$coef
[,1] [,2] [,3] [,4]
[1,] 3 -1.54054054 0.0000000 0.13513514
[2,] 1 0.08108108 0.8108108 -0.16816817
[3,] 4 0.40540541 -0.7027027 0.07807808
[4,] 1 -1.70270270 0.0000000 0.00000000
表示
- 区间[1,3]的多项式为
3 - 1.54054054*(x-1) + 0.13513514*(x-1)^3
- 区间[3,6]的多项式为
1 + 0.08108108*(x-3) + 0.8108108*(x-3)^2 - 0.16816817*(x-3)^3
- 区间[6,9]的多项式为
4 + 0.40540541*(x-6) - 0.7027027*(x-6)^2 + 0.07807808*(x-6)^3
我看不到最后一行有多大用处,它描述了样条曲线在 x=9(数据的右端点)之外的线性延续。
对这些进行积分并不比对 x 的幂积分更困难,但是如果目标是获得连续的反导数,当然需要选择积分常数。多项式形式的选择使得处理积分常数变得更容易。假设我们选择左端点值为0的反导数,剩下的如下:
- 在区间 [1,3] 上反导数是
3*(x-1) - 1.54054054*(x-1)^2/2 + 0.13513514*(x-1)^4/4
- 在区间 [3,6] 上的反导数是
C1 + 1*(x-3) + 0.08108108*(x-3)^2/2 + 0.8108108*(x-3)^3/3 - 0.16816817*(x-3)^4/4
。这里 C1 是前一个反导数在 x=3 处的值。
- 区间 [6,9] 上的反导数是
C2 + 4*(x-6) + 0.40540541*(x-6)^2/2 - 0.7027027*(x-6)^3/3 + 0.07807808*(x-6)^4/4
。这里 C2 是前一个反导数在 x=6 处的值。
我有一组测量值,我想使用三次样条在 R
中进行插值。由于这些只是分段多项式,我随后想对插值函数 代数 进行积分。因此我需要系数。有没有办法获得这些?
调用 splines::interpSpline(foo, bar)$coef
似乎不是 return 实际的多项式系数。
splines::interpSpline(x,y)$coef
的输出给出 x(i) 和 x(i+1) 之间的部分的多项式系数 根据 (x-x(i))[= 的幂37=],不是 x 的幂。这是有道理的,因为所得系数的大小合理并且更容易解释:例如,每个常数项只是 y(i),二次系数给出 x(i) 处的凹度,等等。
比如这个输出
> x <- c(1,3,6,9)
> y <- c(3,1,4,1)
> splines::interpSpline(x,y)$coef
[,1] [,2] [,3] [,4]
[1,] 3 -1.54054054 0.0000000 0.13513514
[2,] 1 0.08108108 0.8108108 -0.16816817
[3,] 4 0.40540541 -0.7027027 0.07807808
[4,] 1 -1.70270270 0.0000000 0.00000000
表示
- 区间[1,3]的多项式为
3 - 1.54054054*(x-1) + 0.13513514*(x-1)^3
- 区间[3,6]的多项式为
1 + 0.08108108*(x-3) + 0.8108108*(x-3)^2 - 0.16816817*(x-3)^3
- 区间[6,9]的多项式为
4 + 0.40540541*(x-6) - 0.7027027*(x-6)^2 + 0.07807808*(x-6)^3
我看不到最后一行有多大用处,它描述了样条曲线在 x=9(数据的右端点)之外的线性延续。
对这些进行积分并不比对 x 的幂积分更困难,但是如果目标是获得连续的反导数,当然需要选择积分常数。多项式形式的选择使得处理积分常数变得更容易。假设我们选择左端点值为0的反导数,剩下的如下:
- 在区间 [1,3] 上反导数是
3*(x-1) - 1.54054054*(x-1)^2/2 + 0.13513514*(x-1)^4/4
- 在区间 [3,6] 上的反导数是
C1 + 1*(x-3) + 0.08108108*(x-3)^2/2 + 0.8108108*(x-3)^3/3 - 0.16816817*(x-3)^4/4
。这里 C1 是前一个反导数在 x=3 处的值。 - 区间 [6,9] 上的反导数是
C2 + 4*(x-6) + 0.40540541*(x-6)^2/2 - 0.7027027*(x-6)^3/3 + 0.07807808*(x-6)^4/4
。这里 C2 是前一个反导数在 x=6 处的值。