一.公式介绍
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插值多项式算法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;
}