版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

仓库源文站点原文


title: 数值分析实验 - 函数插值方法 categories:


数值分析实验 2 - 函数插值方法

<!-- more -->

实验要求

计算公式

本博客分别使用 MATLAB 实现了 Lagrange 插值, Neville 插值, Newton 插值和三次样条插值

解出 $M_i,~i=0,1,...,n$, 即求得 $S(x)$

程序设计

主程序

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:matlab numanaexp-02/main.m %} </details>

输入数据检查

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:matlab numanaexp-02/input_check.m %} </details>

Lagrange 插值

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:matlab numanaexp-02/calc_lagrange.m %} </details>

Neville 插值

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:matlab numanaexp-02/calc_neville.m %} </details>

Newton 插值

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:matlab numanaexp-02/calc_newton.m %} </details>

三次样条插值

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:matlab numanaexp-02/calc_spline3.m %} </details>

结果讨论和分析

结果

分析

  1. Lagrange 插值, Neville 插值和 Newton 插值得到的多项式相同
  2. 观察图像发现, Lagrange 插值, Neville 插值和 Newton 插值得到的多项式稳定性较差, 尤其在问题 2 中, $x>7$ 时的图像明显偏离预期
  3. 博客中所给出的 Lagrange 插值, Neville 插值和 Newton 插值程序的时间复杂度均为 $O(n^2)$, 三次样条插值的时间复杂度为 $O(n^3)$ , 后面将给出 $O(n\log^2 n)$ 的 Lagrange 插值算法
  4. 四种方法的优缺点如下

    | 方法 | 优点 | 缺点 | | ------------- | ------------------------------------------- | ---------------------------------------------- | | Lagrange 插值 | 形式直观简洁, 推导容易 | 增加新结点时, 原有结果不能复用; 数值稳定性问题 | | Neville 插值 | 增加新结点时, 原有结果可以复用 | 形式不直观; 数值稳定性问题 | | Newton 插值 | 增加新结点时, 原有结果可以复用;形式直观简洁 | 数值稳定性问题 | | 三次样条插值 | 数值稳定性好 | 形式复杂, 时间复杂度高 |

附: 基于分治的 Lagrange 插值算法

令 $\omega(x)=\prod_{i=0}^n(x-x_i)$ 我们改写式 $(1)$

$$ \begin{aligned} L(x)&=\sum_{k=0}^ny_k\frac{\omega(x)}{x-xk}\lim{x\to x_k}\frac{x-xk}{\omega(x)}\ &=\sum{k=0}^n\frac{y_k}{\omega'(x_k)}\frac{\omega(x)}{x-x_k} \end{aligned} $$

我们考虑分治求 $L(x)$

则有

$$ L{l,r}(x)=L{l,m}(x)\prod_{i=m+1}^r(x-xi)+L{m+1,r}(x)\prod_{i=l}^m(x-x_i) $$

基于 FFT 的多项式乘法的时间复杂度为 $O(n\log n)$, 故该算法的时间复杂度为 $O(n\log^2 n)$

MATLAB 程序实现

<details open> <summary><font color='orange'>Show code</font></summary> {% icodeweb blog lang:matlab numanaexp-02/calc_lagrange_fast.m %} </details>