拉格朗日插值代码示例
大家好,这是我的第一篇博客。
我最近有一个在GitHub上建立一个开源C++函数库的计划,写这篇博文也算是给自己做了一个推广。感兴趣的朋友可以点击关注我,也可以到GitHub上持续关注我最近更新的代码。
在这里放一下我的GitHub链接:我的GitHub链接https://github.com/TYduoduo
核心函数代码如下,详细的代码我在GitHub上开源了。(https://github.com/TYduoduo/Algorithmic-Collection-Cpp/blob/master/拉格朗日插值原型函数)
函数功能:
为给定结点的函数值,用拉格朗日法进行插值。
在给定的n个节点中自动选择8个结点进行插值,且使指定的插值点t位于它们的中间。
本文参考了清华大学出版社的《常用函数算法集(C++描述)》
double lagrange(double x[], double y[], int n, double t)
{
int i, j, k, m;
double z, s;
z = 0.0;
if (n < 1) return(z);
if (n == 1) {
z = y[0];
return(z);
}
if (n == 2)
{
z = (y[0] * (t - x[1] - y[1] * (t - x[0])) / (x[0] - x[1]));
return(z);
}
i = 0;
while ((x[i] < t) && (i < n)) i++; //寻找插值点t的位置
k = i - 4; //取插值区间左端点
if (k < 0) k = 0;
m = i + 3; //取插值区间右端点
if (m > n - 1) m = n - 1;
for (i = k; i < m; i++)
{
s = 1.0;
for (j = k; j <= m; j++)
if (j != i) s = s * (t - x[j]) / (x[i] - x[j]);
z = z + s * y[i];
}
return(z);
}