拉格朗日插值算法(附c++源码)

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;
}

猜你喜欢

转载自blog.csdn.net/double_sweet1/article/details/80274261