拉格朗日插值

//lagrange插值
//有n个点,可做出一个n-1次多项式过这n个点
//例:假设有3个点(x0,y0)(x1,y1)(x2,y2)
//则多项式为:y=[(x-x1)(x-x2)/(x0-x1)(x0-x2) ]y0+[(x-x0)(x-x2)/(x1-x0)(x1-x2) ]y1+[(x-x0)(x-x1)/(x2-x0)(x2-x1) ]y2 
//将三个点代入,等式均能成立 ,为了拟合更好,应该适量地多取一些点,但是也不能太多,不然反而会不准确 
//我们以y=1-x^2为例(实际这个等式是不知道的,只是为了验证结果的准确性,在此曲线上取点) 
#include<iostream> 
#define max 100
double x_value,y_value;//全局变量,用于存放需要计算的x点 
using namespace std;

void lagrange(int n,double x[max],double y[max])//n为插值点的个数(可替换) ,x和y中存放着n个对应的插值点 
{
	int i,j;
	double temp1,temp0,mod[max];//mod用于存放单项 
	for(i=0;i<n;i++)//外层循环,用于计算y值 
	{
		temp0=temp1=1;//temp0为分子,temp1为分母 
		for(j=0;j<n;j++)//内层循环,用于控制单项值 
		{
			if(i==j)
				continue;
			temp0=temp0*(x_value-x[j]);
			temp1=temp1*(x[i]-x[j]); 
		}
		mod[i]=(temp0/temp1)*y[i];
		y_value=y_value+mod[i];
	}
	cout<<"插值结果为:"<<y_value<<endl; 
	  
}

double count(double x)//这个函数用于已知函数的情况下计算点的值,如果只知道点的值可以不用 
{
	double y;
	y=1-x*x;
	return y;
	
} 
int main()
{
	double x[max]={1,1.2,1.4,1.6,1.8,2,2.2,2.4,2.6,2.8,3,3.2},y[max];
	int n=12;
	//如果自己输入点,就用以下代码,这里为了方便,就提前设好点了 
	//cout<<"输入所选点的数量";
	//cin>>n; 
	//for(int i=0;i<n;i++);
	//   cin>>x[i];  
	cout<<"输入x的值:";
	cin>>x_value;
	for(int i=0;i<n;i++)
			y[i]=count(x[i]);
	lagrange(n,x,y);
	return 0;
		
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值