拉格朗日插值学习笔记
拉格朗日插值
定义
给定一个多项式函数过点 \((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)\)。