计算方法的稳定性
在实际数值计算过程中,由于不可避免地存在和不断产生各种误差,因此计算结果不是绝对精确的。如果误差使得计算结果和实际情况有较大差别或者出现错误的结果,则数值 计算便失去了价值和意义。因此,分析数值计算过程中误差的来源和传递规律,设法控制和减小误差。
1.误差的来源
来源:固有误差(模型误差、观测误差)和计算误差(截断误差、舍入误差)
舍入误差:
设s是r进制数,p是r进制正负整数或零,则形如
x
=
s
×
r
p
x=s\times r^p
x=s×rp
并满足
−
1
<
s
<
1
-1<s<1
−1<s<1
的数x,称为r进制浮点数,且s和p分别称为浮点数的尾数和阶数。
任何一种计算机只能用有限的位数来表示浮点数的尾数和阶数。设
−
m
≤
p
≤
M
-m\leq p\leq M
−m≤p≤M
其中
m
,
M
m,M
m,M为正整数,它们主要由计算机用多少位数来表示阶数而决定。如果尾数的小数尾数为t(t一般比m,M的位数大若干倍),则计算机的数系由一切阶数满足
−
1
<
s
<
1
-1<s<1
−1<s<1的t位r进制浮点数的集合F组成。可见,在计算机数系中,数的个数有限,数系中的每一个数都是有理数,且阶数相等的数以相等的距离分布在数轴的某一段上。
由于计算机数系是有限集,不仅无理数 e , π e,\pi e,π等不属于计算机数系,而且一些有理数(如 1 / 3 1/3 1/3)也属于计算机数系,因此常常用计算机数系中和它们接近的数来表示它们。同时,在利用计算机进行计算时,由于字长限制,参与计算的数的长度也是有限的,而由此产生的误差,称为舍入误差。
例1:
浮点数F的集合可以用以下4个参数来描述:
{
F
}
≡
{
β
,
t
,
L
,
U
}
\{F\}\equiv \{\beta,t,L,U\}
{F}≡{β,t,L,U}
其中,
β
\beta
β为基数,t是精度参数,整数L与U是阶码E(范围)的下限和上限
[
L
,
U
]
[L,U]
[L,U]。
这样,F中的每一个浮点数x的值可表示为:
x
=
±
(
d
1
β
+
d
2
β
2
+
⋯
+
d
t
β
t
)
⋅
β
E
x=\pm(\frac{d_1}{\beta}+\frac{d_2}{\beta^2}+\cdots+\frac{d_t}{\beta^t})·\beta^E
x=±(βd1+β2d2+⋯+βtdt)⋅βE
式中的整数
d
1
,
⋯
,
d
t
d_1,\cdots,d_t
d1,⋯,dt满足
0
≤
d
t
≤
β
−
1
,
(
i
=
1
,
⋯
,
t
)
0\leq d_t\leq \beta-1,(i=1,\cdots,t)
0≤dt≤β−1,(i=1,⋯,t),同时又
L
≤
E
≤
U
L\leq E\leq U
L≤E≤U(E是整数)。
如果对F中每个非零的x,有 d 1 ≠ 0 d_1\neq 0 d1=0,则称浮点数系F为规格化浮点数系。括号中的部分 f = ( d 1 / β + d 2 / β 2 + ⋯ + d t / β t ) f=(d_1/\beta+d_2/\beta^2+\cdots +d_t/\beta^t) f=(d1/β+d2/β2+⋯+dt/βt)称为尾数。我们知道,一个实数常用【整数+小数点+尾数】的形式表示,它们在计算机中对应的浮点数 [ β t ⋅ f ] [\beta^t·f] [βt⋅f]则常用某种整数表示方式(例如以原码、反码或补码的形式)存储。
例2:求十进制数系与计算机采用的二进制数系之间的差别
解:以在许多算法中常被选作步长的十进制0.1为例。在
β
=
2
\beta=2
β=2或者为2的幂的浮点数系中,10个0.1的步长并不刚好等于一个1.0的步长。事实上,当把
1
10
\frac{1}{10}
101转换成为以
1
2
\frac{1}{2}
21为底的幂的有限项展开式时,有:
1
10
=
0
2
1
+
0
2
2
+
0
2
3
+
1
2
4
+
1
2
5
+
0
2
6
+
0
2
7
+
⋯
\frac{1}{10}=\frac{0}{2^1}+\frac{0}{2^2}+\frac{0}{2^3}+\frac{1}{2^4}+\frac{1}{2^5}+\frac{0}{2^6}+\frac{0}{2^7}+\cdots
101=210+220+230+241+251+260+270+⋯
用下标表示数基,如果
β
=
2
\beta=2
β=2,则有:
(
0.1
)
=
(
0.000110011001100
⋯
)
z
(0.1)=(0.000110011001100\cdots)_z
(0.1)=(0.000110011001100⋯)z
如果
β
=
8
\beta=8
β=8,则
(
0.1
)
=
(
0.063146314
⋯
)
s
(0.1)=(0.063146314\cdots)_s
(0.1)=(0.063146314⋯)s
由于字长限制,等号右边的值只能取7位。很明显,当把10个这样的数相加时,其结果并不正好是1.0。这就是舍入误差造成的。所以,在计算机上进行的浮点运算(四则运算)只能是近似计算。
观测误差和数据的舍入误差虽然来源不同,但对计算结果的影响完全一样。在数值计算中涉及的误差一般指舍入误差(包含初始数据误差)和截断误差。
2 计算方法的稳定性
计算方法的稳定性是指数值计算中是否稳定的问题。在数值计算过程中,数值解是逐步计算出来的。由于计算机的字长有限,每一步计算都有误差存在,且前一步的舍入误差必然要影响下一步的近似解。如果运算序列的舍入误差不增长。误差的积累或传递对计算结果的影响是可控的,则该算法是数值稳定的,否则是数值不稳定的。
3. 数值计算的基本原则
评价一个数值计算方法优劣的标准:
- 计算时间复杂度(运算次数或计算时间),包括收敛性问题
- 计算空间复杂度(占用计算机存储空间)
- 计算结果精确度(包括稳定性问题)
构造和选择一个好的计算方法:
- 避免两个相近的数相减
在数值计算过程中,两个相近的数相减,会严重损失有效数字,从而使相对误差变大。
如果两个相近的数相减,常采用变换的公式进行计算。如果计算公式不能改变,则采用增加有效数字位数的方法。
-
避免使用绝对值很小的数作分母
-
两个相差很大的数进行运算时,防止大数“吃掉”小数
-
简化计算步骤,减少运算次数