拉格朗日插值

//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
#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 {
temp0=temp1=1;//temp0为分子,temp1为分母
for(j=0;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<<“插值结果为:”<

}

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 // cin>>x[i];
cout<<“输入x的值:”;
cin>>x_value;
for(int i=0;i y[i]=count(x[i]);
lagrange(n,x,y);
return 0;

}

你可能感兴趣的:(插值,插值,计算方法)