拉格朗日插值法

因为后期工作中可能使用到插值算法,于是就复习了拉格朗日插值法。下面是拉格朗日函数:

f(x) = \sum_{i=1}^{i=3}y_{i}*\prod_{i\neq j}^{1<=j<=3}\frac{x-x_{j}}{x_{i}-x_{j}};                                               (1)

看了多篇介绍该函数的文章后在这里做个笔记。

是如何得到这个函数的,分为下面几步

三个点(x1,y1),(x2,y2), (x3,y3) 可以确定一条2次多项式的函数。这需要把三个点代入多项式然后解出各个系数。

但是拉格朗的这个解法就不一样了。

第一步构建了一个函数:

 f1(x) = \frac{(x-x2)(x-x3)}{(x1-x2)(x1-x3)}                                          (2)

这个函数在x = x1时,值为1,x=x2时,值为0,x=x3时,值为0.

同理分别构建

f2(x) = \frac{(x-x1)(x-x3)}{(x2-x1)(x2-x3)}                                            (3)

这个函数在x = x2时,值为1,x=x1时,值为0,x=x3时,值为0.

f3(x) = \frac{(x-x1)(x-x2)}{(x3-x1)(x3-x2)},                                           (4)

这个函数在x = x3时,值为1,x=x1时,值为0,x=x2时,值为0.

那么f(x)=y1*f1(x)+y2*f2(x)+y3*f3(x)             (5)这个函数就是过上面三个点的函数。

而(2),(3),(4),可写为fi(x)=\prod_{i\neq j}^{1<=j<=3}\frac{(x-x_{j})}{(x_{i}-x_{j})}         (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的情况,如果有人使用请自行完善。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值