首页 > 其他分享 >拉格朗日插值法

拉格朗日插值法

时间:2023-10-18 19:24:47浏览次数:34  
标签:拉格朗 ch frac 插值法 ne long times prod

今天 \(T2\) 用到了,于是来学一学。

拉格朗日插值法

洛谷模板

求值是指给定一个函数式,根据一个自变量求出因变量。

而插值是给出一些自变量及其对应的因变量,求出符合的函数式。

一种方法是将所有的值代入,然后解方程,显然极其不方便,这时,一位名为约瑟夫·路易斯·拉格朗日的人站了出来,提出了拉格朗日插值法。

假设有一个函数,满足 \(g(x_i)=1\),且 \(g(x_j)=0,(i\ne j)\),那么显然所求多项式即为:

\[f(x)=\sum_{i=1}^{n}{y_i\times g_x} \]

对于一个非 \(i\) 的 \(j\),想要消除其影响就要使其系数为0,也就是说我们构造的函数需要有一项为 \((x-x_j)\)。

对于 \(i\),想要其值为1,就得消掉其他项,所以需要除以 \((x_i-x_j)\)。

所以函数为:

\[g_x=y_i\times \prod_{i\ne j} \frac{x-x_j}{x_i-x_j} \]

\[f_x=\sum_{i=1}^{n}{y_i\times \prod_{i\ne j} \frac{x-x_j}{x_i-x_j}} \]

复杂度为 \(O(n^2)\)

code
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
const long long M=2e3+10;
long long n,k,ans;
long long x[M],y[M];
inline long long read(){
    long long x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-'){
            f=-1;
        }
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
inline long long po(long long x,long long k){
    long long ans=1;
    while(k){
        if(k&1){
            ans=ans*x%mod;
        }
        x=x*x%mod;
        k=k>>1;
    }
    return ans;
}
int main(){
    n=read(); k=read();
    for(long long i=1;i<=n;i++){
        x[i]=read(); y[i]=read()%mod;
    }
    for(long long i=1;i<=n;i++){
        long long res=1,a=1,b=1;;
        for(long long j=1;j<=n;j++){
            if(i==j){
                continue;
            }
            a=a*(k-x[j])%mod;
            b=b*(x[i]-x[j])%mod;
        }
        if(b<0){
            res=-res;
        }
        ans=(ans+res*y[i]%mod*a%mod*po(abs(b),mod-2)%mod)%mod;
    }
    cout<<(ans+mod)%mod<<'\n';
    return 0;
}

对于一些自变量连续的点,我们可以将复杂度优化至 \(O(n)\)。

对于上面的函数,由于自变量连续,显然有:

\[g_x=y_i\times \prod_{i\ne j} \frac{x-j}{i-j} \]

\[g_x=y_i\times \frac{\prod_{i\ne j}{x-j}}{\prod_{i\ne j}{i-j}} \]

\[\prod_{i\ne j}{x-j}=\frac{\prod_{i=1}^{n}{x-j}}{x-i} \]

\[\prod_{i\ne j}{i-j}=(-1)^{n-i}\times (i-1)! \times (n-i)! \]

\[g_x=\frac{\prod_{i=1}^{n}{x-j}}{(x-i)\times (-1)^{n-i}\times (i-1)! \times (n-i)!} \]

\[f_x=\sum_{i=1}^{n}{y_i\times \frac{\prod_{i=1}^{n}{x-j}}{(x-i)\times (-1)^{n-i}\times (i-1)! \times (n-i)!}} \]

复杂度为 \(O(n)\)。

标签:拉格朗,ch,frac,插值法,ne,long,times,prod
From: https://www.cnblogs.com/Airposs/p/17773038.html

