插值法:

直线公式:

(y-y0)/(x-x0)=(y1-y0)/(x1-x0)
解方程得:y=y0+(x-x0)*(y1-y0)/(x1-x0)
拉格朗日插值法:
对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式;
用途:1 根据不同观测点的一组值拟合出公式
2 进行插值运算。

假设有某个二次多项式函数f,已知它在三个点上的取值为:

  • f(4)=10
  • f(5)=5.25
  • f(6)=1

要求f(18)的值。

首先写出每个拉格朗日基本多项式:

\ell _{0}(x)={\frac  {(x-5)(x-6)}{(4-5)(4-6)}}
\ell _{1}(x)={\frac  {(x-4)(x-6)}{(5-4)(5-6)}}
\ell _{2}(x)={\frac  {(x-4)(x-5)}{(6-4)(6-5)}}

然后应用拉格朗日插值法,就可以得到p的表达式(p为函数f的插值函数):

p(x)=f(4)\ell _{0}(x)+f(5)\ell _{1}(x)+f(6)\ell _{2}(x)
.\,\,\,\,\,\,\,\,\,\,=10\cdot {\frac  {(x-5)(x-6)}{(4-5)(4-6)}}+5.25\cdot {\frac  {(x-4)(x-6)}{(5-4)(5-6)}}+1\cdot {\frac  {(x-4)(x-5)}{(6-4)(6-5)}}
.\,\,\,\,\,\,\,\,\,\,={\frac  {1}{4}}(x^{2}-28x+136)

此时代入数值\ 18就可以求出所需之值:\ f(18)=p(18)=-11

C算法: 

引用 :实验二:Lagrange拉格朗日插值法之C语言代码 - Chen_dSir的博客 - CSDN博客  https://blog.csdn.net/Chen_dSir/article/details/70236987

ypedef struct stPoint
{
  double x;
  double y;
} Point
#define Dots_N 5

Point Dots[Dots_N];
/*n 为插入的点的个数,tmp为拉格朗日基函数,x为要插入的点,lagrange为插值运算后返回的值。*/
double f32Lagrange_LineSert(Point *points,u8 n,double x)
{
  u8 i ,j;
  double tmp,lagrange=0;//这个x是你将要计算的f(x)插值点,tmp是拉格朗日基函数,larange是根据拉格朗日函数得出f(x)的值
  for(i=0;i<=n;i++)
  {
    for(j=0,tmp=1;j<=n;j++)
    {
      if(j!=i) //去掉xi与xj相等的情况,范德蒙行列式下标就是j!=k,相等分母为0就没意义了
      {
        tmp=tmp*(x-points[j].x)/(points[i].x-points[j].x);//这个就是套公式tmp是拉格朗日基函数
      }
    }
    lagrange=lagrange+tmp*points[i].y; //最后计算基函数*y,全部加起来,就是该x项的拉格朗日函数了
  }
  return lagrange;
}

posted on 2018-12-25 14:24  杰瑞鼠  阅读(1582)  评论(0编辑  收藏  举报