拉格朗日插值(C++代码附注释)

数值分析/计算方法

仅供参考

#include <iostream>
using namespace std;
//定义拉格朗日插值多项式函数,在输入想预测的自变量后返回预测值
//先定义x数组和y数组,num为想要预测的自变量x值,n为拉格朗日多项式次数、
double Lagrange(double *x,double *y,double num,int n)
{
	if((sizeof(x)/sizeof(x[0]))!=(sizeof(y)/sizeof(y[0])))//数组所占字节数除以每个元素所占字节数等于数组长度
	{
		cout<<"x数组,y数组长度不一致,请重新输入"<<endl;
		return 99999;
	}
	if(sizeof(x)/sizeof(x[0])>n)
	{
		return 99999;
	}//给定n+1个节点最多构造出n次拉格朗日插值基函数
	double *A =new double[n+1];//用指针定义一个数组,存放拉格朗日的n次基本插值多项式
	int k,j;
	for(k=0;k<=n;k++)
	{
		double z=1;
		for(int j=0;j<=n;j++)
		{
			if(j==k){continue;}
			z=z*(num-x[j])/(x[k]-x[j]);
		}
		A[k]=z;
	}//构造拉格朗日插值节点基函数
	double Ln=0;
	for(int k=0;k<=n;k++)
	{
		Ln=Ln+A[k]*y[k];
	}
	return Ln;
}
int main()//该程序未写截断误差,如果要算,用真值减去预测值即可
{
	char ch='n';
	while(ch != 'q')//可以循环多次,根据不同数量节点算预测的值
	{
	int n;
	cout<<"请输入拉格朗日多项式次数(节点数减一)";
	cin>>n;
	double x[100];
	double y[100];
	int i,j;
	cout<<"请依次输入"<<n+1<<"个节点的横纵坐标"<<endl;
	for(i=0;i<n+1;i++)
	{    
		cin>>x[i];
		cin>>y[i];
     }
	double num;
	cout<<"请输入要预测的自变量的横坐标";
	cin>>num;
	cout<<"预测值为:"<<Lagrange(x,y,num,n)<<endl;
	cout<<"是否继续?按q退出,按其他字母继续";
	cin>>ch;
	}
	system("pause");
	return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值