算法:拉格朗日插值

算法简介

我们常常遇到一些形如给定 \(n\) 个函数上的点 \(P_i(x_i,y_i)\),求函数 \(f(x)\) 的值的问题。解决此类问题的重要方法之一便是拉格朗日(Lagrange)插值法。

算法概述

基本型

我们考虑记点 \(P_i(x_i,y_i)\) 在坐标系上的投影为 \(P_i'(x_i,0)\)。那么我们不妨构造 \(n\) 个函数 \(f_1,f_2,\cdots,f_n\) 使得 \(f_i\) 经过:

\[\begin{cases} P_j'(x_j,0) & i \ne j \\ P_i(x_i,y_i) \end{cases} \]

那么我们最后要求的 \(f(x) = \sum_{i=1}^{n} f_i(x)\)

不妨设 \(f_i(x) = t \times \Pi_{i\ne j} (x-x_j)\),代入坐标容易得出 \(t = \frac{y_i}{\Pi_{i\ne j} (x_i-x_j)}\),那么 \(f(x)=\sum_{i=1}^{n} y_i \times \Pi_{i\ne j} \frac{x-x_j}{x_i-x_j}\)

直接算时间复杂度就是 \(O(n^2)\)。运用一些技巧可以优化到 \(O(n\log^2 n)\)

连续横坐标

横坐标连续时,把式子改造一下可以做到 \(O(n)\)

具体而言,假设现在有 \(n+1\) 个点,那么我们把 \(1,2,\cdots,n+1\) 代入式子,那么式子变为

\[f(x)=\sum_{i=1}^{n+1} y_i \times \Pi_{i\ne j} \frac{x-j}{i-j} \]

分子可以变成

\[\frac {\Pi_{i=1}^{n+1} x-j}{x-i} \]

分母可以化为

\[(−1)^{n−𝑖+1}⋅(𝑖−1)!⋅(𝑛−𝑖+1)! \]

然后就把式子成功改造为了

\[𝑓(𝑥)=\sum_{𝑖=1}^{n+1} (−1)^{𝑛−𝑖+1} 𝑦_𝑖 \frac{\Pi_{i=1}^{n+1}𝑥−𝑗}{(𝑖−1)!(𝑛+1−𝑖)!(𝑥−𝑖)} \]

分子分母都可以预处理得到,只需要线性求和。

posted @ 2026-04-01 18:31  Tiger_Rory  阅读(11)  评论(0)    收藏  举报
//雪花飘落效果