首页 > 其他 > 详细

浅析拉格朗日插值

时间:2019-07-15 12:36:38      阅读:94      评论:0      收藏:0      [点我收藏+]

前言

拉格朗日插值,是一个根据\(n\)个点确定唯一的\(n-1\)次多项式,然后\(O(n^2)\)单点求值的算法。

它听起来好像很玄学、很高级,实际上很容易理解,毕竟我这种蒟蒻都看得懂

拉格朗日插值

设多项式为\(f(x)\),已知\(n\)个点,坐标为\((x_i,y_i)\)。现在要求\(f(k)\)的值。

下面我们直接给出拉格朗日插值的基本公式:

\[f(k)=\sum_{i=1}^ny_i\prod_{i≠j}{\frac{k-x_j}{x_i-x_j}}\]

证明如下:

  1. 它一看就是一个\(n-1\)次多项式。
  2. \(k=x_p\)时:若\(p≠i\),则存在某一时刻\(p=j\),那么这时\(k-x_j\)值就为\(0\),此时的\(y_i\prod_{i≠j}{\frac{k-x_j}{x_i-x_j}}=0\);若\(p=i\),则\(k-x_j=x_i-x_j?\frac{k-x_j}{x_i-x_j}=1\),那么此时的\(y_i\prod_{i≠j}{\frac{k-x_j}{x_i-x_j}}=y_i\)。故将任意\(x_p\)代入都可以得到\(f(x_p)=y_p\)
  3. 综上所述,这个函数是正确的。

这也就是一般的拉格朗日插值的全部内容了。

具体实现(板子题

class Lagrange//拉格朗日插值
{
    public:
        I int GV(CI n,CI k,int *x,int *y)//插值
        {
            RI i,j,v1,v2,ans=0;for(i=1;i<=n;++i)
            {
                for(v1=v2=j=1;j<=n;++j) i^j&&(v1=1LL*v1*(k-x[j]+X)%X,v2=1LL*v2*(x[i]-x[j]+X)%X);//分别计算分子和分母
                ans=(1LL*y[i]*v1%X*Qpow(v2,X-2)+ans)%X;//统计
            }return ans;//返回答案
        }   
}G;

浅析拉格朗日插值

原文:https://www.cnblogs.com/chenxiaoran666/p/Lagrange.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!