C++程序实现Lagrange插值公式
Lagrange插值公式,是属于数值分析方面的内容。此处我想用C++语言程序来实现n各插值节点插值公式的求解,并求出在某一个插值节点对应的函数值。
对于Lagrange插值算法的基本思想,在这里我只想略提两点,一个是拉格朗日插值公式,一个是拉格朗日插值基函数的求解。因为这两者才是算法需要解决的最根本的问题。
(1)采用插值多项式
来近似的逼近拉格朗日差值多项式
即
其中
(2)上面的插值多项式中的
即为拉格朗日插值多项式的插值基函数的通项 而且
个人建议,在了解了拉格朗日插值公式后,最好先找一个简单的实例题自己在本子上写写步骤练练手,这样在写算法代码时会更上手一些。
源码如下:
#include<iostream>
using namespace std;
//预先定义插值节点的个数为1000个,根据控制台输入的个数num从而确定插值节点的个数
const int N = 1000;
//arrX[N],arrY[N]分别存放的是插值节点(Xi,Yi)中的Xi,Yi,参数n为插值节点的个数,而参数x为待求解的插值节点的X值
//函数返回值为求解出来的插值节点x对应的y值
//注意整个过程涉及的变量,除了循环变量为int外,其他均为float
float Lagrange(float arrX[],float arrY[],int n,float x){
float yResult=0.0;
//LValue[N]存放的是每次求解的插值基函数的通项
float LValue[N];
//循环变量k,m
int k,m;
//插值基函数中的上下累乘temp1,temp2
float temp1,temp2;
for(k=0; k<n; k++)
{
temp1 = 1.0;//分子和分母不能为0,所以初始化为1.0
temp2 = 1.0;
for(m=0; m<n; m++)
{
if(m==k)
{
continue;
}
temp1 *=(x-arrX[m]);//插值公式的分子部分。(x-x1)(x-x2)
temp2 *=(arrX[k]-arrX[m]);//插值公式的分母部分(x0-x1)(x1-x2)
}
LValue[k] = temp1/temp2;//求出的一个分式
}
for(int i=0; i<n; i++)
{
yResult += arrY[i]*LValue[i];//求出和
}
return yResult;
}
int main()
{
float arrX[N],arrY[N];
int num;
cout<<"输入插值节点的个数(小于"<<N<<"个):";
cin>>num;
cout<<"\n--接下来输入这些插值节点(先输入X再输入对应的Y)--\n";
for(int i=0; i<num; i++)
{
cout<<"第"<<i+1<<"个节点的X值:";
cin>>arrX[i];
cout<<"第"<<i+1<<"个节点的Y值:";
cin>>arrY[i];
}
float X;
cout<<"\n--请输入待求解的插值节点的X值--\n";
cin>>X;
float Res = Lagrange(arrX,arrY,num,X);
cout<<"\n--插值结果为:"<<Res<<endl;
return 0;
}