基础算法学习(03)-插值计算(拉格朗日插值法和牛顿插值法)

插值问题

1、算法作用

插值问题是一种软件开发中较为常见的问题,比如已知三个电流输出时采集到的三个采样电流,用软件的方法尽量精确地求出第四个输出时的采样电流。本质上,就是多项式的求解。多项式求解有很多数学上的方法,这里主要研究的是两种数学上的经典算法得出的计算机算法-拉格朗日插值法和牛顿插值法。最近工作中用到了,记下来作为笔记。

2、C++实现

2.1.拉格朗日插值法

关于数学原理,维基百科讲得很不错
https://zh.wikipedia.org/wiki/%E6%8B%89%E6%A0%BC%E6%9C%97%E6%97%A5%E6%8F%92%E5%80%BC%E6%B3%95
简单来说就是把一种拆分多项式的方法,很便于计算机实现。
C++代码实现如下

//N是已知的,X是已知所有点的横座标数组,Y是纵座标数组,x是待求点的横座标,返回值为待求点的纵座标
double Lagrange(int N,double &X,double &Y,double x)
{  
  double result=0;  
  for(int i=0;i<N;i++)
  {  
    double temp=Y[i];  
    {  
    if(i!=j)
    {  
        temp = temp*(x-X[j]);  
        temp = temp/(X[i]-X[j]);  
    }  
    }  
    result += temp;  
  }  
 return result;  
}

2.2.牛顿插值算法

C++实现 4个值求第5个值

double Newton4(double F1, double F2, double F3, double F4, double x1, double x2,double x3, double x4, double t )
{
    double f;
    f = F1 * (t - x2) * (t - x3) * (t - x4) / ((x1 - x2) * (x1 - x3) * (x1 - x4));
    f = f + F2 * (t - x1) * (t - x3) * (t - x4) / ((x2 - x1) * (x2 - x3) * (x2 - x4));
    f = f + F3 * (t - x1) * (t - x2) * (t - x4) / ((x3 - x1) * (x3 - x2) * (x3 - x4));
    f = f + F4 * (t - x1) * (t - x2) * (t - x3) / ((x4 - x1) * (x4 - x2) * (x4 - x3));

    return f;
}

–本文仅供本人学习笔记之用,如有错误,望请指正。谢谢。

点赞