一维线性外推
线性外推法使用由 2 个已知点形成的线。所以例如假设这个向量:
x 轴是向量/数组索引,y 轴是单元格的值。所以我取了 2 个最后已知的点(蓝色)并从中形成一条线(绿色)。它与下一个数组位置相交的地方是您的外推值(红色)。所以在 C++ 中它看起来像这样:
float a[8]={ 1.0,2.0,4.0,8.0,10.0,7.0,0.0,0.0 }; // your vector (last two numbers are unknown)
a[6]=a[4]+((a[5]-a[4])*2.0); // =4.0
a[7]=a[4]+((a[5]-a[4])*3.0); // =1.0
一维三次外推
它类似于 #1,但不是直线,而是使用参数多项式形式的 4 个控制点三次曲线。大多数三次曲线都是这样构造的,如果参数t=0,您将获得第二个控制点,如果t=1,您将获得第三个控制点。如果您使用t=<0,1>,那么您将在它们之间顺利迭代。我们需要在最后一个控制点之后扩大范围,所以t>=3 与步骤1 为下一个点位置。所以:
float a[8]={ 1.0,2.0,4.0,8.0,10.0,7.0,0.0,0.0 }; // your vector (last two numbers are unknown)
float a0,a1,a2,a3; // your cubic curve polynomial coefficients (computed from 4 control points a[2],a[3],a[4],a[5])
float t; // curve parameter
// here compute the a0,a1,a2,a3
t=3.0; a[6]=a0+a1*t+a2*t*t+a3*t*t*t*t;
t=4.0; a[7]=a0+a1*t+a2*t*t+a3*t*t*t*t;
现在如何获得a0,a1,a2,a3 系数?哟可以使用任何插值多项式。我最喜欢的是这个(bullet #3):
就是这样(希望我在用 a[2+i] 替换 pi 时没有出现一些愚蠢的索引错误):
float d1,d2;
d1=0.5*(a[4]-a[2]);
d2=0.5*(a[5]-a[3]);
a0=a[3];
a1=d1;
a2=(3.0*(a[4]-a[3]))-(2.0*d1)-d2;
a3=d1+d2+(2.0*(-a[4]+a[3]));