Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 22

《数值分析》复习参考题

¿
1. (误差与有效数字)为使 π 的相对误差小于0.001 %,至少应取几位有效数字?

解:相对误差与有效数字关系为
1
ε ¿r ≤ ×10−n+1 <0.001 %=10−5
2 a1
π 的第一位非零数字a 1=3,故
n> 6−lg 6
即n ≥ 6,至少应取 6 位有效数字。

2. (函数的误差估计)计算 y=ln x 。若 x ≈ 20 ,则取 x 的几位有效数字可保证 y 的相对误


差¿ 0.1 %?

解:

| | | | |e ( x )|
¿
x y (x ) ¿ x ( 1/ x ) ¿
¿ ' ¿ ¿ ¿
|e ( y )|=
¿
r |e r ( x )|= ¿ |e r ( x )|= r ¿
y(x )
¿
ln x ln x
因此,当
¿ 1 −n+ 1 ¿ ¿
εr (x ) ≤ × 10 < ε r ( y ) ln x
2 a1
时,可保证 y 的相对误差。于是

10−n+1 <10−3 ×2 a1 ln 20
因为 x 的准确值可能比 20 略小或略大,所以a 1可能是 1 或 2,取a 1=1可以保证a 1=2时
也成立
n> 4−lg ( 2 ln 20 ) ≈ 3.2
即n ≥ 4 , x 至少应取 4 位有效数字

= ,sin = ,sin π = √ 3 。分别利用sin x 的 1 次,2


π 1 π 1
3. (Lagrange 插值)已知sin
6 2 4 √2 3 2
次 Lagrange 插值计算sin 50 °并估计误差。

解:50 °=

18
π π
,在区间 , 内。
4 3 ( )
π π
① 由 和 两点一次 Lagrange 插值外推
6 4
π π
x− x−
L1 ( x ) =
π π

4 π
sin +
6 π π

6 π
sin , R1 ( x )=
4
f ' ' (ξ )
2!
x−
π
6 ( )( x− π4 )
6 4 4 6

因为ξ ∈ ( π6 , π3 ) ''
,所以 f ( ξ )=−sin ξ ∈ ( −2√ 3 ,− 12 ) ,代入 x=

18
可得

1
sin 50 ° ≈ L1 ( 518π )≈ 0.77614 ,−0.01319< R ( 518π )←0.00762
1

π π
② 由 和 两点一次 Lagrange 插值内插
4 3
π π
x− x−
L1 ( x ) =
π π

3 π
sin +
4 π π

4 π
sin , R1 ( x )=
3
f ' ' (ξ )
2!
x−
π
4 ( )( x− π3 )
4 3 3 4

因为ξ ∈ ( π4 , π3 ) ''
,所以 f ( ξ )=−sin ξ ∈ ( −2√ 3 ,− √12 ) ,代入 x=

18
可得

sin 50 °≈ L1 ( 518π )≈ 0.76008 , 0.00538< R ( 518π )< 0.00660


1

③ 三点二次 Lagrange 插值

L ( x )=
( x− )( x− )
π
4
π
3 π
sin +
( x− )( x− )
π
6
π
3 π
sin +
( x− )( x− )
π
6
π
4
sin
π

( 6 4 )( 6 3 ) ( 4 6 )( 4 3 ) ( 3 6 )( 3 4 )
2
π π π π 6 π π π π 4 π π π π 3
− − − − − −

( )( x− π4 )( x− π3 )
' ''
f (ξ ) π
R2 ( x ) = x−
3! 6

因为ξ ∈ ( π6 , π3 ) '' '


,所以 f ( ξ )=−cos ξ ∈ ( −2√ 3 ,− 12 ) ,代入 x=

18
可得

sin 50 ° ≈ L2 ( 518π )≈ 76543 , 0.00044< R ( 518π )<0.00077


1

讨论:以上三种方法与精确值 0.7660444…的绝对误差分别为-0.01010, 0.00596,


0.00061。通常而言,内插法优于外推法,2 次优于 1 次。

4. (Newton 差分)已知数值表如下,分别用向前、向后 Newton 插值公式求sin 0.57891


的近似值。
x 0.4 0.5 0.6 0.7
sin x 0.38942 0.47943 0.56464 0.64422

解:作差分表
x sin x Δ Δ2 Δ3
0.4 0.38942
0.5 0.47943 0.09001
0.6 0.56464 0.08521 -0.00480
0.7 0.64422 0.07958 -0.00563 -0.00083
①Newton 前插公式

