一般拉格朗日插值多项式:
2.1如图拉格朗日多项式插值结果,预测不准
2.2如图,拟合曲线两端出现巨变,出现龙格现象。
2.3此拉格朗日插值多项式不是数据的好模型,由于被插值区间数据较少,出现龙格现象。
2.4如图,前 4 个数据点的三次多项式估计 1998 年世界石油产量为74.258(桶/天),Runge 现象不会出现。
c++程序源代码:
//拉格朗日多项式插值,龙格现象,高等数值计算
//开发人员:chenshuai 开发日期:2019.11.5 邮箱:chenshuai0614@hrbeu.edu.cn
#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();
}