您当前的位置: 首页 > 

RuiH.AI

暂无认证

  • 0浏览

    0关注

    274博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

数值计算之 插值法(2)多项式插值——牛顿插值法

RuiH.AI 发布时间:2021-11-17 16:31:52 ,浏览量:0

数值计算之 插值法(2)多项式插值——牛顿插值法
  • 拉格朗日插值法
  • 牛顿插值的递推
  • 差商
  • 牛顿插值法

拉格朗日插值法

上篇指出函数 f ( x ) f(x) f(x)的插值可以用一个多阶多项式 P ( x ) P(x) P(x)表示: P ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n P(x)=a_0+a_1x+a_2x^2+\dots+a_nx^n P(x)=a0​+a1​x+a2​x2+⋯+an​xn

拉格朗日插值法将一个多阶多项式拆分为多个多阶多项式的和,当出现新的节点值时,需要重新计算各多项式,提升了计算量。牛顿插值法解决了重新计算的问题。

牛顿插值的递推

牛顿插值法使用了递推的思想。对于未知表达式的函数 f ( x ) f(x) f(x),知道其节点 ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) ) , … , ( x n , f ( x n ) ) (x_0,f(x_0)),(x_1,f(x_1)),\dots,(x_n,f(x_n)) (x0​,f(x0​)),(x1​,f(x1​)),…,(xn​,f(xn​))。

假设 f k ( x ) f_k(x) fk​(x)是采样完一个节点后的插值结果。第一次插值需要满足节点 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0​,f(x0​)): f 0 ( x ) = f ( x 0 ) f 0 ( x 0 ) = f ( x 0 ) f_0(x)=f(x_0) \\ f_0(x_0)=f(x_0) f0​(x)=f(x0​)f0​(x0​)=f(x0​) 对于第二次插值,需要满足节点 ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) ) (x_0,f(x_0)),(x_1,f(x_1)) (x0​,f(x0​)),(x1​,f(x1​)): f 1 ( x ) = f 0 ( x ) + b 1 ( x − x 0 ) f 1 ( x 0 ) = f ( x 0 ) f i n d : b 1 s . t . f 1 ( x 1 ) = f 0 ( x 1 ) + b 1 ( x 1 − x 0 ) = f ( x 1 ) b 1 = f ( x 1 ) − f ( x 0 ) x 1 − x 0 f_1(x)=f_0(x)+b_1(x-x_0) \\ f_1(x_0)=f(x_0) \\ \quad \\ find:\quad b_1 \\ s.t.\quad f_1(x_1)=f_0(x_1)+b_1(x_1-x_0)=f(x_1) \\ \quad \\ b_1=\frac{f(x_1)-f(x_0)}{x_1-x_0} f1​(x)=f0​(x)+b1​(x−x0​)f1​(x0​)=f(x0​)find:b1​s.t.f1​(x1​)=f0​(x1​)+b1​(x1​−x0​)=f(x1​)b1​=x1​−x0​f(x1​)−f(x0​)​ 对于第三次插值,需要满足节点 ( x 0 , f ( x 0 ) ) , ( x 1 , f ( x 1 ) , ( x 2 , f ( x 2 ) ) ) (x_0,f(x_0)),(x_1,f(x_1),(x_2,f(x_2))) (x0​,f(x0​)),(x1​,f(x1​),(x2​,f(x2​))): f 2 ( x ) = f 1 ( x ) + b 2 ( x − x 0 ) ( x − x 1 ) f 2 ( x 0 ) = f 1 ( x 0 ) = f ( x 0 ) f 2 ( x 1 ) = f 1 ( x 1 ) = f ( x 1 ) f i n d : b 2 s . t . f 2 ( x 2 ) = f 1 ( x 2 ) + b 2 ( x 2 − x 0 ) ( x 2 − x 1 ) = f ( x 2 ) b 2 = f ( x 2 ) − f ( x 1 ) x 2 − x 1 − f ( x 1 ) − f ( x 0 ) x 1 − x 0 x 2 − x 0 f_2(x)=f_1(x)+b_2(x-x_0)(x-x_1) \\ f_2(x_0)=f_1(x_0)=f(x_0) \\ f_2(x_1)=f_1(x_1)=f(x_1) \\ \quad \\ find:\quad b_2 \\ s.t.\quad f_2(x_2)=f_1(x_2)+b_2(x_2-x_0)(x_2-x_1)=f(x_2) \\ \quad \\ b_2=\frac{\frac{f(x_2)-f(x_1)}{x_2-x_1} -\frac{f(x_1)-f(x_0)}{x_1-x_0}}{x_2-x_0} f2​(x)=f1​(x)+b2​(x−x0​)(x−x1​)f2​(x0​)=f1​(x0​)=f(x0​)f2​(x1​)=f1​(x1​)=f(x1​)find:b2​s.t.f2​(x2​)=f1​(x2​)+b2​(x2​−x0​)(x2​−x1​)=f(x2​)b2​=x2​−x0​x2​−x1​f(x2​)−f(x1​)​−x1​−x0​f(x1​)−f(x0​)​​ 于是,每次插值的结果都可以看成是上次插值的结果加上本次插值的影响,从而大幅减少了计算量: P ( x ) = f n − 1 ( x ) + b n ( x − x 0 ) ( x − x 1 ) … ( x − x n − 1 ) P(x)=f_{n-1}(x)+b_n(x-x_0)(x-x_1)\dots(x-x_{n-1}) \\ P(x)=fn−1​(x)+bn​(x−x0​)(x−x1​)…(x−xn−1​)

