拉格朗日插值法

过 n + 1 个插值节点( x_{0},y_{0}),( x_{1},y_{1}),...,( x_{n},y_{n})的n次拉格朗日插值函数的一般形式为: 

L_{n}(x) = l_{0}(x)y_{0} + l_{1}(x)y_{1} + ...+ l_{n}(x)y_{n}

其中:

l_{i}(x) = (x-x_{0})...(x-x_{i-1})(x-x_{i+1})...(x-x_{n})/ (x_{i}-x_{0})...(x_{i}-x_{i-1})(x_{i}-x_{i+1})...(x_{i}-x_{n})

式中,i = 0,1,2,... ,n。

 

算法程序:

#include <stdio.h>

const int maxn = 50;

double Lagrange(int n, double *x, double *y, double _x){
	double _y = 0.0, t;
	for(int i = 0; i < n; i++){
		t = 1;
		for(int j = 0; j < n; j++)
			if( j != i) t *= (_x - x[j])/(x[i] - x[j]);
		_y += t * y[i];
	}
	return _y;
}

int main(){
	double x[maxn], y[maxn], _x, _y;
	int n;
	printf("请输入插值结点的个数:");
	scanf("%d",&n);
	for(int i = 0; i < n; i++){
		printf("请输入插值结点x%d,y%d:",i,i);
		scanf("%lf %lf",x+i,y+i);
	}
	printf("请输入_x:"); 
	scanf("%lf",&_x);
	printf("P(%lf)的近似值:%lf",_x,Lagrange(n,x,y,_x));
	return 0;
}

测试用例:

2
10 1
20 1.3010
12
精确解:1.0792

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值