因为后期工作中可能使用到插值算法,于是就复习了拉格朗日插值法。下面是拉格朗日函数:
(1)
看了多篇介绍该函数的文章后在这里做个笔记。
是如何得到这个函数的,分为下面几步
三个点(x1,y1),(x2,y2), (x3,y3) 可以确定一条2次多项式的函数。这需要把三个点代入多项式然后解出各个系数。
但是拉格朗的这个解法就不一样了。
第一步构建了一个函数:
(2)
这个函数在x = x1时,值为1,x=x2时,值为0,x=x3时,值为0.
同理分别构建
(3)
这个函数在x = x2时,值为1,x=x1时,值为0,x=x3时,值为0.
(4)
这个函数在x = x3时,值为1,x=x1时,值为0,x=x2时,值为0.
那么 (5)这个函数就是过上面三个点的函数。
而(2),(3),(4),可写为 (6)
把(6)式代入(5)式就得到了(1)式拉格朗日函数。
c代码:
/*
double *x, 给定节点的x值
double *y, 给定节点的y值
int n, 给定节点的数量
int t, 要插入节点x值
返回值是插入y值
*/
double MyLagrange(double *x, double *y, int n, double t)
{
int i = 0;
while ((x[i] < t) && (i < n))
{
i++;
}
int m = i - 4;
double z = 0;
for (int k = m; k < i + 4; k++)
{
double z1 = y[k];
for (int k1 = m; k1 < i + 4; k1++)
{
if (k1 != k)
{
z1 *= ((t - x[k1]) / (x[k] - x[k1]));
}
}
z += z1;
}
return z;
}
这个代码写的不完善,有些情况没考虑的,比如n的值是小于3的情况,如果有人使用请自行完善。