摘自《c++和面向对象数值计算》,代码简洁明快,采用模板函数,通用性增强,对其中代码稍加改动
#include<iostream>
#include <vector>
using namespace std;
template<class T>
T lagrange(const vector<T>& vx,const vector<T>& vy,T x);
int main()
{
const int n=4;
vector<float> px(n);
vector<float> py(n);
for (int i=0;i<n;i++)
{
px[i]=1+i/4.0f;
py[i]=exp(px[i]);
}
float x=1.4f;
float approximation=lagrange(px,py,x);
cout<<"插值得到的函数值为:"<<approximation<<endl;
cout<<"函数的真实值为:"<<exp(x)<<endl;
cout<<"误差:"<<(abs(approximation-exp(1.4)))/exp(1.4)*100<<"%"<<endl;
return 0;
}
template<class T>
T lagrange(const vector<T>& vx,const vector<T>& vy,T x)
{
int n=vx.size()-1;
T y=0;
for (int i=0;i<=n;i++)
{
T temp=1;
for (int j=0;j<=n;j++)
if (j!=i)
temp*=(x-vx[j])/(vx[i]-vx[j]);
y+=temp*vy[i];
}
return y;
}