我们要做的就是计算系数 b b b的表达式。

差商

上面计算出了 b 1 , b 2 b_1,b_2 b1​,b2​的表达式。实际上系数 b b b符合差商形式。差商的计算如下所示: 一 阶 差 商 : b 1 = f [ x 0 , x 1 ] = f ( x 1 ) − f ( x 0 ) x 1 − x 0 二 阶 差 商 : b 2 = f [ x 0 , x 1 , x 2 ] = f [ x 0 , x 1 ] − f [ x 1 , x 2 ] x 0 − x 2 = f ( x 2 ) − f ( x 1 ) x 2 − x 1 − f ( x 1 ) − f ( x 0 ) x 1 − x 0 x 2 − x 0 三 阶 差 商 : b 3 = f [ x 0 , x 1 , x 2 , x 3 ] = f [ x 0 , x 1 , x 2 ] − f [ x 1 , x 2 , x 3 ] x 0 − x 3 n 阶 差 商 : b n = f [ x 0 , x 1 , … , x n ] = f [ x 0 , x 1 , … , x n − 1 ] − f [ x 1 , x 2 , … , x n ] x 0 − x n 一阶差商:\\ \quad \\ b_1=f[x_0,x_1]=\frac{f(x_1)-f(x_0)}{x_1-x_0} \\ \quad \\ 二阶差商:\\ \quad \\ b_2=f[x_0,x_1,x_2] =\frac{f[x_0,x_1]-f[x_1,x_2]}{x_0-x_2} = \frac{\frac{f(x_2)-f(x_1)}{x_2-x_1} -\frac{f(x_1)-f(x_0)}{x_1-x_0}}{x_2-x_0} \\ \quad \\ 三阶差商:\\ \quad \\ b_3 = f[x_0,x_1,x_2,x_3] = \frac{f[x_0,x_1,x_2]-f[x_1,x_2,x_3]}{x_0-x_3} \\ \quad \\ n阶差商: \\ \quad \\ b_n = f[x_0,x_1,\dots,x_n]=\frac{f[x_0,x_1,\dots,x_{n-1}]-f[x_1,x_2,\dots,x_{n}]}{x_0-x_n} 一阶差商:b1​=f[x0​,x1​]=x1​−x0​f(x1​)−f(x0​)​二阶差商:b2​=f[x0​,x1​,x2​]=x0​−x2​f[x0​,x1​]−f[x1​,x2​]​=x2​−x0​x2​−x1​f(x2​)−f(x1​)​−x1​−x0​f(x1​)−f(x0​)​​三阶差商:b3​=f[x0​,x1​,x2​,x3​]=x0​−x3​f[x0​,x1​,x2​]−f[x1​,x2​,x3​]​n阶差商:bn​=f[x0​,x1​,…,xn​]=x0​−xn​f[x0​,x1​,…,xn−1​]−f[x1​,x2​,…,xn​]​ 对于差商 f [ x 1 , x 2 , … , x n ] f[x_1,x_2,\dots,x_n] f[x1​,x2​,…,xn​]而言,序号下标的顺序不影响差商的值。

牛顿插值法

把差商代入牛顿插值递推中,就得出了牛顿插值多项式的一般形式: P ( 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 ) + … + f [ x 0 , x 1 , … , x n ] ( x − x 0 ) ( x − x 1 ) … ( x − x n − 1 ) P(x)=f(x_0)+f[x_0,x_1](x-x_0)\\ \quad\quad\quad +f[x_0,x_1,x_2](x-x_0)(x-x_1) \\ \quad +\dots \\ +f[x_0,x_1,\dots,x_n](x-x_0)(x-x_1)\dots(x-x_{n-1}) P(x)=f(x0​)+f[x0​,x1​](x−x0​)+f[x0​,x1​,x2​](x−x0​)(x−x1​)+…+f[x0​,x1​,…,xn​](x−x0​)(x−x1​)…(x−xn−1​) 实际插值时,只需要把上一次采样后插值的结果 P n − 1 P_{n-1} Pn−1​存储下来,下一次采样时直接求 P n − 1 P_{n-1} Pn−1​与新项的和就行了,节省了计算量和存储空间。

关注
打赏
1658651101
查看更多评论
立即登录/注册

微信扫码登录

0.0901s