数值计算——拉格朗日插值方法(附代码)

一般拉格朗日插值多项式:

                                              L_{n}(x)=\sum_{k=0}^{n}l_{k}(x)y_{k}=\sum_{k=0}^{n}\prod_{j=0 j\neq k}^{n}\frac{x-x_{j}}{x_{k}-x_{j}}y_{k}

2.1如图拉格朗日多项式插值结果,预测不准

2.2如图,拟合曲线两端出现巨变,出现龙格现象。

2.3此拉格朗日插值多项式不是数据的好模型,由于被插值区间数据较少,出现龙格现象。

2.4如图,前 4 个数据点的三次多项式估计 1998 年世界石油产量为74.258(桶/天),Runge 现象不会出现。

c++程序源代码:

//拉格朗日多项式插值,龙格现象,高等数值计算
//开发人员:chenshuai  开发日期:2019.11.5  邮箱:[email protected] 

#include "pch.h"
#include <iostream>
#include <math.h>
using namespace std;
#define num  3   //拟合多项式次数
#include <vector>
#include <fstream>//文件输入/输出流 
#include <iomanip> //参数化输入/输出 
double Lagrange(double x, vector<double>x_i, vector<double>y_i);//定义拉格朗日插值函数
double Lagrange(double x,vector<double>x_i,vector<double>y_i)
{
	int  n = size(x_i);
	double ln_x = 0, w_i = 1.0;
	for (int k = 0; k <n; k++)
	{
		w_i = 1;
		for (int j = 0; j <n; j++)
		{
			if (k != j)
				w_i = w_i * (x - x_i[j]) / (x_i[k] - x_i[j]);
		}
		ln_x = ln_x + w_i * y_i[k];
	}
	return ln_x;
}
int main()
{
	/*vector<double>x_i = {1994, 1995,1996,1997,1998,1999,2000,2001,2002,2003 };
	vector<double>y_i = { 67.052,68.008,69.803,72.024,73.4,72.063,74.669,74.487,74.065,76.777 };*/
	vector<double>x_i = { 1994, 1995,1996,1997 };
	vector<double>y_i = { 67.052,68.008,69.803,72.024};
	double x=1998,y=0;
	int n = 50;//插值等分数
	y = Lagrange(x, x_i, y_i);
	cout << "1998年的石油产量=" << fixed << setprecision(4) << setw(8) << y << endl;
	ofstream out("插值结果.dat");
	for (int i = 0; i  <= num; i++)
	{
		out << fixed << setprecision(4) << setw(12) << x_i[i] << fixed << setprecision(4) << setw(15) << y_i[i] << endl;
	}
	for (int i = 0; i < n; i++)
	{
		x = 1994 + double(1997 - 1994) / (n - 1)*i;
		cout << x << endl;
		y= Lagrange(x, x_i, y_i);
		out << fixed << setprecision(4) << setw(12) << x<< fixed << setprecision(4) << setw(15) << y<< endl;
	}
	out.close();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章