拉格朗日插值的实现

  • 问题描述:

对于要求选取11个等距插值节点,用拉格朗日插值,计算x为0.5, 4.5处的函数值并将结果与精确值进行比较。

输入:区间长度,n(即n+1个节点),预测点

输出:预测点的近似函数值,精确值,及误差


  • 朗格朗日插值公式:
原理就不再介绍了,下面来看一下公式

  • 朗格朗日插值公式流程图:

  • 程序实现
#include <iostream>
#include <cstdio>

using namespace std;

//产生的节点数
int N;
//保存生成的节点横坐标
double dataX[1000];
//保存生成的节点纵坐标
double dataY[1000];
//生成坐标点
void produceData(double startX,double endX,int N);
//计算误差
double calcDeviation(double accuracy,double calcValue);
//拉格朗日计算插值
double calc(double x);


int main()
{
    double x;
    double startX,endX;
    char ch = 'n';
    cout<<"插值函数为:1/(1+x*x)"<<endl;
    cout<<"请输入插值数:";
    cin>>N;
    cout<<"请输入左右区间范围:";
    cin>>startX;
    cin>>endX;
    produceData(startX,endX,N);
    while(ch != 'y')
    {
        cout<<"请输入要计算的x值:";
        cin>>x;
        double correctValue = 1.0/(1 + x*x);
        double calcValue = calc(x);
        cout<<"精确值为:"<<correctValue<<"  "<<"拉格朗日插值结果为:"<<calcValue<<"  "<<"误差为:"<<calcDeviation(correctValue,calcValue)<<endl;
        cout<<"是否继续?按y退出:";
        cin>>ch;
    }
    return 0;
}
//生成坐标点
void produceData(double startX,double endX,int N)
{
    double x=startX;
    double dX = (endX - startX) /(N-1) ;
    dataX[0] = x;
    dataY[0] = 1.0 / (1 + x*x);
    for(int i=1;i<N;i++)
    {
        x+=dX ;
        dataX[i] = x;
        dataY[i] = 1.0 / (1 + x*x);
    }
}
//计算误差
double calcDeviation(double accuracy,double calcValue)
{
    return (accuracy - calcValue);
}
//拉格朗日计算插值
double calc(double x)
{
  double result=0;
  for(int k=0;k<N;k++)
 {
    double temp = dataY[k];
    for(int j = 0;j < N;j++)
    {
      if(k!=j)
      {
        temp = temp*(x-dataX[j]);
        temp = temp/(dataX[k]-dataX[j]);
      }
    }
    result += temp;
  }
  return result;
} 

  • 运行截图


猜你喜欢

转载自blog.csdn.net/qq_39559641/article/details/81047437