用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>



  


  • 13
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修罗debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值