//拉格朗日插值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;
}
结果如下:
自己理解写的代码,如有问题还请多多指教。