插值问题
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;
}
–本文仅供本人学习笔记之用,如有错误,望请指正。谢谢。