拉格朗日插值法学习笔记

拉格朗日插值法学习笔记

古人说过:\(n + 1\) 个点可以确定一个 \(n\) 次多项式。

然而通过解方程求出这个多项式显然不优雅;
\(Lagrange\) 插值法可以通过这 \(n+1\) 个点来求出多项式在 \(x\) 处的取值。

已知信息:\(n + 1\) 个点 \((x_i, y_i)\);

所以要想办法构造出一个函数使得它过这些点;

考虑这样一个函数:
\[ l_i(x) = \Pi_{i = 1,i \ne j}^{n + 1}\frac{x-x_j}{x_i-x_j} \]
可以发现函数 \(l_i\) 在 \(x \in {x_i}\) 的取值有如下规律:
当 \(x = x_i\) 时,\(l_i(x) = 1\);否则,\(l_i(x) = 0\)。这一点是显然的。

接着构造如下函数:
\[ f(x)=\Sigma_{i = 1}^{n + 1}y_i \times l_i(x) \]
这样一来,函数 \(f(x)\) 就必过已知的 \(n + 1\) 个点。

按柿子直接算,时间复杂度:\(O(n^2)\)

这大概就是我关于 \(Lagrange\) 插值法一些浅显的认识,下面是在 \(OI\) 中的应用。

重心拉格朗日插值

我们需要进行插值的次数可能会比较多,这时候上述做法可能并不能满足,需要一些优化。

我们观察函数
\[ f(x)=\Sigma_{i = 1}^{n + 1}y_i \times l_i(x) \\ l_i(x)=\Pi_{i = 1,i \ne j}^{n + 1}\frac{x-x_j}{x_i-x_j} \]
可以发现 \(l_i\) 的分母是可以预处理的,复杂度 \(O(n^2)\);
其次,\(l_i\) 的分子在每次插值之前也可以处理:求出 \(\Pi_{i = 1,i \ne j}^{n + 1}x - x_i\),把多的除掉。

预处理复杂度 \(O(n^2)\),单次计算复杂度 \(O(n)\),(可能会多一个逆元的\(log\))。

当 \(x_i\) 是一段整数区间时

那么 \(l_i(x)\) 中,分母就是 \(fac_{i - 1} \times fac_{n - i}\) ,在 \(n - i\) 为奇数时会有一个负号,(符号和边界问题看代码);
同时,记:
\[ pre_i=\Pi_{i = 0}^{i - 1} x - x_i \\ suf_i=\Pi_{i = i + 1}^{n + 1} x - x_i \]
那么:
\[ f(x) = \Sigma_{i = 0}^{n + 1} y_i \times \frac{pre_{i - 1}suf_{i + 1}}{fac_{i - 1}fac_{n - i}} \]
(待续,,, )

上一篇:stm32之Cortex系统定时器(SysTick)


下一篇:python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)