数值分析与matlab学习笔记——多项式插值法

多项式插值

一点背景

  当所给函数性质良好时,我们可以用性质同样良好的多项式函数(连续且可导)来拟合,介绍一个分析数学的定理。

Weierstrass逼近定理:设 f ( x ) f(x) f(x)是闭区间上的连续函数,则存在多项式函数列 { f n ( x ) } n = 1 ∞ \{f_n(x)\}^\infty_{n=1} {fn(x)}n=1,使得 { f n ( x ) } n = 1 ∞ \{f_n(x)\}^\infty_{n=1} {fn(x)}n=1一致收敛于 f ( x ) f(x) f(x)

  这个定理提供了多项式函数列拟合所给函数的可能性。这里的多项式函数的极限既泰勒级数。
  这里的一致收敛的一致性可以理解为函数列在 x i x_i xi形成的数列 f ( x i ) f(x_i) f(xi)每个点都以统一的(不因为坐标 x i x_i xi改变而改变)有限程度接近目标函数 f ( x ) f(x) f(x),不会出现随着点数变多,函数列中会出现某点数列找不到统一的接近度的情况。

一致收敛的充要条件: lim ⁡ n → + ∞ s u p x ∈ D ∣ f ( x ) − f n ( x ) ∣ = 0 \lim\limits_{n \to +\infty}sup_{x\in D}\lvert f(x)-f_n(x)\rvert=0 n+limsupxDf(x)fn(x)∣=0

  从上可以更清晰地看出一致收敛的含义。同时也反映出(不太严格,为了方便理解)当多项式阶数增加,所能拟合的函数也会越精确,当n到无穷大时可以认为多项式函数能完美拟合原函数。

多项式插值的存在唯一性

  设在区间[a,b]上给定n+1个点 a ⩽ x 0 < x 1 < ⋯ < x n ⩽ b a\leqslant x_0<x_1<\dots<x_n\leqslant b ax0<x1<<xnb上的函数值分别为 y i = f ( x i ) y_i=f(x_i) yi=f(xi),求次数不超过n次的多项式 P ( x ) = ∑ i = 0 n a i x i P(x)= \sum_{i=0}^{n}{a_ix^i} P(x)=i=0naixi使得 P ( x i ) = f ( x i ) P(x_i)=f(x_i) P(xi)=f(xi)
  可以写出线性方程组:
( 1 x 0 ⋯ x 0 n 1 x 1 ⋯ x 1 n ⋮ ⋮ ⋱ ⋮ 1 x n ⋯ x n n ) ∗ ( a 0 a 1 ⋮ a n ) = ( y 0 y 1 ⋮ y n ) \begin{pmatrix} 1&x_0&\cdots& x^n_0\\ 1& x_1&\cdots& x^n_1\\ \vdots & \vdots&\ddots&\vdots \\ 1&x_n&\cdots&x^n_n \end{pmatrix}*\begin{pmatrix} a_0\\a_1\\\vdots\\a_n \end{pmatrix}=\begin{pmatrix} y_0\\y_1\\\vdots\\y_n \end{pmatrix} 111x0x1xnx0nx1nxnn a0a1an = y0y1yn
  系数矩阵为范德蒙德(Vandermonde)矩阵,很显然满秩。
  由克拉默法则(Cramer’s Rule) a i a_i ai有且仅有一个解。
  存在唯一性得证

Lagrange插值法

n次插值基函数

l i ( x ) = ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x i − 1 ) ( x − x i + 1 ) ⋯ ( x − x n ) ( x i − x 0 ) ( x i − x 1 ) ⋯ ( x i − x i − 1 ) ( x i − x i + 1 ) ⋯ ( x i − x n ) l_i(x)=\frac{(x-x_0)(x-x_1)\cdots(x-x_{i-1})(x-x_{i+1})\cdots(x-x_n)} {(x_i-x_0)(x_i-x_1)\cdots(x_i-x_{i-1})(x_i-x_{i+1})\cdots(x_i-x_n)} li(x)=(xix0)(xix1)(xixi1)(xixi+1)(xixn)(xx0)(xx1)(xxi1)(xxi+1)(xxn)       可以看到基函数的规律性很强
  n次插值基函数的线性组合可以根据系数的不同表示出任意一个n次函数。

