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

拉格朗日插值

时间:2023-10-18 17:24:42浏览次数:43  
标签:拉格朗 aligned frac 插值 sum times le prod

拉格朗日插值

普通拉格朗日插值

众所周知,\(n + 1\) 个横坐标互不相同的点可以确定出唯一的最高次为 \(n\) 的多项式。当给定你 \(n\) 个点并要求你求出横坐标为 \(x\) 的点的纵坐标,高斯消元虽是个选择,但是 \(O(n^3)\) 的时间复杂度显然不优。于是我们选择用 \(O(n^2)\) 的拉格朗日插值解决这类问题。

我们先来考虑构造一个函数 \(L(x)\),我们希望这个函数在 \(x = x_i\) 时等于 \(1\),在 \(x = x_j(0 \le j \le n, j \not= i)\) 时等于 \(0\)。

我们想达到这个目的,不难想到去令多个式子相乘,这样的话只要有一项等于 \(0\),则总的式子就等于 \(0\)。

所以我们先设 \(\displaystyle L(x) = \prod_{0 \le j \le n} (x - x_j)\),但是我们发现当 \(x = x_i\) 时也等于 \(0\)。

所以我们再设 \(\displaystyle L(x) = \prod_{0 \le j \le n 且i \not= j} (x - x_j)\),但是我们发现当 \(x = x_i\) 时不等于 \(1\)。

所以我们设 \(\displaystyle L(x) = \prod_{0 \le j \le n 且i \not= j} \frac{x - x_j}{x_i - x_j}\)。

然后就得到了一个非常巧的函数。

然后就有:

\[\begin{aligned} f(x) &= \sum_{i = 0}^n y_i L(x)\\ &= \sum_{i = 0}^n y_i \prod_{j \not= i} \frac{x - x_j}{x_i - x_j} \end{aligned}\]

这个式子显然是可以在 \(O(n^2)\) 的时间复杂度内算出来的。

在横坐标连续的情况下的拉格朗日插值

当横坐标连续时,我们可以将 \(x_i\) 看作 \(i\),\(x_j\) 看作 \(j\),所以原式变成:

\[\begin{aligned} f(x) = \sum_{i = 0}^n y_i \prod_{j \not= i} \frac{x - j}{i - j} \end{aligned}\]

现在的重点在于如何快速算出 \(\displaystyle \prod_{j \not= i} \frac{x - j}{i - j}\)

我们发现分子可以写成前缀积和后缀积相乘的形式,所以设 \(\displaystyle pre_i = \prod_{j = 0}^i (x - j), suf_i = \prod_{j = i}^n (x - j)\),然后分子就可以写成 \(pre_{i - 1} \times suf_{i + 1}\)。

但是我们发现,分子好像也可以不写成前缀积和后缀积相乘的形式。我们直接预处理出 \(prod = \displaystyle \prod_{j = 0}^n (x - j)\),然后分子就是 \(\displaystyle \frac{prod}{x - i}\),我们把 \(x - i\) 移到分母上即可。

我们发现分母可以写成阶乘的形式,所以设 \(fac_i\) 为 \(i\) 的阶乘,然后分母就可以写成 \(fac_{i - 1} \times fac_{n - i}\)。

但是我们发现,当 \(i < j\) 时有可能会使原式变为负数。我们考虑什么时候会出现这种情况。

对于 \(m\) 个负数相乘,当 \(m\) 为偶数时结果为正,\(m\) 为奇数时结果为负。对于一个 \(i\),大于 \(i\) 的 \(j\) 的个数为 \(n - i\),所以我们让分母再乘上 \((-1)^{n - i}\) 即可。

所以整合一下:

\[\begin{aligned} f(x) &= \sum_{i = 0}^n \frac{y_i \times pre_{i - 1} \times suf_{i + 1}}{(-1)^{n - i} \times fac_{i - 1} \times fac_{n - i}}\\ &= \sum_{i = 0}^n \frac{y_i \times prod}{(x - i) \times (-1)^{n - i} \times fac_{i - 1} \times fac_{n - i}}\\ \end{aligned}\]

我们发现这个式子是 \(O(n)\) 的。

重心拉格朗日插值

如果我们需要计算多次拉格朗日插值,那每一次都跑一边 \(O(n^2)\) 这个过程是很不优的,因为我们重复算了很多东西。

所以我们考虑重写一下原式。

