浅谈几种插值方法
隔壁的张栩嘉
2019-10-15 13:32:07
## 写在前面
由于作者是一个初二蒟蒻,有一些地方可能存在问题,请多指教。~~喷轻点~~
你以为我会先讲插值吗?
~~当然了!~~
# 问题引入
> 所有数列都有规律——拉格朗日
众所周知,多项式插值定理告诉我们 $n+1$ 个点唯一确定一个 $n$ 次多项式。但是很多时候,我们需要根据这个多项式求值。
下面问题来了,已知 $n$ 个在多项式 $f(x)=\sum_{i=0}^{n}a_i x^i$ 上的点 $\{(x_0,y_0),(x_1,y_1),\cdots,(x_n,y_n)\}$,其中 $f(x_i)=y_i,\forall_{i\in[1,n]\cap \mathbb{N}}$,求 $f(k)$。
这就是~~祸害OIer万年的~~多项式插值问题。
# 初步思路
$O(n^2+n^3+n)$ 列方程 $+$ 高斯消元解方程 $+$ 秦九韶算法(霍纳算法)求值。
不会???[高斯消元](https://45475.blog.luogu.org/linear-equation-group)之前的日报讲得挺好的,至于秦九韶算法……就是将 $f(x)=\sum_{i=0}^{n}a_i x^i$ 转换为 $f(x)=a_0+x(a_1+x(a_2+x(a_3+\cdots+x(a_{n-1}+a_nx))))$。将 $n$ 次加法和 $\frac{n(n+1)}{2}$ 次乘法转换为对至多做 $n$ 次乘法和 $n$ 次加法的算法。
# 拉格朗日插值
先 $orz$ 拉格朗日一下:![拉格朗日](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=68cee21a42a7d933aba5ec21cc22ba76/242dd42a2834349b6446b68bc9ea15ce36d3be78.jpg)
> 约瑟夫·拉格朗日(Joseph-Louis Lagrange,1736~1813)全名为约瑟夫·路易斯·拉格朗日,法国著名数学家、物理学家。1736年1月25日生于意大利都灵,1813年4月10日卒于巴黎。他在数学、力学和天文学三个学科领域中都有历史性的贡献,其中尤以数学方面的成就最为突出。
> 拉格朗日总结了18世纪的数学成果,同时又为19世纪的数学研究开辟了道路,堪称法国最杰出的数学大师。同时,他的关于月球运动(三体问题)、行星运动、轨道计算、两个不动中心问题、流体力学等方面的成果,在使天文学力学化、力学分析化上,也起到了历史性的作用,促进了力学和天体力学的进一步发展,成为这些领域的开创性或奠基性研究。
> ——摘自百度百科
然后让我们想想为什么慢?因为我们知道的太多了。
它要求 $f(k)$,而我们直接求出了 $f(x)$,再代入求 $f(k)$。
我们发现求出 $f(x)$ 的部分好像是多余的,考虑直接求出 $f(k)$。
于是拉格朗日就提出了拉格朗日插值法。先上公式:
$$L_n(x)=\sum_{i=0}^{n}y_i\ell_i(x),\ell_i(x)=\prod_{i\neq j}^{n}\frac{x-x_j}{x_i-x_j}$$
$\ell_i(x)$ 叫做拉格朗日基本多项式(插值基函数),$L_n(x)$ 叫做拉格朗日插值多项式。
乍一看好像十分懵逼,我们一点一点地分析它。
首先显然 $L_n(x)$ 是一个 $n$ 次的多项式,然后再让我们分析一下 $\ell_i(x)$,我们可以发现它有一些神奇的性质:
------------
### $\ell_i(x_i)=1$
证明:
$$\ell_i(x_i)=\prod_{i\neq j}^{n}\frac{x_i-x_j}{x_i-x_j}=\prod_{i\neq j}^{n}1=1$$
------------
### $\ell_i(x_k)=0,\forall_{k\neq i}$
证明:
$$\ell_i(x_k)=\prod_{i\neq j}^{n}\frac{x_k-x_j}{x_i-x_j}=\frac{x_k-x_k}{x_i-x_k}\cdot\prod_{i\neq j\neq k}^{n}\frac{x_k-x_j}{x_i-x_j}=0\times\prod_{i\neq j\neq k}^{n}\frac{x_k-x_j}{x_i-x_j}=0$$
------------
知道了这些性质之后,让我们想一想 $L_n(x)$ 的正确性,证明如下:
$$L_n(x_j)=\sum_{i=0}^{n}y_i\ell_i(x_j)=\sum_{i\neq j}^{n}y_i\ell_i(x_j)+y_j\ell_j(x_j)=y_j$$
又因为 $L_n(x)$ 是一个 $n$ 次的多项式,$n+1$ 个点唯一确定一个 $n$ 次多项式。
所以拉格朗日插值是正确的。
我们不需要将 $L_n(x)$ 求出,我们只需要求出 $L_n(k)$ 就好了。
代码:
```cpp
//求L_n(k)
double L_n_k=0;
for (int i=1;i<=n;i++)
{
double ell_i_k=0;
for (int j=1;j<=n;j++)
if (i!=j) ell_i_k*=(k-x[j])/(x[i]-x[j]);
L_n_k+=y[i]*ell_i_k;
}
```
然后切一道板题——[P4781 【模板】拉格朗日插值](https://www.luogu.org/problem/P4781)
# 当 $x_i$ 取值连续时的做法
如果 $x_i$ 取值连续的,即 $x_i=i$,我们可以做到 $O(n)$。
首先先看一下式子:
$$L_n(x)=\sum_{i=0}^{n}y_i\prod_{i\neq j}^{n}\frac{x-x_j}{x_i-x_j}=\sum_{i=0}^{n}y_i\prod_{i\neq j}^{n}\frac{x-j}{i-j}$$
要求 $L_n(k)$,先设 $k$ 的前缀积 $pre_i=\prod_{j=0}^ik-j$ 与后缀积 $suf_i=\prod_{j=i}^{n}k-j$。
那么式子变成:
$$L_n(k)=\sum_{i=0}^{n}y_i\cdot\frac{pre_{i-1}\cdot suf_{i+1}}{(-1)^{n-i}\cdot i!\cdot (n-i)!}$$
预处理阶乘、$pre$、$suf$,这个问题就是 $O(n)$ 的啦。
代码:
```cpp
//当x_i=i时求L_n(k)
double L_n_k=0;
for (int i=1;i<=n;i++)
if ((n-i)%2) L_n_k+=y[i]*((pre[i-1]*suf[i+1])/(-fac[i]*fac[n-i]));
else L_n_k+=y[i]*((pre[i-1]*suf[i+1])/(fac[i]*fac[n-i]));
```
# 重心拉格朗日插值法(第一型)
我们发现拉格朗日插值有一点点小问题:当增加一个点时需要重新 $O(n^2)$ 计算,如果要多次增加点时,拉格朗日插值就gg了。
设 $\ell(x)=\prod_{i=0}^{n}x-x_i$。
式子变成 $L_n(x)=\sum_{i=0}^{n}y_i\frac{\ell(x)}{(x-x_i)\cdot\prod_{j\neq i}x_i-x_j}=\ell(x)\cdot\sum_{i=0}^{n}\frac{y_i}{(x-x_i)\cdot\prod_{j\neq i}x_i-x_j}$
设重心权 $w_i=\frac{y_i}{\prod_{j\neq i}x_i-x_j}$,那么式子变成 $L_n(x)=\ell(x)\cdot\sum_{i=0}^{n}\frac{w_i}{x-x_i}$。
所以每加入一个点,我们用 $O(n)$ 的时间复杂度计算出重心权 $w_i$,即可求出新的 $L_n(x)$。
于是就可以进行加入、撤销的操作了,它有向后稳定性。
# 重心拉格朗日插值法(第二型)
我们采用重心拉格朗日插值法(第一型)来插值多项式 $g(x)\equiv 1$,可得:
$$g(x)=\ell(x)\cdot\sum_{i=0}^{n}\frac{w_i}{x-x_i}$$
所以
$$\frac{L_n(x)}{g(x)}=\frac{\sum_{i=0}^{n}\frac{w_i}{x-x_i}\cdot y_i}{\sum_{i=0}^{n}\frac{w_i}{x-x_i}}$$
又因为 $g(x)\equiv 1$,所以
$$L_n(x)=\frac{\sum_{i=0}^{n}\frac{w_i}{x-x_i}\cdot y_i}{\sum_{i=0}^{n}\frac{w_i}{x-x_i}}$$
这就是重心拉格朗日插值法(第二型)或是叫做真正的重心拉格朗日插值公式。它比重心拉格朗日插值法(第一型)更好计算,常数更小,向前稳定,并且勒贝格常数很小,用 $x_i=\cos(\frac{(2i+1)\pi}{2(n+1)})$ 就是切比雪夫插值节点插值效果好,可以很好地模拟给定的函数,使得插值点个数趋于无穷时,最大偏差趋于零。
# 牛顿插值法
先 $orz$ 牛顿一下:![牛顿](https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=8b53f93ad054564ef168ec6bd2b7f7e7/7e3e6709c93d70cff9c06f24f5dcd100baa12be5.jpg)
> 艾萨克·牛顿(1643年1月4日—1727年3月31日)爵士,英国皇家学会会长,英国著名的物理学家,百科全书式的“全才”,著有《自然哲学的数学原理》、《光学》。
>
> 他在1687年发表的论文《自然定律》里,对万有引力和三大运动定律进行了描述。这些描述奠定了此后三个世纪里物理世界的科学观点,并成为了现代工程学的基础。
> 他通过论证开普勒行星运动定律与他的引力理论间的一致性,展示了地面物体与天体的运动都遵循着相同的自然定律;为太阳中心说提供了强有力的理论支持,并推动了科学革命。
>
> 在力学上,牛顿阐明了动量和角动量守恒的原理,提出牛顿运动定律。
>
> 在光学上,他发明了反射望远镜,并基于对三棱镜将白光发散成可见光谱的观察,发展出了颜色理论。他还系统地表述了冷却定律,并研究了音速。
>
> 在数学上,牛顿与戈特弗里德·威廉·莱布尼茨分享了发展出微积分学的荣誉。他也证明了广义二项式定理,提出了“牛顿法”以趋近函数的零点,并为幂级数的研究做出了贡献。
>
> 在经济学上,牛顿提出金本位制度。
>
> ——摘自百度百科
~~反正就是大佬~~
然后让我们设被插函数为 $f(x)$,已知节点 $\{(x_i,y_i)\},i\in [0,n]$。
然后我们定义差商(均差)的概念:即导数的近似值,对等步长的离散函数 $f(x)$ ,其 $n$ 阶差商就是它的 $n$ 阶差分与其步长的 $n$ 次幂的比值。 ——摘自[百度百科——差商](https://baike.baidu.com/item/%E5%B7%AE%E5%95%86/4170704?fr=aladdin)
大概意思就是设 $f[x_0,x_1,\cdots,x_k]$ 为 $f(x)$ 的 $k$ 阶差商,那么 $f[x_0,x_1,\cdots,x_k]=\frac{f[x_1,x_2,\cdots,x_k]-f[x_0,x_1,\cdots,x_{k-1}]}{x_k-x_0}$,$f(x)$ 在 $x_i$ 点处的零阶差商为 $f(x_i)$,即 $f[x_0]=f(x_0)=y_0$。
所以
$0$ 阶差商 $f[x_0]=f(x_0)$
$1$ 阶差商 $f[x_0,x_1]=\frac{f[x_1]-f[x_0]}{x_1-x_0}$
$2$ 阶差商 $f[x_0,x_1,x_2]=\frac{f[x_1,x_2]-f[x_0,x_1]}{x_2-x_0}$
……
$n$ 阶差商 $f[x_0,x_1,\cdots,x_n]=\frac{f[x_1,x_2,\cdots,xn]-f[x_0,x_1,\cdots,x_{n-1}]}{x_n-x_0}$
我们考虑存在未知点 $x$ 的差商,移项可得
$$f[x]=f(x)$$
$$f[x,x_0](x-x_0)+f[x_0]=f[x]$$
$$f[x,x_0,x_1](x-x_1)+f[x_0,x_1]=f[x,x_0]$$
$$\cdots\cdots$$
$$f[x,x_0,x_1,\cdots,x_n](x-x_n)+f[x,x_0,x_1,\cdots,x_{n}]=f[x,x_0,x_1,\cdots,x_{n-1}]$$
将后面的项带入前面得
$$\footnotesize f(x)=f[x_0]+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)+\cdots+f[x_0,\cdots,x_n](x-x_0)\cdots(x-x_{n-1})+f[x,x_0,\cdots,x_n](x-x_0)\cdots(x-x_n)$$
因为最后一项无论 $x$ 取哪一个都会是 $0$,可以去掉。
所以
$$f(x)=\sum_{i=0}^{n}f[x_0,x_1,\cdots,x_i]\cdot\prod_{j=0}^{i}(x-x_j)+R_n(x)=N_n(x)+R_n(x)$$
这就是牛顿插值公式。$N_n(x)$ 叫做牛顿插值多项式,$R_n(x)$ 叫做牛顿插值公式余项(截断误差)。~~在OI没什么意义。~~
实现的时候便可以增量构造,我们时刻维护 $x_n$ 结尾的 $n$ 个差商和多项式 $\prod(x-x_i)$ 即可,差商用定义的公式递推,多项式因为每次乘二项式,直接递推,两个东西都可以 $O(n)$ 维护。总复杂度为 $O(n^2)$。
不过它比拉格朗日插值更好的是,它可以插出多项式的系数。当给出的节点等距时,使用差分能达到更优的效果,其计算更加简便。
代码:
```cpp
void insert(int xn, int yn)//插入点(xn,yn)
{
x[++n]=xn;
y[n]=yn,now^=1,dt[now][0]=yn;//x^1,如果x是偶数,那么答案是x+1,如果x是奇数,那么答案是x-1
for (int i=1;i<n;i++) dt[now][i]=dt[now][i-1]-dt[now^1][i-1]/x[n]-x[n-i];//维护差商
for (int i=n-1;i>=1;i--) ploy[i]=ploy[i-1]-x[n-1]*ploy[i];//维护多项式
ploy[0]*=-x[n-1];
for(register int i=0;i<n;i++) ans[i]+=ploy[i]*dt[now][n-1];//累计答案
}
```
# 泰勒插值
这是一个不太常用的办法,先看看泰勒多项式:
$$f(x)=\sum_{i=0}^{n}\frac{f^{(i)}(x_0)}{i!}(x-x_0)^i+R_n(x)$$
其中 $f^{(i)}(x)$ 表示 $f(x)$ 的 $i$ 阶导。
因而,泰勒插值的条件就是已知 $0-n$ 阶的导数 $f^{(k)}(x_0),k\in[1,n]\cap\mathbb{N}$,求 $f(x)$。
方法很简单,拿泰勒多项式倒过来用就好了,时间复杂度 $O(n^2)$。
~~又慢,限制又多。~~
不过有的时候还是比较方便的。
# 多项式快速插值
先给出板题——[P5158 【模板】多项式快速插值](https://www.luogu.org/problem/P5158)
我们兴高采烈地打出牛顿插值/拉格朗日插值,然而……$TLE$……
于是我们考虑优化拉格朗日插值。
先给出了 $n+1$ 个点的集合 $X=\{(x_i,y_i):0\leq i\leq n\}$,现在要求一个 $n$ 次多项式 $A(x)$ 满足 $\forall(x,y)\in X,A(x)=y$。
考虑分治,我们把要插值的点分成两半:
$$X_0=\left\{(x_i,y_i):1\leq i\leq \left \lfloor \frac{n}{2}\right \rfloor \right \}$$
$$X_1=\left\{(x_i,y_i):\left \lfloor \frac{n}{2}\right \rfloor<i\leq n\right \}$$
假设已用 $X_0$ 插值出多项式 $A_0(x)$,求 $A(x)$。
设 $P(x)=\prod_{i=0}^{\left \lfloor \frac{n}{2}\right \rfloor}(x-x_i)$。
那么构造 $A(x)$,使其满足
$$A(x)=A_1(x)P(x)+A_0(x)$$
~~有没有想到FFT?~~
其中 $A_1(x)$ 是一个未知的多项式,由于 $\forall(x,y)\in X_0,P(x)=0,A_0(x)=y$,这样的话就满足 $X_0$ 的点都在 $A(x)$ 上,问题就变成要将 $X_1$ 内的点插值,使得 $\forall(x_i,y_i)\in X_1,y_i=A_1(x_i)P(x_i)+A_0(x_i)$ 化简之后得到
$$A_1(x_i)=\frac{A_0(x_i)-y_i}{P(x_i)}$$
这样就得到了新的待插值点,利用同样的方法求出插值出 $A_1$ 然后合并就可以了,最终复杂度是 $T(n)=2T(\frac{n}{2})+O(n\log^2 n)=O(n\log^3 n)$。
# ~~更快的~~多项式快速插值
还是这个板题——[P5158 【模板】多项式快速插值](https://www.luogu.org/problem/P5158)
如果 $O(n\log^3 n)$还是满足不了大佬~~AKIOI~~的需求时,我们就继续换方法。
### 注意:以下内容可能引起不适,建议学过[极限](https://baike.baidu.com/item/%E6%9E%81%E9%99%90/3564509?fr=aladdin)的同学学习。
给出了 $n+1$ 个点的集合 $X=\{(x_i,y_i):0\leq i\leq n\}$,要求一个 $n$ 次多项式 $A(x)$ 满足 $\forall(x,y)\in X,A(x)=y$。
先回顾一下拉格朗日插值公式:
$$L_n(x)=\sum_{i=0}^{n}y_i\ell_i(x)=\sum_{i=0}^{n}y_i\prod_{i\neq j}^{n}\frac{x-x_j}{x_i-x_j}$$
暴力求解是 $O(n^3)$ 的,所以考虑优化。
首先求解分母的部分,设 $g(x)=\prod_{i=0}^{n}(x-x_i)$,可以用分治FFT,$O(n\log^2n)$
问题就变成了求当 $x=x_i$ 时,$\frac{g(x)}{x-x_i}$ 的值。
怎么样,有思路了吗?是不是一下就可以出解了?
~~当然不是~~
简单思考一下就可以发现,当 $x=x_i$ 时,$g(x)=x-x_i=0$,所以$\frac{g(x)}{x-x_i}=\frac{0}{0}$……
那变一下问题,改成求 $\lim_{x\to x_i}\frac{g(x)}{x-x_i}$ 的值,似乎可做。
这个时候,就要用洛必达法则啦!
## [洛必达法则](https://baike.baidu.com/item/%E6%B4%9B%E5%BF%85%E8%BE%BE%E6%B3%95%E5%88%99/7646700?fr=aladdin)(零比零型)
若函数 $f(x)$ 和 $g(x)$ 满足下列条件:
1. $\lim_{x\to a}f(x)=\lim_{x\to a}g(x)=0$
2. $f(x)$、$g(x)$ 在点 $a$ 的某去心邻域内可导,且 $\lim_{x\to a}g'(x)\neq 0$
那么
$$\lim_{x\to a}\frac{f(x)}{g(x)}=\lim_{x\to a}\frac{f'(x)}{g'(x)}$$
------------
根据洛必达法则,$\lim_{x\to x_i}\frac{g(x)}{x-x_i}=\lim_{x\to x_i}\frac{g'(x)}{(x-x_i)'}=g'(x)$
那么我们就要求出 $g'(x_0),g'(x_1),\cdots,g'(x_n)$,使用多项式多点求值即可,成功优化到 $O(n\cdot n\log^2n+n\log n)=O(n^2\log^2 n)$!
### 【高能预警】下面的公式非常密集!!!
设 $w_i=\frac{y_i}{\prod_{j\neq i}x_i-x_j}$,分子已知,分母可以通过我们上边的方法求解。
原式变成
$$f(x)=\sum_{i=0}^{n}w_i\prod_{j=0,j\neq i}^{n}(x-x_j)$$
设 $P_l(x)=\prod_{i=0}^{\frac{n}{2}}x-x_i,P_r(x)=\prod_{i=\frac{n}{2}+1}^{n}x-x_i$。
再设 $f_l(x)=\sum_{i=0}^{\frac{n}{2}}w_i\prod_{j=0,j\neq i}^{\frac{n}{2}}(x-x_j),f_r(x)=\sum_{i=\frac{n}{2}+1}^{n}w_i\prod_{j=\frac{n}{2}+1,j\neq i}^{n}(x-x_j)$。
那么
$$f(x)=P_r(x)f_l(x)+P_l(x)f_r(x)$$
预处理出 $P(x)$,分治即可。最底层直接返回 $w_i$。
~~超长公式警告~~
总的来说,设 $mid=\lfloor\frac{n}{2}\rfloor$,$f_{l,r}(x)$表示 $\{(x_i,y_i),i\in[l,r]\cap\mathbb{N}\}$这些点插出来的多项式,则
$$f_{l,r}(x)=\sum_{i=l}^r \frac{y_i}{g'(x)}\prod_{j=l,j\neq i}^r(x-x_j)$$
所以
$$\small f_{l,r}(x)=\left[\prod_{j=mid+1}^r(x-x_j)\right]\left[\sum_{i=l}^{mid}\frac{y_i}{g'(x)}\prod_{j=l,j\neq i}^{mid}(x-x_j)\right]+\left[\prod_{j=l}^{mid}(x-x_j)\right]\left[\sum_{i=mid+1}^r\frac{y_i}{g'(x)}\prod_{j=mid+1,j\neq i}^r(x-x_j)\right]$$
所以
$$f_{l,r}=\left[\prod_{j=mid+1}^r(x-x_j)\right]f_{l,mid}(x)+\left[\prod_{j=l}^{mid}(x-x_j)\right]f_{mid+1,r}(x)$$
递归求解即可,时间复杂度 $O(n\log^2n)$,常数极大。
~~不过代码就不给了,因为我还没写出来~~
~~我太菜了~~
# 埃尔米特($\text{Hermite}$)插值
有时候,我们不仅要求插值函数在给定节点上函数值重合,而且要求若干阶导数也重合,即,要求插值函数$\varphi(x)$满足:
$$\varphi^{(j)}(x_i)=f^{(j)}(x_i),\forall i\in[1,n]\cap\mathbb{N},j\in[1,m]\cap\mathbb{N}$$
以两点三次 $\text{Hermite}$ 插值为例,讲解$\text{Hermite}$插值。
已知:$x_0,x_1,f(x_0)=y_0,f(x_1)=y_1,f'(x_0)=y_0',f'(x_1)=y_1'$,求三次多项式 $H(x)$,满足上述条件。
考虑模仿拉格朗日多项式的思想,设
$$H_3(x)=a_0f_0(x)+a_1f_1(x)+b_0g_0(x)+b_1g_1(x)$$
其中,$f_0(x),f_1(x),g_0(x),g_1(x)$ 是三次多项式,且满足
$$f_i(x_j)=g_i'(x_j)=t_{ij},f_i'(x_j)=g_i(x_j)=0$$
带入插值条件得
$$H_3(x)=y_0f_0(x)+y_1f_1(x)+y_0'g_0(x)+y_1'g_1(x)$$
对于 $f_0(x)$,可得 $f_0(x_0)=1,f_0(x_1)=f_0'(x_0)=f_0'(x_1)=0$。
设 $f_0(x)=(ax+b)(\frac{x-x_1}{x_0-x_1})^2$
因为 $f_0(x_0)=1,f_0'(x_0)=0$,所以解得 $a=-\frac{2}{x_0-x_1},b=\frac{3x_0-x_1}{x_0-x_1}=1+\frac{2x_0}{x_0-x_1}$,所以 $f_0(x)=(1-2\frac{x-x_0}{x_0-x_1})(\frac{x-x_1}{x_0-x_1})^2$。
同理可得 $f_1(x)=(1-2\frac{x-x_1}{x_1-x_0})(\frac{x-x_0}{x_1-x_0})^2$。
对于 $g_0(x)$,可得 $g_0'(x_0)=1,g_0(x_0)=g_0(x_1)=g_0'(x_1)=0$。
设 $g_0(x)=(cx+d)(\frac{x-x_1}{x_0-x_1})^2$
因为 $g_0(x_0)=0,g_0'(x_0)=1$,所以解得 $c=1,d=-x_0$,所以 $f_0(x)=(x-x_0)(\frac{x-x_1}{x_0-x_1})^2$。
同理可得 $g_1(x)=(x-x_1)(\frac{x-x_0}{x_1-x_0})^2$。
带入得到插值公式:
$$H_3(x)=y_0(1-2\frac{x-x_0}{x_0-x_1})(\frac{x-x_1}{x_0-x_1})^2+y_1(1-2\frac{x-x_1}{x_1-x_0})(\frac{x-x_0}{x_1-x_0})^2+y_0'(x-x_0)(\frac{x-x_1}{x_0-x_1})^2+y_1'(x-x_1)(\frac{x-x_0}{x_1-x_0})^2$$
根据上述计算思想,$n+1$ 个节点,唯一确定 $2n+1$ 次埃尔米特插值多项式:
$$H_{2n+1}=\sum_{k=0}^{n}\left\{[1-2(x-x_k)L_k'(x_k)]f_kL_k(x)+(x-x_k)f_k'L_k^2(x)\right\}$$
这里的 $L_k(x)$ 就是拉格朗日插值多项式。
不过其实我们日常生活不会用到~~IOI不考~~,所以实用性不强,但是它可以解决一些毒瘤的问题。
# ~~课后作业~~一道思考题
这是一道经典例题:给你两个正整数 $k,n$,请求出 $\sum_{i=0}^{n}i^k$ 的通项公式,用各种插值法做一遍。
然后 $A$ 了这道题——[CF622F](https://www.luogu.org/problem/CF622F)。
~~祝你们好运!~~
$$$$
$$$$
$$$$
$$$$
$$$$
$$\Huge\color{purple}\text{完结撒花!!!}$$
$$$$
$$$$
$$$$
$$$$
$$$$
# 参考资料
- [多项式的多点求值与快速插值——miskcoo](http://blog.miskcoo.com/2015/05/polynomial-multipoint-eval-and-interpolationa)
- [@总结 - 4@ 多项式的多点求值与快速插值——Tiw_Air_OAO](https://www.cnblogs.com/Tiw-Air-OAO/p/10198693.html)
- [题解 P5158 【【模板】多项式快速插值】——bztMinamoto](https://www.luogu.org/blog/Minamoto/solution-p5158)
- [题解 P4781 【【模板】拉格朗日插值】——attack](https://www.luogu.org/blog/attack/solution-p4781)
- [从牛顿插值法到泰勒公式——马同学高等数学](https://www.matongxue.com/madocs/126/)
- [【插值】插值方法原理详解——Y.D](https://www.cnblogs.com/duye/p/8671820.html)