相关文章

  • 拉格朗日插值
    拉格朗日插值普通拉格朗日插值众所周知,\(n+1\)个横坐标互不相同的点可以确定出唯一的最高次为\(n\)的多项式。当给定你\(n\)个点并要求你求出横坐标为\(x\)的点的纵坐标,高斯消元虽是个选择,但是\(O(n^3)\)的时间复杂度显然不优。于是我们选择用\(O(n^2)\)的拉格朗日......
  • 拉格朗日插值
    拉格朗日插值:给定\(n+1\)个点值\((x_i,y_i)\),对应唯一一个\(n\)次多项式,带入\(f(k)=\sum\limits_{i=1}^{n+1}y_i\prod\limits_{j\neqi}\frac{k-x_j}{x_i-x_j}\)。基本思想就是,构建\(n+1\)个多项式使得\(x=x_i\)时为1,\(x=x_j(j\neqi)\)时为0。当你取的点值连续......
  • 《拉格朗日插值》小记
    随便学学,主要是又被卡科技了。参考文章:\(Alex\_Wei\)的拉格朗日插值与多项式乘法\(Alex\_Wei\)的多项式I:拉格朗日插值与快速傅里叶变换\(yyc\)的从拉插到快速插值求值算法介绍公式口糊主要用来对于一个给定的\(n\)次多项式,用\(n+1\)个点值在\(O(n^2)\)的时间复......
  • 拉格朗日插值 学习笔记
    拉格朗日插值学习笔记前言模拟赛考了,我不会,故学之。真的好抽象……背景众所周知,用\(n\)个点可以确定一个\(n-1\)次的多项式,那么应该如何确定呢?我们不妨考虑这样一个题目(其实就是洛谷模板题):给定\(n\)个点\((x,y)\),要求确定\(f(x)\)。当然,直接求出系数可能比较困难,......
  • 插值法
    多项式插值法使用n+1个点,确定一条唯一的多项式:多项式满足:写成矩阵的形式:显然左边是范德蒙德行列式,且有唯一解。根据克拉默法则,解为:其中将解代入原式子得到:二次累加可以交换次序: 其中: 其满足范德蒙德行列式,范德蒙德行列式计算如下:计算公式中的元素得到(不......
  • 牛顿插值法 不同阶图像对比及Python代码实现
    importmatplotlib.pyplotaspltimportnumpyasnpdefnewton_interpolation(X,Y,x):"""计算x点的插值"""sum=Y[0]temp=np.zeros((len(X),len(X)))#将第一行赋值foriinrange(0,len(X)):temp[i,0]=Y[i]......
  • 跟着GPT学习拉格朗日对偶性
      再来一个例子:  拉格朗日对偶性如何通俗理解呢?有没有实际例子可以说明下? 拉格朗日对偶性是优化理论中的一个重要概念,尤其在机器学习和运筹学中经常遇到。在对偶性中,我们从一个优化问题(称为原问题)中衍生出另一个相关的优化问题(称为对偶问题)。这两个问题之......
  • 【小记】拉格朗日插值
    拉格朗日插值是知道\(n\)次多项式在\(n+1\)个点的点值,快速求出\(f(x')\)的算法结论拉格朗日插值本质上就是该式子,首先我们知道的点值为当\(x=x_i\)时\(f(x)=y_i\)\[f(x)=\sum_{i=0}^{n}y_i\prod_{j\nei}\frac{x-x_j}{x_i-x_j}\]推导首先假设我们考虑第\(i\)个点值。那么我......
  • 考研线代:拉格朗日配方法怎么用?一篇文章就搞明白!
    考研线代:拉格朗日配方法怎么用?一篇文章就搞明白:https://zhaokaifeng.com/16687/......
  • 拉格朗日和kkt公式的应用示例 无论求解最大还是最小值,u都是>=0哈!最大是+ 最小是- 至少
    KKT这个公式一直觉得理解和使用起来很蛋疼,我又从国外站点找了一个例子帮助理解,见最后!https://o-o-sudo.github.io/numerical-methods/-kkt-lagrange-multiplier-to-kkt-condition.html 注意:拉格朗日里的lambda并没有要求>=0,kkt的u才有要求。           注意,国外这个......