拉格朗日插值函数

L n ( x ) = ∑ i = 0 n y i ∗ l i ( x ) L_n(x)=\sum_{i=0}^{n}y_i*l_i(x) Ln(x)=i=0nyili(x)
  由上文我们知道多项式插值拟合 n + 1 n+1 n+1个点在不超过 n n n次的情况下有且仅有一条曲线,所以拉格朗日插值函数的表现形式是唯一的,牛顿插值公式在本质上与拉格朗日插值函数是同一个多项式函数。

matlab代码及效果
A=[1 2 3 4 5 6;2 4 8 16 32 64]  %第一行为xi,第二行为yi  yi=2^xi  
n=0:100*(1+size(A,2));x=n/100;S=0; 
for i=1:size(A,2)  %通过循环实现拉格朗日插值函数
    t=1;T=1
    for j=1:size(A,2)  %构造基函数
        if i~=j
        t=(x-A(1,j))/(A(1,i)-A(1,j));  %基函数的一部分   
        else t=1;
        end
        T=t.*T;
    end
    S=A(2,i).*T+S;
end
plot(x,S,'-o','MarkerIndices',[101,201,301,401,501,601]);grid;
figure
plot(x,2.^x-S);grid %两个函数相减观察一定范围内插值函数的拟合程度

可以看到左图对于x=7处的点预测度不错
     可以看到左图对于x=7处的点预测度不错

Newton插值

均差(差商)

均差的三种理解

n阶均差
d e f 1 : f [ x 0 , x 1 , ⋯   , x k ] = f [ x 1 , x 2 , ⋯   , x k ] − f [ x 0 , x 1 , ⋯   , x k − 1 ] x k − x 0 def1: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} def1f[x0,x1,,xk]=xkx0f[x1,x2,,xk]f[x0,x1,,xk1]

这种方法被称为“切头去尾”,便于构造均差表,是本文代码的主要算法。

d e f 2 : f [ x 0 , x 1 , ⋯   , x k ] = f [ x 1 , x 2 , ⋯   , x k − 2 , x k ] − f [ x 0 , x 1 , ⋯   , x k − 1 ] x k − x k − 1 def2:f[x_0,x_1,\cdots,x_k]=\frac{f[x_1,x_2,\cdots,x_{k-2},x_k]-f[x_0,x_1,\cdots,x_{k-1}]} {x_k-x_{k-1}} def2f[x0,x1,,xk]=xkxk1f[x1,x2,,xk2,xk]f[x0,x1,,xk1]

这种方法被称为“切根去尾”,便于构造均差表,是本文代码的主要算法。(根指紧靠尾部 x k x_k xk x k − 1 x_{k-1} xk1,分母规则为:去掉的部分减去切掉的部分。)

d e f 3 : f [ x 0 , x 1 , ⋯   , x k ] = ∑ j = 0 k f ( x j ) ( x j − x 0 ) ( x j − x 1 ) ⋯ ( x j − x j − 1 ) ( x j − x j + 1 ) ( x j − x k ) def3:f[x_0,x_1,\cdots,x_k]= \sum_{j=0}^k{\frac {f(x_j)} {(x_j-x_0)(x_j-x_1)\cdots(x_j-x_{j-1})(x_j-x_{j+1})(x_j-x_k)}} def3f[x0,x1,,xk]=j=0k(xjx0)(xjx1)(xjxj1)(xjxj+1)(xjxk)f(xj)

这个性质表明了均差与点的排列无关

  对于牛顿插值法,差商的计算和处理最为重要,对基函数的处理反而没有那么重要(这和lagrange插值法完全相反)这点我们会在接下来牛顿插值法的基函数看到。

N-基函数

n i ( x ) = ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x i − 1 ) n_i(x)=(x-x_0)(x-x_1)\cdots(x-x_{i-1}) ni(x)=(xx0)(xx1)(xxi1)

