Lagrange插值多项式算法

标题:Lagrange插值多项式算法

一.公式介绍

Lagrange多项式公式:
L[n](u) =  累加符号 l[i](u) * y[i] {i = 0,1,...,n}

Lagrange因子公式 :
 l[i](u) = 累乘符号(u-x[j])/(x[i]-x[j]) {i != j , j = 0,1...,n}

L[n](u)称为f(u)的n次多项式插值的Lagrange公式
l[i](u)称为n次多项式插值问题的基函数(Lagrange因子)

二.构造插值函数的目的以及优缺点

目的:由已知一些点的坐标,构造出一个符合这些坐标的函数,并能推测出未知坐标
的函数值。
优点:公式的形式对称,结构紧凑,容易编程,便于理论分析和许多数值计算公式的
推导。
缺点:没有承袭性,增加新的节点时,所有的Lagrange因子必须重新计算,造成计算
的浪费。

注:至少需要n+1个坐标点才能构造出L[n](x),或者说L[n](x)至少有n+1个根。

三.算法流程
Lagrange插值多项式算法_第1张图片
Lagrange插值多项式算法_第2张图片
注意:下述代码实现中的 i 与 j 互换

四.Lagrange插值多项式算法c++代码实现

#include
#include
#include 
using namespace std;

template <typename T>
void input(T n){//输入每个点的坐标 
	double x[n];
	double y[n];
	for(int i = 0 ; i < n ; i ++){
		cout<<"请输入第"<<i+1<<"个点的坐标:"; 
		cin>>x[i]>>y[i];
	}
	
	T u;
	cout<<"请输入插值点横坐标:"; 
	cin>>u;//输入插值点横坐标 
	
	double v = 0;//Lagrange是一个叠加的过程,所以令横坐标所对应的函数初始值(纵坐标)为 0 
	double l[n];//n-1次多项式插值问题的基函数(Lagrange因子)
	fill(l, l + n, 1);//Lagrange因子是叠乘的过程,所有的因子赋值为1
	for(int i = 0 ; i < n ; i ++){
			for(int j = 0 ; j < n ; j ++){
				if(i != j){
					l[i] *= (u - x[j])/(x[i] - x[j]);
				}
			}
		v = v + l[i]*y[i];//求出l[k]的同时,直接叠加,不必再开新的循环	 
	}
	
	cout<<"通过插值公式求得的u所对应的函数值V为:"<<v;
}

//通过已知的坐标点,构造Lagrange插值函数,计算插值点 u 的函数坐标值 v
int main(){ 
	int n;
	//n 个坐标点(根)确定一个 f(x) 的 n-1 次多项式插值的Lagrange公式 
	cout<<"请输入坐标点的个数:";
	cin>>n;
	
	input(n);
	
	return 0;
} 

你可能感兴趣的:(算法,c++)