欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

拉格朗日插值的实现

程序员文章站 2022-06-07 09:58:44
...

  • 问题描述:

对于拉格朗日插值的实现要求选取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;
} 

  • 运行截图

拉格朗日插值的实现