拉格朗日插值学习笔记

拉格朗日插值

定义

给定一个多项式函数过点 \((x_i,y_i)\),求出这个多项式函数的在 \(x=k\) 时的取值。

公式

\[f(k)=\sum_{i=0}^ny_i\prod_{j\not=i}\dfrac{k-x_j}{x_i-x_j} \]

时间复杂度 \(O(n^2)\)

横坐标连续的拉格朗日插值

在横坐标连续的情况下,可以做到 \(O(n)\) 插值。

\[\begin{aligned} f(k)&=\sum_{i=0}^ny_i\prod_{j\not=i}\dfrac{k-x_j}{x_i-x_j}\\ &=\sum_{i=0}^ny_i\prod_{j\not=i}\dfrac{k-j}{i-j} \end{aligned} \]

不难得到累乘的分子为

\[\begin{aligned} \prod_{j\not=i}(k-j)&=\dfrac{\prod\limits_{j=0}^n(k-j)}{k-i} \end{aligned} \]

若设 \(pre_i=\prod_{j<i}(k-j),pre_i=\prod_{j>i}(k-j)\),那么可得

\[\begin{aligned} \prod_{j\not=i}(k-j)&=\dfrac{\prod\limits_{j=0}^n(k-j)}{k-i}\\ &=pre_i\times suf_i \end{aligned} \]

分母的累乘可拆为

\[\begin{aligned} \prod_{j\not=i}(i-j)&=(-1)^{n-i}\times\prod_{j<i}(i-j)\times\prod_{j>i}(j-i)\\ &=(-1)^{n-i}\times i!\times(n-i)! \end{aligned} \]

所以可得

\[\begin{aligned} f(k)&=\sum_{i=0}^ny_i\dfrac{pre_i\times suf_i}{(-1)^{n-i}\times i!\times(n-i)!} \end{aligned} \]

拉格朗日插值求系数

先提出常数部分

\[a_i=\dfrac{y_i}{\prod\limits_{j\not=i}x_i-x_j} \]

可以先 \(O(n^2)\) 求出每一个 \(a_i\)

然后求一个多项式 \(g(k)=\prod_{i=0}^n(k-x_i)\),可得递推式为

\[[k^i]g=[k^{i-1}]g-x_i[k^i]g \]

注意从大到小递推。

所以可得

\[f(x)=\sum_{i=0}^na_i\times\dfrac{g(k)}{k-x_i} \]

考虑快速求出 \(\dfrac{g(k)}{k-x_i}\)。设 \(h(k)=\dfrac{g(k)}{k-x_i}\),那么有 \((k-x_i)h(k)=g(k)\)。所以有递推式

\[[k^i]g=[k^{i-1}]h-x_i[k^i]h \]

移项得

\[[k^i]h=\dfrac{[k^i]g-[k^{i-1}]h}{-x_i} \]

于是可以求出

\[f(k)=\sum_{i=0}^na_i\times h(k) \]

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

posted @ 2024-02-02 11:05  LIUIR  阅读(2)  评论(0编辑  收藏  举报