版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
数值分析实验 2 - 函数插值方法
<!-- more -->问题 1
对如下结点构造五次插值多项式和分段三次插值多项式
| $x_i$ | 0.4 | 0.55 | 0.65 | 0.80 | 0.95 | 1.05 | | ----- | ------- | ------- | ------- | ---- | ---- | ------- | | $y_i$ | 0.41075 | 0.57815 | 0.69675 | 0.90 | 1.00 | 1.25382 |
并计算 $f(0.596),f(0.99)$
问题 2
对如下结点构造六次插值多项式和分段三次插值多项式
| $x_i$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | | $y_i$ | 0.368 | 0.135 | 0.050 | 0.018 | 0.007 | 0.002 | 0.001 |
并计算 $f(1.8),f(6.15)$
本博客分别使用 MATLAB 实现了 Lagrange 插值, Neville 插值, Newton 插值和三次样条插值
Neville 插值
令 $N\in\mathbb{R}^{(n+1)\times (n+1)}[x]$ 满足
则结果即为
$$ N_{n+1,n+1}(x)\tag{2} $$
Newton 插值
$$ N(x)=f(x0)+\sum{k=1}^nf[x_0,x_1,...,xk]\prod{i=0}^{k-1}(x-x_i)\tag{3} $$
其中
三次样条插值 (本文采用自然样条插值)
设结果 $S(x)\in C^2[x_0,x_n]$ 满足
令
由 $\lim{x\to k^+}S'(x)=\lim{x\to k^-}S'(x),~\forall k\in[x_0,x_n]$ 知
$$ \lambdaiM{i-1}+2M_i+\muiM{i+1}=g_i,~i=1,2,...,n-1\tag{6} $$
又
$$ S''(x_0)=S''(x_n)=0\tag{7} $$
联立 $(6),(7)$, 有
解出 $M_i,~i=0,1,...,n$, 即求得 $S(x)$
{% icodeweb blog lang:matlab numanaexp-02/main.m %}
{% icodeweb blog lang:matlab numanaexp-02/input_check.m %}
{% icodeweb blog lang:matlab numanaexp-02/calc_lagrange.m %}
{% icodeweb blog lang:matlab numanaexp-02/calc_neville.m %}
{% icodeweb blog lang:matlab numanaexp-02/calc_newton.m %}
{% icodeweb blog lang:matlab numanaexp-02/calc_spline3.m %}
问题 1
| 方法 | 多项式 | $f(0.596)$ | $f(0.99)$ | | ------------- | ------ | ------------ | ----------- | | Lagrange 插值 | $P_1$ | $0.62573238$ | $1.0542298$ | | Neville 插值 | $P_1$ | $0.62573238$ | $1.0542298$ | | Newton 插值 | $P_1$ | $0.62573238$ | $1.0542298$ | | 三次样条插值 | $S_1$ | $0.62896167$ | $1.0842113$ |
其中
问题 2
| 方法 | 多项式 | $f(1.8)$ | $f(6.15)$ | | ------------- | ------ | ------------ | -------------- | | Lagrange 插值 | $P_2$ | $0.16476189$ | $0.0012658255$ | | Neville 插值 | $P_2$ | $0.16476189$ | $0.0012658255$ | | Newton 插值 | $P_2$ | $0.16476189$ | $0.0012658255$ | | 三次样条插值 | $S_2$ | $0.17116591$ | $0.0016228947$ |
其中
四种方法的优缺点如下
| 方法 | 优点 | 缺点 | | ------------- | ------------------------------------------- | ---------------------------------------------- | | Lagrange 插值 | 形式直观简洁, 推导容易 | 增加新结点时, 原有结果不能复用; 数值稳定性问题 | | Neville 插值 | 增加新结点时, 原有结果可以复用 | 形式不直观; 数值稳定性问题 | | Newton 插值 | 增加新结点时, 原有结果可以复用;形式直观简洁 | 数值稳定性问题 | | 三次样条插值 | 数值稳定性好 | 形式复杂, 时间复杂度高 |
令 $\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)$
{% icodeweb blog lang:matlab numanaexp-02/calc_lagrange_fast.m %}