特别的,当 i = 0 i=0 i=0时, n 0 ( x ) = 1 n_0(x)=1 n0(x)=1

  从以上插值基函数我们可以看出,高次插值基包含了所有低次插值基的所有信息且顺序固定。若变动 x 0 x_0 x0则所有的基函数均会改变。

牛顿插值函数

N n ( x ) = ∑ i = 0 n f [ x 0 , x 1 , ⋯   , x i ] ∗ n i ( x ) N_n(x)=\sum_{i=0}^{n}f[x_0,x_1,\cdots,x_i]*n_i(x) Nn(x)=i=0nf[x0,x1,,xi]ni(x)

matlab代码及效果
A=[0 1 2 3 4 5 6;1 2 4 8 16 32 64]
n=0:100*(1+size(A,2));x=n/100;T=0;base=1;
Dtable=zeros(size(A,2),1+size(A,2));    %构建均差表
for i=1:size(A,2)         %均差表赋值
    Dtable(i,1)=A(1,i);
    Dtable(i,2)=A(2,i);
end
for i=2:size(A,2)+1
    for j=i:size(A,2)
        Dtable(j,i+1)=(Dtable(j,i)-Dtable(j-1,i))/(Dtable(j,1)-Dtable(j-(i-1),1));
    end           %赋值完毕
    if i==2
        base=1;
    else base=(x-A(1,i-2)).*base     %构建基函数
    end
    T=T+Dtable(i-1,i).*base
end
plot(x,T,'-o','MarkerIndices',[101,201,301,401,501,601]);grid;
figure
plot(x,2.^x-T);grid

可以看出拟合度还是不错的,与拉格朗日插值多项式相同

误差分析

  经推导我们可以得出误差函数: R n ( x ) = f ( x ) − P n ( x ) = f [ x , x 0 , x 1 , ⋯   , x k ] w n + 1 ( x ) R_n(x)=f(x)-P_n(x)=f[x,x_0,x_1,\cdots,x_k]w_{n+1}(x) Rn(x)=f(x)Pn(x)=f[x,x0,x1,,xk]wn+1(x) 其中 w n + 1 ( x ) = ∏ i = 0 n ( x − x i ) w_{n+1}(x)=\prod \limits_{i=0}^n{(x-x_i)} wn+1(x)=i=0n(xxi)与拉格朗日插值相同
  而实际上我们可以得出,拉格朗日插值法与牛顿插值法无论是在插值多项式或误差函数都完全一致。这里提供一种简便的思路,开头时我们已经证明对于 n + 1 n+1 n+1个点, n n n次及以下的插值多项式唯一,而误差函数 R n ( x ) = f ( x ) − P n ( x ) R_n(x)=f(x)-P_n(x) Rn(x)=f(x)Pn(x)也随之相等。借此我们可以得出 ∀ x i ∈ [ a , b ] , f ( n ) ( ξ ) n ! = f [ x , x 0 , x 1 , ⋯   , x k ] , ξ ∈ [ a , b ] \forall x_i\in[a,b], \frac{f^{(n)}(\xi)} {n!}=f[x,x_0,x_1,\cdots,x_k],\xi \in[a,b] xi[a,b],n!f(n)(ξ)=f[x,x0,x1,,xk],ξ[a,b]。这个关系式也可以用罗尔定理证明。

拉格朗日插值法与牛顿插值法异同

相同

1、插值多项式及误差函数完全相同
2、 f ( n ) ( ξ ) n ! = f [ x , x 0 , x 1 , ⋯   , x k ] \frac{f^{(n)}(\xi)} {n!}=f[x,x_0,x_1,\cdots,x_k] n!f(n)(ξ)=f[x,x0,x1,,xk]
3、都是基函数结构

不同

1、基不同:拉格朗日基函数均为n次
      牛顿基函数次数从0到n
2、计算不同:L主要计算基whileN主算均差
3、高次牛顿插值基函数包含低次,而拉格朗日不同。若新加节点,对于牛顿插值法而言,仅计算第n+1次基函数及均差即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值