我有一组测量值,我希望在R
中使用三次样条插值。因为这些只是分段多项式,所以我想把插值函数进行代数积分。所以我需要系数。有什么办法可以得到这些吗?
调用splines::interpSpline(foo, bar)$coef
似乎不返回实际的多项式系数。
发布于 2016-01-30 18:41:42
splines::interpSpline(x,y)$coef
的输出给出了x(i)和x(i+1) 之间的多项式系数,用( x - x(i) )的幂表示,而不是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
意味着
3 - 1.54054054*(x-1) + 0.13513514*(x-1)^3
1 + 0.08108108*(x-3) + 0.8108108*(x-3)^2 - 0.16816817*(x-3)^3
4 + 0.40540541*(x-6) - 0.7027027*(x-6)^2 + 0.07807808*(x-6)^3
我看不出最后一行有多大用处,它描述了数据的正确端点x=9之外的样条的线性延续。
要积分这些,并不比积分x的幂更困难,但是,如果目标是得到一个连续的反导数,当然需要选择积分常数。多项式形式的选择使得积分常数的处理变得更加容易。假设我们选择左端点值为0的反导数,其余的如下所示:
3*(x-1) - 1.54054054*(x-1)^2/2 + 0.13513514*(x-1)^4/4
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前一个反导数的值。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前一个反导数的值。https://stackoverflow.com/questions/35094843
复制相似问题