\[\begin{aligned} f(x) &= \sum_{i = 0}^n y_i \prod_{j \not= i} \frac{x - x_j}{x_i - x_j}\\ &= \sum_{i = 0}^n y_i \prod_{j \not= i} (x - x_j) \prod_{p \not= i}\frac{1}{x_i - x_p}\\ &= \sum_{i = 0}^n \prod_{j \not= i} (x - x_j) \frac{y_i}{\prod_{p \not= i}(x_i - x_p)}\\ &= \prod_{j = 0}^n (x - x_j) \sum_{i = 0}^n \frac{y_i}{\prod_{p \not= i}(x_i - x_p)} \times \frac{1}{x - x_i}\\ \end{aligned}\]

然后我们设 \(\displaystyle prod_i = \frac{y_i}{\prod_{p \not= i}(x_i - x_p)}, g_x = \prod_{j = 0}^n (x - x_j)\)。

所以有:

\[\begin{aligned} f(x) &= g(x) \sum_{i = 0}^n \frac{prod_i}{x - x_i}\\ \end{aligned}\]

在 \(O(n^2)\) 预处理出 \(prod\) 后,这个式子可以 \(O(n)\) 计算。

标签:拉格朗,aligned,frac,插值,sum,times,le,prod
From: https://www.cnblogs.com/Meteor-streaking/p/17772886.html

相关文章

  • 拉格朗日插值
    拉格朗日插值:给定\(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。当你取的点值连续......
  • 基于亚奈奎斯特采样和SOMP算法的平板脉冲响应空间插值matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述     平板脉冲响应(PulseResponse)是通信和雷达等领域中的重要参数,它描述了信号在空间中传播的特性。在现实应用中,获取完整的脉冲响应通常是耗时且昂贵的。基于亚奈奎斯特采样和SOMP算法的平板脉......
  • webgl centroid质心插值的一点理解
    质心插值说的是什么2023.10.04再次review这个细节点:https://www.opengl.org/pipeline/article/vol003_6/https://github.com/WebGLSamples/WebGL2Samples/blob/master/samples/glsl_centroid.html#L69基本上把这个问题看明白了;centroid代表质心插值;问题来自于在对普通的vary......
  • 《拉格朗日插值》小记
    随便学学,主要是又被卡科技了。参考文章:\(Alex\_Wei\)的拉格朗日插值与多项式乘法\(Alex\_Wei\)的多项式I:拉格朗日插值与快速傅里叶变换\(yyc\)的从拉插到快速插值求值算法介绍公式口糊主要用来对于一个给定的\(n\)次多项式,用\(n+1\)个点值在\(O(n^2)\)的时间复......
  • Lagrange插值
    本文主要参考资料:找通项的终极方法!让每个人都能听懂的【拉格朗日插值法】_哔哩哔哩_bilibili回顾,多项式的系数表示法和点值表示法:FFT(快速傅立叶变换)学习-Isakovsky-博客园(cnblogs.com)从系数表示法到点值表示法的运算叫做求值运算,从点值表示法到系数表示法的运算叫做......
  • 拉格朗日插值 学习笔记
    拉格朗日插值学习笔记前言模拟赛考了,我不会,故学之。真的好抽象……背景众所周知,用\(n\)个点可以确定一个\(n-1\)次的多项式,那么应该如何确定呢?我们不妨考虑这样一个题目(其实就是洛谷模板题):给定\(n\)个点\((x,y)\),要求确定\(f(x)\)。当然,直接求出系数可能比较困难,......
  • 插值法
    多项式插值法使用n+1个点,确定一条唯一的多项式:多项式满足:写成矩阵的形式:显然左边是范德蒙德行列式,且有唯一解。根据克拉默法则,解为:其中将解代入原式子得到:二次累加可以交换次序: 其中: 其满足范德蒙德行列式,范德蒙德行列式计算如下:计算公式中的元素得到(不......
  • 线性插值
    线性插值publicstaticvoidinterpolate(List<Double>list){intstart=-1;for(inti=0;i<list.size();i++){if(list.get(i)==null)continue;if(start!=-1){intcount=i-sta......
  • 牛顿插值法 不同阶图像对比及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]......
  • ArcPy基于Excel采样点长时间数据执行IDW插值与自动掩膜
      本文介绍基于Python中ArcPy模块,实现Excel数据读取并生成矢量图层,同时进行IDW插值与批量掩膜的方法。1任务需求  首先,我们来明确一下本文所需实现的需求。  现有一个记录有北京市部分PM2.5浓度监测站点在2019年05月18日00时至23时(其中不含19时)等23个逐小时PM2.5浓度数据......