用C++语言程序实现拉格朗日插值公式

C++程序实现Lagrange插值公式

      Lagrange插值公式,是属于数值分析方面的内容,关于其应用,在这里就不多说。此处我想用C语言程序来实现n各插值节点插值公式的求解,并求出在某一个插值节点对应的函数值。
   对于Lagrange插值算法的基本思想,在这里我只想略提两点,一个是拉格朗日插值公式,一个是拉格朗日插值基函数的求解。因为这两者才是算法需要解决的最根本的问题。
  (1)采用插值多项式  来近似的逼近拉格朗日差值多项式   即 其中
  (2)上面的插值多项式中的  即为拉格朗日插值多项式的插值基函数的通项 而且  

   (3)理解了上面的思想原理之后,就可以进行程序实现了    ---我觉得再多的理论有时候真的会很吓唬人,但是,通过程序来实现时,不但增加了自己对算法思想的理解,而且还无疑说明了两个问题:a 程序说明一切,再高端的算法,如果程序实现不了,那纯属扯淡  b,动手多实践  才是王道!
    
   (4)下面把我个人所实现的程序供大家参考,如果有什么问题,欢迎指正,在此不胜感激!!!
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;
		temp2=1.0;
		for(m=0;m<n;m++)
		{
			if(m==k)
			{
				continue;
			}
			temp1 *= (x-arrX[m]);	
			temp2 *= (arrX[k]-arrX[m]);
		}

		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;
} 
 <span style="font-size:14px;">(5)下面是进行测试的结果,进行插值的三个节点为(11,0.190809),(12,0.107912),(13,0.224951) ,待测试的是(11.5,Y) 其中的函数          为y=sin(x) </span><span style="font-size:14px;">         测试结果为0.199368或者0.199369</span>



  


你可能感兴趣的:(C++,CSDN博客,数值分析,拉格朗日插值公式)