我正在尝试创建一个点列表的插值。
我有一些坐标点(ti,xi),其中ti是时间戳,xi是相关值。我想创建一个通过这些点的函数,并允许我找到与位于区间中的泛型t相对应的x值。
我想用三阶插值对它们进行插值。我见过类似catmull-rom插值的方法,但它只适用于点xi等距的情况。
例如这里http://www.mvps.org/directx/articles/catmull/你可以发现时间戳点是等距的,就像这里一样http://www.cs.cmu.edu/约462/projects/assn2/assn2/catmullRom.pdf。
有什么方法可以应用非正则点的三次插值?
参数的间距不相等不是问题,只要它们都是不同的。正如你可能知道的,如果你有四个不同的时间t[i]
,那么存在一个对应值x[i]
的唯一多项式插值,次数最多为3(三次或更低阶)。
插值的计算主要有两种方法,牛顿差分法和拉格朗日插值法。
请记住,仅仅找到多项式并不是重点,而是在区间中的另一个时间对其进行评估,需要考虑一些编程权衡。
如果时间t[i]
是固定的,但值x[i]
重复变化,那么使用拉格朗日方法可能会更好。它基本上构造了四个三次多项式,这些多项式在四个点中的三个点生根,并在剩余点给出归一化值1。一旦有了这四个多项式,对值x[i]
进行插值就只需要取它们的相应线性组合。拉格朗日方法在区间的边缘受到朗格现象的影响。
然而,如果时间t[i]
不断变化,或者您可能正在评估相同t[i], x[i]
数据的多个中间点的插值多项式,那么牛顿除法差可能会更好。如果准确度很重要,可以改变时间t[i]
在分割差分表中出现的顺序,以便将评估定位在离需要该值的中间时间最近的时间附近。
在Web上不难找到牛顿差分法的示例代码,例如C++、Python或Java。
一种方法可能是通过点拟合最小二乘三次方。我发现这里的方法是稳健和实用的,即使只有少量的点。