使用C++编写拉格朗日3次插值法

本文原文发表于本人博客 哔哔哔哔-使用C++编写拉格朗日3次插值法

拉格朗日插值法是由Joseph-Louis Lagrange提出的插值的多项式,是估算函数数值的重要工具之一

前言

接上文使用C++计算3次牛顿插值法

GitHub地址

https://github.com/gst-be/lagrange_polynomial

代码

#include 
using namespace std;
int main()
{
	double x[4],y[4],t;
	for(int i=0;i<=3;i++)
	{
		cout<<"input x"<<i<<"=";
		cin>>x[i];
		cout<<"input y"<<i<<"=";
		cin>>y[i];
		
	}
	cout<<"input x=";
	cin>>t;
	//输入x0-x3,y0-y3,x


	double l1[4],l2[4];             //定义基函数分母和分子
	for(int i=0;i<=3;i++)
	{
		l1[i]=l2[i]=1;          //初始化分母,分子为1
	}
	
	double l[4];
	for(int i=0;i<=3;i++)
	{
		for(int j=0;j<=3;j++)
		{
			if(i==j)
			continue;
			l1[i]*=t-x[j];     //计算基函数分子
			l2[i]*=x[i]-x[j];  //计算基函数分母
		}
		l[i]=l1[i]/l2[i];
	}
	
	double p=0;
	for(int i=0;i<=3;i++)
	{
		p+=y[i]*l[i];              //计算P(x)
	}
	
	cout<<"P("<<t<<")="<<p<<endl;
	
	return 0;
}

解析

基函数分子,分母的计算

为方便处理,笔者在此处将分子和分母分开计算,分别命名为数组l1和数组l2
这里使用for循环来处理分子分母的计算
遇到i=j的情况时使用if-continue跳过该轮循环,如下所示:

if(i==j)
continue;

为了使l1l2计算时的循环完整,需将l1,l2初始化为1

for(int i=0;i<=3;i++)
	{
		l1[i]=l2[i]=1;
	}

本文已发表于哔哔哔哔(bebebe.be)

你可能感兴趣的:(数学,cpp,c++,开发语言)