Newton插值法
引子:在工程应用中,函数 y = f ( x ) y=f(x) y=f(x)可能不是一个具体的解析表达式,而是通过实验、测量或者中间计算得到的一组数据;或者解析表达式较复杂,不便于计算和使用。因此需要一个简单函数 y = y ( x ) y=y(x) y=y(x)来近似代替函数 y = f ( x ) y=f(x) y=f(x),使得
y
(
x
i
)
=
f
(
x
i
)
,
i
=
0
,
1
,
2
,
.
.
,
n
y(x_i)=f(x_i),i=0,1,2,..,n
y(xi)=f(xi),i=0,1,2,..,n
称函数
y
=
y
(
x
)
y=y(x)
y=y(x)为函数
y
=
f
(
x
)
y=f(x)
y=f(x)在点
x
0
,
x
1
,
…
,
x
n
x_0,x_1,\dots,x_n
x0,x1,…,xn处的插值函数。
插商
设函数
f
(
x
)
f(x)
f(x)在
[
a
,
b
]
[a,b]
[a,b]上有定义,
[
a
,
b
]
[a,b]
[a,b]上互异的节点
x
0
,
x
1
,
…
,
x
n
x_0,x_1,\dots ,x_n
x0,x1,…,xn的函数值为
f
(
x
0
)
,
f
(
x
1
)
,
f
(
x
2
)
,
…
,
f(x_0),f(x_1),f(x_2),\dots ,
f(x0),f(x1),f(x2),…,称
f
[
x
0
,
x
1
]
=
f
(
x
0
)
−
f
(
x
1
)
x
0
−
x
1
f[x_0,x_1]=\frac{f(x_0)-f(x_1)}{x_0-x_1}
f[x0,x1]=x0−x1f(x0)−f(x1)
为
f
(
x
)
f(x)
f(x)在
x
0
,
x
1
x_0,x_1
x0,x1处的一阶差商。
称
f
[
x
0
,
x
1
,
x
2
]
=
f
[
x
0
,
x
1
]
−
f
[
x
1
,
x
2
]
x
0
−
x
2
f[x_0,x_1,x_2]=\frac{f[x_0,x_1]-f[x_1,x_2]}{x_0-x_2}
f[x0,x1,x2]=x0−x2f[x0,x1]−f[x1,x2]为
f
(
x
)
f(x)
f(x)在$x_0,x_1,x_2处的二阶差商。
插值多项式
由差商的定义
f
(
x
)
=
f
(
x
0
)
+
f
[
x
,
x
0
]
(
x
−
x
0
]
f(x)=f(x_0)+f[x,x_0](x-x_0]
f(x)=f(x0)+f[x,x0](x−x0]
f
[
x
,
x
0
]
=
f
[
x
0
,
x
1
]
+
f
[
x
,
x
0
,
x
1
]
(
x
−
x
1
)
f[x,x_0]=f[x_0,x_1]+f[x,x_0,x_1](x-x_1)
f[x,x0]=f[x0,x1]+f[x,x0,x1](x−x1)
f
[
x
,
x
0
,
x
1
]
=
f
[
x
0
,
x
1
,
x
2
]
=
f
[
x
0
,
x
1
,
x
2
]
(
x
−
x
2
)
f[x,x_0,x_1]=f[x_0,x_1,x_2]=f[x_0,x_1,x_2](x-x_2)
f[x,x0,x1]=f[x0,x1,x2]=f[x0,x1,x2](x−x2)
…
\dots
…
f
[
x
,
x
0
,
x
1
,
…
,
x
n
−
1
]
=
f
[
x
0
,
x
1
,
…
,
x
n
−
1
,
x
n
]
+
f
[
x
,
x
0
,
x
1
,
…
,
x
n
−
1
,
x
n
]
(
x
−
x
n
)
f[x,x_0,x_1,\dots,x_{n-1}]=f[x_0,x_1,\dots,x_{n-1},x_n]+f[x,x_0,x_1,\dots,x_{n-1},x_n](x-x_n)
f[x,x0,x1,…,xn−1]=f[x0,x1,…,xn−1,xn]+f[x,x0,x1,…,xn−1,xn](x−xn)
依次将后一个灯饰代入前一个等式就有
f
(
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
−
1
,
x
n
]
(
x
−
x
0
)
(
x
−
x
1
)
…
(
x
−
x
n
−
1
)
+
f
[
x
,
x
0
,
x
1
,
…
,
x
n
]
(
x
−
x
0
)
(
x
−
x
1
)
…
(
x
−
x
n
)
f(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)+\dots+f[x_0,x_1,\dots,x_{n-1},x_n](x-x_0)(x-x_1)\dots(x-x_{n-1})+f[x,x_0,x_1,\dots,x_n](x-x_0)(x-x_1)\dots(x-x_n)
f(x)=f(x0)+f[x0,x1](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+⋯+f[x0,x1,…,xn−1,xn](x−x0)(x−x1)…(x−xn−1)+f[x,x0,x1,…,xn](x−x0)(x−x1)…(x−xn)
记为
f
(
x
)
=
N
n
(
x
)
+
f
[
x
,
x
0
,
x
1
,
…
,
x
n
−
1
,
x
n
]
P
n
+
1
(
x
)
f(x)=N_n(x)+f[x,x_0,x_1,\dots,x_{n-1},x_n]P_{n+1}(x)
f(x)=Nn(x)+f[x,x0,x1,…,xn−1,xn]Pn+1(x)
P
n
+
1
(
x
)
=
∏
i
=
0
n
(
x
−
x
i
)
P_{n+1}(x)=\prod_{i=0}^n(x-x_i)
Pn+1(x)=i=0∏n(x−xi)
将上式中的x取为插值节点,由
N
n
(
x
i
)
=
f
(
x
i
)
,
i
=
0
,
1
,
…
n
N_n(x_i)=f(x_i),i=0,1,\dots\,n
Nn(xi)=f(xi),i=0,1,…n,即
N
n
(
x
)
N_n(x)
Nn(x)是满足插值条件的
n
n
n次多项式,称之为
N
e
w
t
o
n
Newton
Newton插值多项式,其余项为
E
(
x
)
=
f
(
x
)
−
N
n
(
x
)
=
f
[
x
,
x
0
,
x
1
,
…
,
x
n
]
p
n
+
1
(
x
)
E(x)=f(x)-N_n(x)=f[x,x_0,x_1,\dots,x_n]p_{n+1}(x)
E(x)=f(x)−Nn(x)=f[x,x0,x1,…,xn]pn+1(x)
差商表
插值节点 | 零阶差商 | 一阶差商 | 二阶差商 | 三阶差商 | … \dots … |
---|---|---|---|---|---|
x 0 x_0 x0 | f ( x 0 ) f(x_0) f(x0) | ||||
x 1 x_1 x1 | f ( x 1 ) f(x_1) f(x1) | f [ x 0 , x 1 ] f[x_0,x_1] f[x0,x1] | |||
x 2 x_2 x2 | $f(x_2) | f [ x 1 , x 2 ] f[x_1,x_2] f[x1,x2] | f [ x 0 , x 1 , x 2 ] f[x_0,x_1,x_2] f[x0,x1,x2] | ||
x 3 x_3 x3 | f ( x 3 ) f(x_3) f(x3) | f [ x 2 , x 3 ] f[x_2,x_3] f[x2,x3] | f [ x 1 , x 2 , x 3 ] f[x_1,x_2,x_3] f[x1,x2,x3] | f [ x 0 , x 1 , x 2 , x 3 ] f[x_0,x_1,x_2,x_3] f[x0,x1,x2,x3] | |
… \dots … | … \dots … | … \dots … | … \dots … | … \dots … |
例题
设有如下表的数据,求f(0.596)的近似值
x i x_i xi | 0.40 | 0.55 | 0.65 | 0.80 | 0.90 | 1.05 |
---|---|---|---|---|---|---|
f ( x i ) f(x_i) f(xi) | 0.41075 | 0.57815 | 0.69675 | 0.88811 | 0.102652 | 1.25382 |
代码实现
X=input('请输入X的值');
Y=input('请输入Y的值');
x=input('请输入要拟合的节点的值');
n=length(X);
A=zeros(n,n+1);
A(:,1)=X;
A(:,2)=Y;
%计算差商表
for i=3:n+1
A(i-1:n,i)=(A(i-2:n-1,i-1)-A(i-1:n,i-1))./(A(1:n+2-i,1)-A(i-1:n,1));
end
%计算插值多项式
B=A(:,2:n+1);
disp(A);
disp(B);
C=zeros(n);
C(1,1)=1;
for i=2:n
C(i,i) = C(i-1,i-1)*(x-X(i-1));
end
disp(C);
f=0;
for j=1:n
f=f+B(j,j)*C(j,j);
end
%展示计算结果
disp("f(0.596)的拟合值为:");
disp(f);
%运行结果
请输入X的值[0.40,0.55,0.65,0.80,0.90,1.05]
请输入Y的值[0.41075,0.57815,0.69675,0.88811,1.02652,1.25382]
请输入要拟合的节点的值0.596
0.4000 0.4108 0 0 0 0 0
0.5500 0.5782 1.1160 0 0 0 0
0.6500 0.6967 1.1860 0.2800 0 0 0
0.8000 0.8881 1.2757 0.3589 0.1973 0 0
0.9000 1.0265 1.3841 0.4335 0.2130 0.0312 0
1.0500 1.2538 1.5153 0.5249 0.2287 0.0314 0.0003
0.4108 0 0 0 0 0
0.5782 1.1160 0 0 0 0
0.6967 1.1860 0.2800 0 0 0
0.8881 1.2757 0.3589 0.1973 0 0
1.0265 1.3841 0.4335 0.2130 0.0312 0
1.2538 1.5153 0.5249 0.2287 0.0314 0.0003
1.0000 0 0 0 0 0
0 0.1960 0 0 0 0
0 0 0.0090 0 0 0
0 0 0 -0.0005 0 0
0 0 0 0 0.0001 0
0 0 0 0 0 -0.0000
f(0.596)的拟合值为:
0.6319