拉格朗日插值求n次插值

//拉格朗日插值Lagrange Interpolation
#include<iostream>
#include<vector>
using namespace std;
//get interpolation basis functions
//x is special value
vector<float> getBasisFunc(vector<float>x_var,vector<float>y_var,float x)
{
	vector<float>L;//存储特殊值x时得到的插值基函数L(i)的值
	L.resize(x_var.size());
	float molecules=1;//分子
	float denominator=1;//分母
	int temp=0;//控制i与j不冲突
	for(int j=0;j<x_var.size();j++)
	{
		for(int i=0;i<x_var.size()-1;i++)
		{	
			if(j==i)
				temp=temp+1;
			molecules*=x-x_var[temp+i];
			//cout<<"mole:"<<molecules<<endl;
			//molecules*=x-x_var[temp+1];
			denominator*=x_var[j]-x_var[i+temp];
			//cout<<"deno:"<<denominator<<endl;
			//denominator*=x_var[j]-x_var[temp+1];
			//cout<<"L[0]:"<<molecules/denominator<<endl;
			
		}
		//cout<<"L[0]:"<<molecules/denominator<<endl;
		L[j]=molecules/denominator;
		//cout<<"L["<<j<<"]:"<<L[j]<<endl;
		temp=0;
		molecules=1;
		denominator=1;
	}
	return L;
}
float getSolution(vector<float>L,vector<float>y_var)
{
	cout<<"----------------------------"<<endl;
	for(int n=0;n<L.size();n++)
		cout<<"L"<<n<<":"<<L[n]<<"\t";
	cout<<"\n----------------------------"<<endl;
	float result=0;
	for(int i=0;i<L.size();i++)
	{
		result+=L[i]*y_var[i];
	}
	cout<<"The result of x is :"<<endl;
	return result;
}
int main()
{
	int num_node;
	int i=-1;
	cout<<"Please input the number of nodes:"<<endl;
	cin>>num_node;
	cout<<"-----"<<num_node-1<<" times interpolation----"<<endl;
	vector<float>x_var;//store x(i) values
	vector<float>y_var;//store y(i) values
	x_var.resize(num_node);
	y_var.resize(num_node);
	cout<<"Please input values x,y of nodes"<<endl;
	cout<<"--------------------------------"<<endl;
	while(++i<num_node)
	{
		cout<<"Please input x_var["<<i<<"]:"<<endl;
		cin>>x_var[i];
		cout<<"Please input y_var["<<i<<"]:"<<endl;
		cin>>y_var[i];
	}
	cout<<"x_var[i]"<<"\t"<<"y_var[i]"<<endl;
	for(i=0;i<num_node;i++)
		cout<<x_var[i]<<"\t\t"<<y_var[i]<<endl;
	cout<<"-------------------------------"<<endl;
	float x;
	cout<<"PLease input a value x:"<<endl;
	cin>>x;
	cout<<getSolution(getBasisFunc(x_var,y_var,x),y_var)<<endl;
	cout<<"Hello Boker..."<<endl;
	system("pause");
	return 0;
}

结果如下:
在这里插入图片描述

自己理解写的代码,如有问题还请多多指教。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值