2
n
f ( n+1 ) ( ξ )
N n ( x ) =∑ C Δ f ( x 0 ) , R n ( x )=
k k n+1
t t ( t−1 ) ⋯ ( t−n ) h
k=0 ( n+1 ) !
取 x 0=0.5 , x 1=0.6 , x 2=0.7 , x=x 0 +th,h=0.1,t=0.7891。
t ( t−1 ) 2 0.7891 ( 0.7891−1 )
sin 0.57891 ≈ N 2 ( x )=f 0 +t Δ f 0 + Δ f 0=0.47943+0.7891× 0.08521+ (−0.005
2! 2
误差
−cos ξ 3
R2 ( x ) = t ( t−1 ) ( t−2 ) h , 0.5<ξ <0.7
3!

|−cos3 0.5 0.7891( 0.7891−1)( 0.7891−2)( 0.1) |=2.95× 10


|R2 ( x )|< 3 −5

②Newton 后插公式
n
f (n +1) ( ξ )
N n ( x )=∑ (−1 ) C ∇ f ( xn ) , Rn ( x )=
k k k n+ 1
−t t ( t+1 ) ⋯ ( t +n ) h
k=0 ( n+1 ) !
取 x 0=0.4 , x 1=0.5 , x 2=0.6 , x=x 0 +th,h=0.1,t=−0.2109 。
t ( t+1 ) 2
sin 0.57891 ≈ N 2 ( x )=f 2+ t ∇ f 2 +
∇ f2
2!
(−0.2109 ) (−0.2109+1 )
¿ 0.56460+ (−0.2109 ) × 0.08521+ (−0.00 480 ) ≈ 0.54707
2
误差
−cos ξ
R2 ( x ) = t ( t=1 ) ( t+2 ) h3 ,0.4 <ξ <0.6
3!

|−cos3 0.4 (−0.2109) (−0.2109+1) (−0.2109+2) ( 0.1) |=4.57× 10


|R2 ( x )|< 3 −5

5. (Hermite 插值)设给定区间[ x 0 , x 1 ]两端点处的函数值与导数值如下:

x x0 x1
f (x) y0 y1
m0 m1
f '(x)

'
求插值多项式 H 3 ( x ) ,使满足 H 3 ( xi ) = y i, H 3 ( xi ) =m i,i=0 , 1。

解:借鉴 Lagrange 插值多项式的构造方法,设

H 3 ( x ) =α 0 ( x ) y 0+ α 1 ( x ) y 1+ β 0 ( x ) m0 + β 1 ( x ) m 1

插值基函数在 x 0 、 x 1处的函数值和导数值如下
α0 α1 β0 β1
α '0 α '1 β '0 β '1
x0 1 0 0 0 0 1 0 0
x1 0 0 1 0 0 0 0 1

3
' ' '
注意到,α i ( x j )=δ ij ,α i ( x i ) =α i ( x j ) =0 , β i ( x i ) =βi ( x j ) =0, β i ( x j )=δ ij,

所以, x i是α j 的两重零点,是 β i的一重零点,是 β j 的两重零点,将以上 4 个基函数设


为 3 次多项式

{
2 n
α i ( x )=( ai x +bi ) l i ( x ) x− x j
,i=0 ,1 ,l i ( x )=∏ ( Lagrange 插值 基函数)
2
βi ( x )=c i ( x−x i ) l i ( x ) j ≠i x i−x j
j=0

' '
由α 0 ( x0 ) =1,α 0 ( x0 ) =0 , β 0 ( x0 ) =1得

{
−2

{
a0 =
a0 x+ b0 =1 x 0−x 1
'
a0 +2 ( a 0 x +b0 ) l 0 ( x 0 )=0 ⟹ 2 x0
b 0=1+
c 0=1 x 0−x 1
c 0=1
由对称性可得a 1、b 1、c 1,于是

(
H 3 ( x ) = y 0 1−2
x−x 0 2
x0 −x1 )
l 0 ( x ) + y 1 1−2
(
x− x1 2
)
l ( x )+ m0 ( x−x 0 ) l 20 ( x ) +m1 ( x −x1 ) l 21 ( x )
x 1−x 0 1
6. (Hermite 插值)假设给定的函数表如下:
x x0 x1 x2
f (x) y0 y1 y2
m1
f '(x)

'
求插值多项式 H 3 ( x ) ,使满足 H 3 ( xi ) = y i, H 3 ( x1 ) =m 1,i=0 , 1 , 2。

解:先构造不考虑导数值条件的插值多项式,再添加一项以满足导数值条件,设

H 3 ( x ) = y 0 +f [ x 0 , x 1 ] ( x −x 0) + f [ x 0 , x 1 , x 2 ] ( x −x0 ) ( x−x 1 ) + k ( x −x0 ) ( x−x 1 ) ( x−x 2 )

前三项即 Newton 插值多项式 N 3 ( x ) ,满足 H 3 ( xi ) = y i;最后一项满足导数值条件,由

'
H 3 ( x1 ) =m 1
解得
m1 −f [ x 0 , x 1 ] −f [ x 0 , x 1 , x 2 ] ( x 1−x 0 )
k=
( x 1−x 0 ) ( x 1−x 2 )
m 1−f [ x 0 , x 1 ] −f [ x0 , x 1 , x 2 ] ( x 1−x 0 )
H 3 ( x ) = y 0 +f [ x 0 , x 1 ] ( x −x 0) + f [ x 0 , x 1 , x 2 ] ( x −x0 ) ( x−x 1 ) + ( x− x0 ) ( x−
( x 1−x 0 )( x 1−x 2 )

7. (Hermite 插值)求次数小于 3 的多项式,使满足条件

4
P ( x 0 )=f ( x0 ) , P' ( x 0 ) =f ' ( x 0 ),

'' ''
P ( x 0 )=f ( x 0 ), P ( x 1) =f ( x 1 )。

解:在 x 0处函数值,一阶导数和二阶导数均相等,可以设为 Taylor 展开的前 3 项,再

添加一项以满足 P ( x 1) =f ( x 1 ),设

' 1 '' 2 3
P ( x ) =f ( x 0 ) + f ( x 0 ) ( x−x 0 ) + f ( x 0 )( x −x0 ) + A ( x−x 0 )
2

前 3 个条件已满足,解 P ( x 1) =f ( x 1 )得

A=−
[ f ( x0 )
( x 1−x 0 )
3
+
f ' ( x0 )
( x 1−x 0 )
2
+
f ' ' ( x0 )
2 ( x1 −x0 ) ]
' 1 ''
2
2
P ( x ) =f ( x 0 ) + f ( x 0 ) ( x−x 0 ) + f ( x 0 )( x −x0 ) −
f ( x0)
3
+
[
f ' ( x0 )
( x 1−x 0 ) ( x 1−x 0 )
2
+
2
f ' ' ( x0 )
( 1 0)
x −x ]
( x−x 0 )
3

2
8. (最小二乘法)用 y=c 0+ c 1 x+ c 2 x 来拟合以下数据点并计算平方误差,w ≡ 1。

x 1 2 3 4
y 4 10 18 26

解:①以{ 1 , x , x 2 }为基函数,相应的法方程组为

[ ][ ] [ ]
2
Σ1 Σ xi Σ x i c0 Σ yi
Σ x i c1 = Σ xi y i
2 3
Σ x i Σ xi
2
Σ x i c2
2 3 4
Σ x i Σ xi Σ xi y i

[ ][ ] [ ]
4 10 30 c 0 58
10 30 100 c 1 = 182
30 100 354 c 2 622

解得c 0=−3/2, c 1=49/10, c 2=1/2 。

② 以正交多项式组{ φ0 ( x ) , φ1 ( x ) ,φ 2 ( x ) }为基函数,设

y=a0 φ0 ( x )+ a1 φ1 ( x ) +a 2 φ 2 ( x )

Step1:构造正交多项式

( x φ0 , φ0 ) 5
φ 0 ( x )=1 , α 1= = ;
( φ0 , φ 0 ) 2

5
5 ( x φ1 , φ1 ) 5 ( φ1 , φ1 ) 5
φ 1 ( x )=( x−α 1 ) φ0 ( x )=x− , α 2 = = , β1 = = ;
2 ( φ 1 , φ1 ) 2 ( φ0 , φ0 ) 4

φ 2 ( x )=( x−α 1 ) φ1 ( x )−β 1 φ 0 ( x )=x 2−5 x +5


Step1:求解系数

( y , φi )
a i= , i=0 , 1 ,2
( φi , φ i )
解得a 0=29/2 , a1=37 /5 , a2=1/2,

y=
29
2
× 1+
37
5 ( )
5 1
x − + ( x 2−5 x +5 ) =
2 2
−3 49 1
+ x+ x 2
2 10 2
两法所得结果相同,现计算平方误差
i 1 2 3 4 Σ
y 4 10 18 26 58
2
y 16 100 324 676 1116
^y 3.9 10.3 17.7 26.1 58
^y 2 15.21 106.09 313.29 681.21 1115.8

2 2 2
δ =Σ y i −Σ ^y i =0.2

9. (代数精度)确定以下求积公式中的待定参数,使其代数精度最高,并指明所构造出
的求积公式所具有的代数精度:
2h

∫ f ( x ) d x ≈ A−1 f (−h ) + A0 f ( 0 )+ A 1 f ( h )
−2 h

解:列表如下
2h
f (x)
∫ f (x)d x A−1 f (−h )+ A 0 f ( 0 ) + A1 f ( h )
−2 h

1 4h A−1+ A 0+ A 1
x 0
(− A−1+ A 1 ) h
16 3
x2 h
3 ( A−1+ A 1 ) h2
3
x 0
(− A−1+ A 1 ) h3
64 5
x4 h
5 ( A−1+ A 1 ) h4
解方程组

6
{
8

{
A−1 + A0 + A 1=4 h A−1= h
3
(− A−1+ A 1 ) h=0 ,得 A = −4 h
0
2 16 3 3
( −1 1 )
A + A h =
3
h 8
A1 = h
3

3 4 64 5
此时(− A−1+ A 1 ) h =0 ,( A−1+ A 1 ) h ≠ h 。求积公式具有最高代数精度,为 3 次。
5
1
10. (Simpson 公式)用 Simpson 公式求积分 ∫ e−x d x 并估计误差。
0

解:积分值

( )
1 −1
1−0 0
T =∫ e d x ≈ −x
e + 4 e 2 +e−1 ≈ 0.63233
0 6
误差

( )
4 −ξ
−1−0 1−0 ( 4 ) ( ) −e
R [ f ]= f ξ= , ξ ∈( 0 , 1)
180 2 2880
−0
|R [ f ]|< e ≈ 0.00035
2880

9
11. (复化求积)分别用复化梯形公式和复化 Simpson 公式计算积分 ∫ √ x d x ,n=4 ,并
1

估计误差。

解:①复化梯形公式
h=( b−a ) /n=2
9
h
T 4=∫ √ x d x=
2
[ √1+2 ( √ 3+ √ 5+ √ 7 ) +√ 9 ] =17.22774
1

误差
−9−1 2 '' 2
R [ f ]= h f ( ξ )= ,ξ ∈ ( 1,9 )
12 3ξ √ξ
|R [ f ]|< 2/3
② 复化 Simpson 公式
'
h =2h=4
9
h'
S2=∫ √ x d x=
6
[ √1+ 4 ( √ 3+ √ 7 ) +2 √5+ √ 9 ]=17.32223
1

误差
7
( )
4
−9−1 h' 16 ξ−7 /2
R [ f ]= f (4 ) ( ξ )= , ξ ∈ ( 1,9 )
180 2 24

|R [ f ]|< 2/3
9

注: ∫ √ x d x=52/3=17.33333,估计误差只是为了加深对误差公式的记忆,实际的
1

误差没有 2/3 这么大。

3
12. (Romberg 求积)用 Romberg 求积方法计算积分 ∫ x √1+ x 2 d x ,使误差不超过1 0−5。
0

解:复化梯形法的递推公式:
b−a
T 1=
2
[ f ( a ) +f ( b ) ]

[ ]
k−1
2
1 b−a b−a
T 2 = T 2 + k ∑ f a+ ( 2 i−1 ) k
k k−1
2 2 i=1 2
Romberg 求积算法:

(k) 4m (k+1 ) 1 (k )
Tm = m
T m−1 − m T m−1
4 −1 4 −1
用 MATLAB 运算,代码见附录 1。计算结果如下表:
k m 0 1 2 3 4 5
0 14.230249
1 11.171370 10.151743
2 10.443797 10.201272 10.204574
3 10.266367 10.207224 10.207621 10.207669
4 10.222270 10.207571 10.207594 10.207594 10.207594
5 10.211261 10.207591 10.207592 10.207592 10.207592 10.207592
e -4.078506 0.052831 0.003095 -0.000075 -0.000001
3

所以, ∫ x √1+ x 2 d x ≈ 10.207592。


0

13. (Gauss 型求积)试构造 Gauss 型求积公式


1

∫ √1x f ( x ) d x ≈ A 0 f ( x0 ) + A 1 f ( x1 )。
0

1
解:Step1:构造正交多项式。设φ 2 ( x )=x + bx+ c 为区间[ 0 , 1 ]上带权
2
正交,则
√x

8
1
1 2 2
( φ2 ( x ) ,1 ) =∫ φ2 ( x ) ∙1 d x = + b+2 c=0
0 √x 5 3

1
1 2 2 2
( φ2 ( x ) , x ) =∫ φ 2 ( x ) ∙ x d x= + b+ c=0
0 √x 7 5 3
2 6 3
解得b=−6 /7 ,c=3 /35,φ 2 ( x )=x − x+
7 35

Step2:求解 Gauss 点。令φ 2 ( x )=0 解得

x 0=
1
7 ( √)
3−2
6
5
1
, x 1= 3+2
7
6
5 ( √)
Step3:确定 Gauss 求积系数。令 f ( x )=1 , x
1
1
A0 + A 1=∫ ∙ 1d x=2
0 √x
1
1 2
A0 x 0+ A 1 x 1=∫ ∙ x d x=
0 √x 3
解得

A0 =1+
1 5
3 6 √
, A1 =1−
1 5
3 6 √
14. (LU 分解)下述矩阵能否分解为 LU(其中 L 为单位下三角矩阵,U 为上三角矩阵)?
若能分解,那么分解是否唯一?

[ ] [ ] [ ]
1 2 3 1 1 1 1 2 6
A= 2 4 1 , B= 2 2 1 ,C= 2 5 15 。
4 6 7 3 3 1 6 15 46
解:①矩阵 A

∆ 1=1>0 , ∆2=
1 2
2 4 | |
=0 , ∆3=| A|=−10 ≠ 0

矩阵 A 不能 LU 分解,但换行后可以;
以下为一例:

[ ] [ ]
1 2 3 1 2 3
A= 2 4 1 r 2−2 r 1 , r 3−4 r 1 0 0 −5
4 6 7 →
0 −2 −5
先交换 2,3 行变为 A1

[ ] [ ]
1 2 3 1 2 3
A 1= 4 6 7 r 2−4 r 1 ,r 3−2 r 1 0 −2 −5
2 4 1 →
0 0 −5

9
[ ] [ ] [ ][ ]
1 0 0 1 2 3 1 0 0 1 2 3
−4 1 0 A = 0 −2 −5 ⟹ A1= 4 1 0 0 −2 −5
−2 0 1 1 0 0 −5 2 0 1 0 0 −5
② 矩阵 B

∆ 1=1>0 , ∆2= |12 12|=0, ∆ =|B|=0


3

矩阵 B可以 LU 分解,但不唯一;
以下为一例:

[ ] [ ] [ ]
1 1 1 1 1 1 1 1 1
B= 2 2 1 r 2−2 r 1 , r 3 −3 r 1 0 0 −1 r 3−k r 2 0 0 −1
3 3 1 →
0 0 −2 →
0 0 k −2

[ ][ ] [ ]
1 0 0 1 0 0 1 1 1
0 1 0 −2 1 0 B= 0 0 −1
0 −k 1 −3 0 1 0 0 k−2

[ ][ ][ ] [ ][ ]
1 0 0 1 0 0 1 1 1 1 0 0 1 1 1
⟹ B= 2 1 0 0 1 0 0 0 −1 = 2 1 0 0 0 −1
3 0 1 0 k 1 0 0 k−2 3 k 1 0 0 k−2
其中,k 为任意常数,因此矩阵 B的 LU 分解不唯一;
③ 矩阵C

| |
∆ 1=1>0 , ∆2= 1 2 =1> 0 , ∆3=|C|=1≠ 0
2 5
矩阵C 可以 LU 分解且唯一。
Doolittle Factorization:

( )
i−1 i−1
uij =aij −∑ l ik ukj , l ji = a ji−∑ l jk uki /uii
k=1 k=1

分解结果:

[ ][ ]
1 0 0 1 2 6
C= 2 1 0 0 1 3
6 3 1 0 0 1

[ ]
10 a 0
15. (迭代法及其收敛性)设 A= b 10 b , det A ≠ 0 ,用 a , b 表示解线性方程组
0 a 5
Ax=f 的 Jacobi 迭代与 Gauss-Seidel 迭代收敛的充分必要条件。

(k +1) −1 ( k) −1
解:① Jacobi 迭代: x =−D ( L+U ) x + D b
迭代矩阵

[ ][ ] [ ]
−1
10 0 0 0 a 0 0 a /10 0
−1
BJ =−D ( L+U )=− 0 10 0 b 0 b =− b /10 0 b /10
0 0 5 0 a 0 0 a /5 0

求 BJ 的特征值:

10
| |
λ a /10 0 3 ab
|λ E−BJ|= b /10 λ b /10 =λ λ2 − 100
0 a /5 λ
( )
因此,Jacobi 迭代收敛等价于

ρ ( BJ ) =max|λ ( B J )|=
√ 3 |ab|<1
10

100
|ab|<
3
(k +1) −1 ( ) −1
②Gauss-Seidel 迭代: x =−( D+ L ) U x k + ( D+ L ) b
迭代矩阵

[ ][ ] [ ]
−1
10 0 0 0 a 0 0 a /10 0
−1
BG−S =−( D+ L ) U=− b 10 0 0 0 b =− 0 −ab /100 b / 10
0 a 5 0 0 0 0 a2 b/500 −ab/50

求 BG−S 的特征值:

| |
λ a/10 0
|λ E−BG−S|= 0 λ−ab/100
2
0 a b /500
2
b/10 =λ λ −
λ−ab/50
3 ab
100 ( )
因此,Gauss-Seidel 迭代收敛等价于

ρ ( BG−S )=max| λ ( B G−S )|=


√ 3 |ab|<1
10

100
|ab|<
3

16. (收敛速度)对线性方程组 (31 22)( xx )=(−13 )


1

2
,若用迭代法

x (k +1)=x (k )+ α ( A x (k )−b ) , k=0, 1 ,…


求解,问α 在什么范围内取值可使迭代收敛,α 取什么值可使迭代收敛最快?

解:迭代矩阵: B=E+α A

|λ E− A|= λ−3 | −1 −2
λ−2 |
=( λ−1 ) ( λ−4 )

A 的特征值为 1 和 4,所以 B的特征值为1+α 和1+4 α , ρ ( B )=max| λ ( B )|图像如下:

11
5
Ymin
4.5 Ymax
Y=1
4

3.5

2.5

1.5 X -0.5
Y1
1

0.5
X -0.4
0 Y 0.6

-0.5
-1.5 -1 -0.5 0 0.5

所以,α ∈ (−0.5 , 0 )时 ρ ( B )< 1,迭代收敛;α =−0.4 时 ρ ( B )取最小值,收敛最快。

17. (SOR 方法)用 SOR 方法解线性方程组(取ω=0.9 )

{
5 x 1+ 2 x 2 + x 3=−12
−x 1+ 4 x 2+ 2 x 3=20
2 x1 −3 x 2 +10 x 3=3

要求当‖x ‖∞ <10−4 时迭代终止。


( k+1) ( k)
−x

解:SOR 方法的递推公式: x
(k +1)
=( D+ωL )−1 [ ( 1−ω ) D−ωU ] x ( k ) + ( D+ωL )−1 ω b
用 MATLAB 运算,代码见附录 2。经 8 次迭代,达到精度要求,

x (8 )=(−4.000 026 , 2.999 988, 2.000 004 )T

18. (Euler 方法)取步长 h=0.1,分别用显式 Euler 法、隐式 Euler 法、梯形公式、两步


Euler 法、改进 Euler 法和经典 Runge-Kutta 法求如下初值问题:

{
2x
y ' = y−
y , ( 0< x <1 )
y ( 0 )=1

注:精确解为 y= √ 1+2 x 。

解:①显式 Euler 法

y n+ 1= y n +hf ( x n , y n )

② 隐式 Euler 法

y n+ 1= y n +hf ( x n+1 , y n +1 )

(0 )
先以显式法得到的 y n+ 1值作为初值 y n+ 1,进行如下迭代,

12
y n+ 1 = y n+ hf ( x n+1 , y n +1 )
( k+1) ( k)

| ( k+1 ) (k )
| −3
当 y n +1 − y n+1 <10 时终止迭代,把 y n+ 1 作为隐式法等号右边的 y n+ 1。
( k+1)

③ 梯形公式(将①和②的两组数值解取平均)
④ 两步 Euler 法

y n+ 1= y n−1+ 2hf ( x n , y n )

( k +1)
同②,迭代方法以得到近似于精确解的 y 1,当 ¿ y 1 − y (1k )∨¿10−5时终止迭代。
⑤ 改进 Euler 法
h
y n+ 1= y n +
2 [
f ( x n , y n ) + f ( x n+1 , y n +hf ( x n , y n ) ) ]
⑥ 经典 Runge-Kutta 法(公式略)
各方法的计算结果如下(MATLAB 计算程序见附录 3):
x Explicit Implicit Trapezoid Two-step Modified Classical R-
K
0 1 1 1 1 1 1
0.1 1.1 1.090752 1.095376 1.090737 1.095909 1.095446
0.2 1.191818 1.174114 1.182966 1.181475 1.184097 1.183217
0.3 1.277438 1.251326 1.264382 1.259320 1.266201 1.264912
0.4 1.358213 1.323234 1.340723 1.338050 1.343360 1.341642
0.5 1.435133 1.390419 1.412776 1.407353 1.416402 1.414216
0.6 1.508966 1.453240 1.481103 1.477410 1.485956 1.483242
0.7 1.580338 1.511912 1.546125 1.540389 1.552514 1.549196
0.8 1.649783 1.566516 1.608149 1.603715 1.616475 1.612455
0.9 1.717779 1.617001 1.667390 1.661595 1.678166 1.673325
1 1.784771 1.663187 1.723979 1.719375 1.737867 1.732056

绘制散点图,并计算与解析解的绝对误差如下图所示:
1.8 -1
10
Explicit EM
Implicit EM
Trapezoid
1.7
Two-step EM
-2
Modified EM 10
Classical R-K
Analytical solution
1.6

-3
10
1.5
Explicit EM
Implicit EM
Trapezoid
1.4 -4 Two-step EM
10
Modified EM
Classical R-K

1.3
-5
10

1.2

-6
10
1.1

1 10-7
0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1

13
以上 6 种方法的精度阶数分别为 1、1、2、2、2、4,阶数越高越精确,与散点图吻合。

19. (方法的阶数)证明中点公式
h
2 (
1
y n+ 1= y n +hf x n + , y n+ hf ( xn , y n )
2 )
是二阶的。
h
证明:将 y ( x n+1 )和 y ( x n )在中点 x n + 处展开,
2

( ) ( ) ( ) y ( x + h2 )+o ( h )
2
h h ' h 1 h '' 3
y ( x n+1 )= y x n+ + y x n+ + n (1)
2 2 2 2! 2

( ) ( ) ( ) y ( x + h2 )+o ( h )
2
h h ' h 1 h '' 3
y ( x n )= y x n + − y x n+ + n (2)
2 2 2 2! 2

(1)−( 2),代入 y ( x n +h /2 )=f ( x n+ h/2, y ( x n+ h/2 ) )可得,


'

h
(
y ( x n+1 )= y ( x n ) +h f x n + , y x n+
2
h
2
+ o ( h3 ) ( )) (3)

局部截断误差为:

T n+1= y ( x n+1 ) − y n+1

[( h
2
h
2
h
2 ( 1
)) (
¿ [ y ( x n )− y n ] + h f x n + , y x n + −f x n + , y n+ hf ( x n , y n ) +o ( h3 )
2 )]
[( )
¿ 0+h y x n+
h
2
1
− y n− h y ' ( x n ) ∙
2
∂f
∂y ] |( h
(
x n+ , y xn +
2
h
2 ))
+ o ( h3 )

¿ 0+h ∙ o ( h ) ∙
2 ∂f
∂y |( h
(
x n+ , y x n +
2
h
2 ))
+ o ( h ) =o ( h )
3 3

因此中点公式是二阶的。

20. (绝对稳定区间)求隐式中点公式
h 1
(
y n+ 1= y n +hf x n + , ( y n+ y n+1 )
2 2 )
的绝对稳定区间。

解:对于模型方程 y ' =λ y ,隐式中点公式为


1
y n+ 1= y n + λ h ( y n + y n+1 )
2

(1− 12 λ h) y =(1+ 12 λ h) yn +1 n

14

1
1+ λ h
2 2+ λ h
y n+ 1= yn = y
1 2−λ h n
1− λ h
2

解 |2−λ h|
2+ λ h
<1 ,得绝对稳定区间为−∞ < λ h<0,即0< h<∞ 时隐式中点法是稳定的。

21. (绝对稳定区间)对于初值问题

y ' =−100 ( y −x2 ) +2 x , y ( 0 )=1。


(1)用 Euler 法求解,步长h 取什么范围的值,才能使计算稳定?
(2)若用四阶 Romberg-Kutta 法计算,步长h 如何选取?
(3)若用梯形公式计算,步长h 有无限制?
解:(1)Euler 法绝对稳定区间为
|1+ λ h|<1
式中

λ=f 'y =100


因此,可解得0< h<0.02时计算稳定。
(2) 四阶 Romberg-Kutta 法绝对稳定区间为
−2.78< λ h<0
所以当0< h<0.0278时计算稳定。
(3) 梯形法的绝对稳定区间为
0< h<∞
所以步长h 无限制。

22. (非线性方程求根)分别用二分法和 Newton 法求 x−tan x =0的最小正根。


解:先画草图选定二分法的求解区间( 4 ,5 ) 和 Newton 法的迭代初值 x 0=4.5。
6 6
y=tanx y=x-tanx
y=x x=pi/2
x=pi/2
5 5

4 4

3 3

2 2

1 1

0 0

-1 -1
-1 0 1 2 3 4 5 -1 0 1 2 3 4 5

① 二分法,计算过程如下:

15
k ak ¿ bk ¿ xk
f ( xk )

0 4 5 4.5 −¿
1 4.5 4.25 +¿
2 4.25 4.375 +¿
3 4.375 4.4375 +¿
4 4.4375 4.46875 +¿
5 4.46875 4.484375 +¿
6 4.484375 4.492187 +¿
5
假使要求的误差限为ε =10−2 ,经 6 次二分后,取区间中点 x ≈ 4.49,则

|x−x ¿|=( b 6−a 6 ) / 2=1/128< ε


②Newton 法

f ' ( x )=−tan 2 x

f ( xk ) xk 1
x k+1=x k − = −
'
f ( xk ) 2
sin x k tan x k

|x k+ 1−x k|<10−5时截止,计算结果见下表:
k 0 1 2 3
xk 4.5 4.4936139 4.4934097 4.4934095
−5
注:用 MATLAB 编程运算 16 次二分才能得到 10 精度(见附录 4),足见两法收敛
速度之差异。

23. (改进 Newton 法求方程重根)已知函数 f ( x )=x 4 −1.4 x 3−0.48 x 2+ 1.408 x−0.512

图像如下,比较 Newton 法和改进 Newton 法求方程 f ( x )=0的三重根的数值解的收敛速度


(精确解为 x=0.8 )。

0.5
X -1 X 0.8
Y0 Y0
0

-0.5

-1

-3 -2 -1 0 1 2 3

16
解:① Newton 法,迭代 14 次才能使|x−0.8|<10−3

② 改进 Newton 法,令

u ( x )=f ( x ) / f ' ( x )
则 f ( x )的重根变为u ( x )的单根,迭代公式为
'
(k +1) u ( x)
(k ) ( k) f ( x) f ( x )
x =x − ' =x − 2
u (x) [ f ' ( x ) ] −f ( x ) f ' ' ( x )
该方法收敛速度非常快,只需迭代 2 次即可得到 0.79999333。

{
2 2
x + y =4 ( ) T
24. (非线性方程组求解)用 Newton 法解方程组 2 2 ,取 x 0 =( 1.6 ,1.2 ) 。
x − y =1
解:方程组

{ x 2 + y 2−4=0 ⇔ F ( X )=0
2 2
x − y −1=0
Jacobi 矩阵及其逆矩阵

[ ][
∂ F1 ∂ F1
'
F ( X )=
∂x
∂ F2
∂y
∂ F2
=2
x y
x −y
' −1
,F (X ) =
]
−1 − y − y
4 xy −x x [ ]
∂x ∂y

−1
迭代公式 X
(k+1)
=X (k)−F ' ( X(k) ) ∙ F ( X (k) ),即

[ ]
(k)
x 5
+ (k)
[ ][ ] [ ][ ]
x + y −4 = 2 4 x
(k+1) (k ) (k ) (k)
x x 1 −y −y (k)2 (k)2
(k+ 1) = (k) +
y y (k) (k)
4 x y −x
(k)
x(k) x(k)2− y(k)2−1 y (k ) 3
+ (k )
2 4y
迭代 4 次后,
T
( x (4 ) , y ( 4) ) =( 1.581 13883 , 1.224 744 87 )T

17
附录
1. Romberg 求积算法
clear all
f = inline('x*sqrt(1+x^2)');a=0;b=3;epsilon=10^-5; % ALL Settings
R=(b-a)/2*(f(a)+f(b));
n=1;
e=[0]
while n==1|abs(e(n))>epsilon
h=(b-a)/2^n;
sum=0;
for x=a+h:2*h:b-h;
sum=sum+f(x);
end
R(n+1,1) = R(n,1)/2+h*sum;
for i=2:n+1
R(n+1,i)=4^(i-1)/(4^(i-1)-1)*R(n+1,i-1)-1/(4^(i-1)-1)*R(n,i-1);
end
n=n+1
e=[e,R(n,n)-R(n-1,n-1)];
end
disp(R),disp(e) %Display calculation results and errors

2. 解线性方程组的迭代法
%% Parameters Setting
clear all
method=3; %1:Jacobi//2:Gauss-Seidel//3:SOR
omega=0.9; %only for SOR method
A=[5,2,1;-1,4,2;2,-3,10]; %input A
b=[-12;20;3]; %input b
x_k=[0;0;0]; % input x_0
epsilon=10^-4; % input epsilon
%% To Get B and f
% Divide A into L, D and U
[m,n]=size(A);
L=zeros(m,n);D=zeros(m,n);U=zeros(m,n);
for i=1:m
for j=1:n
if i>j
L(i,j)=A(i,j);
else
if i<j
U(i,j)=A(i,j);
18
end
end
end
D(i,i)=A(i,i);
end
% B and f
if method==1
B=-inv(D)*(L+U);
f=inv(D)*b;
else
if method==2
B=-inv(D+L)*U;
f=inv(D+L)*b;
else
if method==3
B=inv(D+omega*L)*((1-omega)*D-omega*U);
f=inv(D+omega*L)*omega*b;
end
end
end
%% Solving and Outputting
x_kplus1=B*x_k+f;
k=1;
while max(abs(x_kplus1-x_k))>epsilon
x_k=x_kplus1;
x_kplus1=B*x_k+f;
k=k+1
end
disp(x_kplus1)

3. 微分方程初值问题的数值解法
% All Settings Here!!!
clear all
f=inline('y-2*x/y','x','y'); % y'
f_analytical=inline('sqrt(1+2*x)'); % analytical solution
y0=1; % initial value
h=0.1; % step length
X=0:h:1;
%% 1-Explicit Euler's method
Y1=[y0];
for i=1:numel(X)-1
Y1=[Y1,Y1(i)+h*f(X(i),Y1(i))];
end
subplot(1,2,1)
19
hold on
scatter(X,Y1)
%% 2-Implicit Euler's method
%Iterate to get y_n+1
Y1_iterative=Y1;
for i=1:numel(Y1_iterative)-1
y_k=Y1_iterative(i+1);
y_kplus1=Y1_iterative(i)+h*f(X(i+1),y_k);
k(i+1)=1;
while abs(y_kplus1-y_k)>10^-3&k(i+1)<10
y_k=y_kplus1;
y_kplus1=Y1_iterative(i)+h*f(X(i+1),y_k);
k(i+1)=k(i+1)+1;
end
Y1_iterative(i+1)=y_kplus1;
end
disp([Y1_iterative;k])
%Implicit recursion
Y2=[y0];
for i=1:numel(X)-1
Y2=[Y2,Y2(i)+h*f(X(i+1),Y1_iterative(i+1))];
end
scatter(X,Y2(1:numel(X)))
%% 3-Trapezoid formula
Y3=(Y1+Y2)/2;
scatter(X,Y3(1:numel(X)))
%% 4-Two-step Euler's method (midpoint formula)
% Relatively accurate y1 is obtained by iterative method
y1_k=y0;
y1_kplus1=y0+h*f(X(2),y1_k);
k_2step=1;
while abs(y1_kplus1-y1_k)>10^-5&k_2step<20
y1_k=y1_kplus1;
y1_kplus1=y0+h*f(X(2),y1_k);
k_2step=k_2step+1;
end
disp([y1_kplus1,k_2step])
% recursion
Y4=[y0,y1_kplus1];
for i=1:numel(X)-2
Y4=[Y4,Y4(i)+2*h*f(X(i+1),Y4(i+1))];
end
scatter(X,Y4)
%% 5-Modified Euler's method
20
Y5=[y0];
for i=1:numel(X)-1
Y5=[Y5,Y5(i)+h/2*(f(X(i),Y5(i))+f(X(i+1),Y5(i)+h*f(X(i),Y5(i))))];
end
scatter(X,Y5)
%% 6-Classical Runge-Kutta method
Y6=[y0];
for i=1:numel(X)-1
K1=f(X(i),Y6(i));
K2=f(X(i)+h/2,Y6(i)+h/2*K1);
K3=f(X(i)+h/2,Y6(i)+h/2*K2);
K4=f(X(i)+h,Y6(i)+h*K3);
Y6=[Y6,Y6(i)+h/6*(K1+2*K2+2*K3+K4)];
end
scatter(X,Y5)
%% Compare that with the analytical solution
X_=min(X):0.01:max(X)
plot(X_,f_analytical(X_))
legend('Explicit EM','Implicit EM','Trapezoid','Two-step EM','Modified EM','Classical R-
K','Analytical solution')
%absolute error
error=[Y1;Y2;Y3;Y4;Y5;Y6]-repmat(f_analytical(X),6,1);
subplot(1,2,2)
semilogy(0,0,'k')
hold on
for i=1:6
p(i)=scatter(X,abs(error(i,:)))
end
legend(p,'Explicit EM','Implicit EM','Trapezoid','Two-step EM','Modified EM','Classical R-
K')

4. 非线性方程的数值解法
%% Bisection Method
clear all
f=inline('x-tan(x)'); % function
ak=4;bk=5; % a_0,b_0
n=-5 % accuracy
a=[ak];b=[bk];
epsilon=10^n;
if f(ak)*f(bk)>=0
'ERROR:f(a)f(b)>=0';
end
k=0;
K=[k];
21
x=[];
fx=[];
while bk-ak>2*epsilon|f((ak+bk)/2)==0
xk=(ak+bk)/2;
x=[x;xk];
fx=[fx;f(xk)];
if f(ak)*f(xk)>0
ak=xk;
a=[a;ak];b=[b;bk];
else
bk=xk;
a=[a;ak];b=[b;bk];
end
k=k+1
K=[K;k];
end
xk=(ak+bk)/2;
x=[x;xk];
fx=[fx;f(xk)];
result_x=roundn(xk,n)
Table1=[K,a,b,x,fx]
%% Newton's Method
g=inline('-(tan(x))^2'); %g=f'(get it by your hands)
x_k=4.5; % input x_0, epsilon has been set before
x_kplus1=x_k-f(x_k)/g(x_k);
X=[x_k,x_kplus1];
k_N=1;
K_N=[0,1];
while abs(x_kplus1-x_k)>epsilon|f(x_kplus1)==0
x_k=x_kplus1;
x_kplus1=x_k-f(x_k)/g(x_k);
X=[X,x_kplus1];
k_N=k_N+1;
K_N=[K_N,k_N];
end
result_x=roundn(x_kplus1,n)
Table2=[K_N;X]

22

You might also like