Skip to content

19.8.2 计算机计算中的数值问题 ​

19.8.2.1 引言、误差类型 ​

计算机计算的一般性质与手工计算基本相同, 然而某些方面需要特别注意, 因为精度来自数的表示和关于计算机误差的判断. 更进一步, 计算机要比人类手工能做的实施多得多的计算步骤.

因此, 存在如何影响和控制误差的问题, 例如在数学上等价的方法中选用最适当的数值方法.

在后面的讨论中用到如下符号,其中 x 表示在大多情况下未知的量的准确值, x~ 表示 x 的近似值:

绝对误差 |Δx|=|x−x~| .(19.268)

相对误差 |Δxx|=|x−x~x| .(19.269)

记号

(19.270)ε(x)=x−x~ 和 εrel (x)=x−x~x

也经常用到.

19.8.2.2 规范化十进制数和舍入 ​

1. 规范化十进制数 ​

每个实数 x≠0 可表示为形如

(19.271)x=±0.b1b2⋯10E(b1≠0)

的十进制数. 这里由数字 bi∈{0,1,2,⋯,9} 构成的 0.b1b2⋯ 称为尾数. 数 E 为整数,是所谓关于基 10 的指数. 因为 b1≠0,(19.271) 称为正规十进制数.

因为真实的计算机只能处理有限多的字节,故必须限制尾数数字的固定数目 t 和指数 E 的固定范围. 故形如 (19.271) 的数根据舍入 (在实际计算中常用) 得到

(19.272)x~={±0⋅b1b2⋯bt⋅10E,bt+1<5( 舍 ),±(0⋅b1b2⋯bt+10−t)10E,bt+1≥5(λ),

由舍入引起的绝对误差为

(19.273)|Δx|=|x−x~|≤0.5⋅10−t10E.

2. 基本运算和数值计算 ​

每个数值过程都是一系列基本运算. 特别用有限位浮点表示提出问题. 这里给出简要综述. 设 x 和 y 是非零的同号规范化无误差浮点数:

(19.274a)x=m1BE1,y=m2BE2(19.274b)mi=∑k=1t⁡a−k(i)B−k,a−1(i)≠0,(19.274c)a−k(i)=0或 1 或⋯或B−1,k>1(i=1,2).

(1) 加法 若 E1>E2 ,因为正规化仅允许左移,则公共指数变为 E1 . 随后尾数相加.

若

(19.275a)B−1≤|m1+m2B−(E1−E2)|<2

和

(19.275b)|m1+m2B−(E1−E2)|≥1,

则将十进制小数点向左移一位而指数增加 1.

0.9604⋅103+0.5873⋅102=0.9604⋅103+0.05873⋅103=1.01913⋅103=0.1019⋅104.

(2) 减法 如同在加法的情况均衡指数, 随后尾数相减. 若

(19.276a)|m1−m2B−(E1−E2)|<1−B−t,

以及

(19.276b)|m1−m2B−(E1−E2)|<B−t,

则将十进制小数点右移 t 的最大值位,而指数相应减少.

◼ 0.1004⋅103−0.9988⋅102=0.1004⋅103−0.09988⋅103=0.00052⋅103=0.5200⋅100.

此例显示了减法的临界情况. 因为位数有限 (这里是 4), 从右边引进零代替准确字符.

(3) 乘法 指数相加而尾数相乘, 若

(19.277)m1m2<B−1,

则十进制小数点向右移一位, 且指数减少 1.

(0.1004⋅103)⋅(0.2504⋅105)=0.07952704⋅108=0.7953⋅107.

(4)除法 指数相减而尾数相除. 若

(19.278)m1m2≥1

则十进制小数点向左移一位, 且指数增加 1.

(0.3176⋅103)/(0.2504⋅105)=1.2683706⋅10−2=0.1268⋅10−1.

(5) 结果的误差 在假定无误差项的四种基本运算中, 结果的误差是舍入误差. 对于位置为 t 基为 B 的数,相对误差的上限为

(19.279)B2B−t.

(6) 减法相消 如上所述, 几乎相等的浮点数的减法是临界运算. 若有可能, 应通过改变运算阶或利用某种等式来避免这种情况.

x=1985−1984=0.4455⋅102−0.4454⋅102=0.1⋅10−1或x=1985−1984=1985−19841985+1984=0.1122⋅10−1.

19.8.2.3 数值计算的精度 ​

1. 误差类型 ​

数值方法有误差. 有几类误差, 最后结果的总误差正是由这些误差积累的 (图 19.18).

01937d01-b6f6-7881-8294-3a9c82211946_73_307_480_1024_374_0.jpg

2. 输入误差 ​

(1)输入误差的概念 输入误差是由不准确的输入数据产生的误差. 输入数据的轻微不准确称为扰动. 确定输入数据误差称为误差计算的直接问题. 其反问题如下: 输入数据可有多大的误差能够保证最终的输入误差不超过可以接受的允许值. 在相当复杂的问题里估计输入误差是非常困难且通常几乎是不可能的. 一般对实值函数 y=f(x―),x―=(x1,x2,⋯,xn)T ,若对 y=f(x―)=f(x1,x2,⋯,xn) 应用带线性余项的泰勒公式 (参见第 630 页 7.3.3.3), ξ1,ξ2,⋯,ξn 表示中间值, x~1,x~2,⋯,x~n 表示 x1,x2,⋯,xn 的近似值,则输入误差的绝对值为

|Δy|=|f(x1,x2,⋯,xn)−f(x~1,x~2,⋯,x~n)|=|∑i=1n⁡∂f∂xi(ξ1,ξ2,⋯,ξn)(xi−xi~)|(19.280)≤∑i=1n⁡(maxx⁡|∂f∂xi(x―)|)|Δxi|,

近似值是扰动了的输入数据. 这里也考虑高斯误差传播定律 (参见第 1114 页 16.4.2.1).

(2)简单算术运算的输入误差 已知简单算术运算的输入误差. 对四种基本运算用 (19.268) (19.270) 的记号:

(19.281)ε(x±y)=ε(x)±ε(y),(19.282)ε(xy)=yε(x)+xε(y)+ε(x)ε(y),(19.283)ε(xy)=1yε(x)−xy2ε(y)+ε的高阶项,(19.284)εrel (x±y)=εrel (x)±εrel (y)x±y,(19.285)εrel (xy)=εrel (x)+εrel (y)+εrel (x)εrel (y),(19.286)εrel (xy)=εrel (x)+εrel (y)+ε的高阶项.

公式表明: 对于乘法和除法, 输入数据的相对误差小, 导致结果的相对误差也小. 对于加法和减法,若 |x±y|≪|x|+|y| ,相对误差可能非常大.

3. 方法的误差 ​

(1)方法误差的记号 方法误差源于理论上连续的现象作为极限以不同的方式被数值逼近的事实. 因此, 在极限过程中有截断误差 (例如在迭代法中) 及在用有限离散系 (例如数值积分) 逼近连续现象时的离散误差. 方法误差与输入和舍入误差无关, 因此, 仅在关系到应用解法的方法论时研究方法误差.

(2) 应用迭代法 若使用迭代法, 可能出现两种情况: 得到问题的正确解或错误解. 也可能尽管有解但不能用迭代法得到.

为使迭代法更清晰安全, 应考虑如下建议:

a) 为避免 “无穷迭代”, 若步数超过预定值即停止过程 (即尚未达到要求的精度便停止).

b) 应在屏幕上以数值或者图表的形式跟踪中间结果的位置.

c) 应该用到解的所有已知性质如梯度、单调性等.

d) 应研究变量和函数计量的可能性.

e) 应通过改变步长、截断条件、初始值等进行多种试验.

4. 舍入误差 ​

产生舍入误差是因为中间结果被舍入. 这对按精度要求判断数学方法时有本质的重要性. 舍入误差与输入误差和方法误差一起决定给定的方法是强稳定、弱稳定或不稳定. 若总误差随着步数增加分别减少、有相同的阶或增加, 便发生强稳定、弱稳定或不稳定.

在不稳定性方面, 我们区别舍入误差和离散误差 (数值不稳定) 以及理论上准确的计算中初始数据误差 (自然不稳定) 的灵敏度. 若数值不稳定不大于自然不稳定, 则计算过程是合适的.

对于舍入误差的局部误差传播, 即从一个计算步到下一步的误差传递, 可使用在输入误差中用过的同样的估计过程.

5. 数值计算的例子 ​

上述某些问题用数值例子来说明.

◼A: 二次方程的根 带实系数 a,b,c 的二次方程 ax2+bx+c=0,D= b2−4ac≥0 (实根). 临界状态为

**a) |∗∗4ac|≪b2 和 b) 4ac≈b2 . 推荐程序:

**i) x1∗∗=−b+sign(b)D2a,x2=cax1 (韦达根定理,参见第 56 页 1.6.3.1,3.).

ii) 用直接法难免把 D 化零. 因为 |b|≫D 成立,将发生减法抵消,除非 (b+sign(bD)) 中误差不是太大.

◼B: h≤r 的薄锥壳的体积 因为 (r+h)≈r,V=4π(r+h)3−r33 存在减法消去的情况. 而在等式 V=4π3r2h+3rh2+h33 中则没有这个问题.

◼C: 求和 S=∑k=1∞⁡1k2+1(S=1.07667⋯) 要求有三位有效数字的精度. 用 8 位数字进行计算,大约需要加 6000 项. 在作恒等变换 1k2+1=1k2−1k2(k2+1) 后, 成立

S=∑k=1∞⁡1k2−∑k=1∞⁡1k2(k2+1) 及 S=π26−∑k=1∞⁡1k2(k2+1).

通过这一变换后, 则只需考虑 8 项.

◼D: 避免 00 的状态 当 x=y=0 时,函数 z=(1−1+x2+y2)x2−y2x2+y2 . 分子和分母同时乘以 (1+1+x2+y2) 即可避免这一状态.

◼E: 不稳定递推过程的例子 若满足条件 |a2±a24+b|<1 ,则一般形式的算法 yn+1=ayn+byn−1(n=1,2,⋯) 是稳定的. 特殊情况 yn+1=−3yn+ 4yn−1(n=1,2,⋯) 是不稳定的. 若 y0 和 y1 有误差 ε 和 −ε ,则对 y2,y3,y4,y5 , y6,⋯ 误差为 7ε,−25ε,103ε,−409ε,1639ε,⋯ ,该过程对于参数 a=−3 与 b=4 是不稳定的.

◼F: 微分方程的数值求积 数值求解一阶常微分方程

(19.287)y′=f(x,y), 其中 f(x,y)=ay,

其初值用 y(x0)=y0 表示.

a) 天然不稳定 准确解 y(x) 有准确初值 y(x0)=y0 ,设 u(x) 为扰动初值的解. 不失一般性, 设扰动解形如:

(19.288a)u(x)=y(x)+εη(x),

其中 ε(0<ε<1) 为参数,而 η(x) 是所谓扰动函数. 考虑 u′(x)=f(x,u) 从泰勒展开式得到 (参见第 630 页 7.3.3.3)

(19.288b)u′(x)=f(x,y(x)+εη(x))=f(x,y)+εη(x)fy(x,y)+ 高阶项. 

这意味着微分变差方程

(19.288c)η′(x)=fy(x,y)η(x).

由 f(x,y)=ay ,问题的解为

(19.288d)η(x)=η0ea(x−x0), 其中 η0=η(x0).

对 a>0 ,即便是小的初始扰动 η0 也导致无限增长的扰动 η(x) . 故为天然不稳定.

b) 梯形公式的误差研究 当 a=−1 时,稳定的微分方程 y′(x)=−y(x) 有准确解

(19.289a)y(x)=y0ea(x−x0), 其中 y0=y(x0).

梯形公式为

(19.289b)∫xixi+1y(x)dx≈yi+yi+12h, 其中 h=xi+1−xi.

对给定微分方程用上述公式, 成立

y~i+1=y~i+∫xixi+1(−y)dx=y~i−y~i+y~i+12h,y~i+1=2−h2+hy~i,(19.289c)y~i=(2−h2+h)iy~0

其中 xi=x0+ih ,即对 0≤h<2 有 i=(xi−x0)/h ,得到

y~i=(2−h2+h)(xi−x0)/hy~0=y~0ec(h)(xi−x0),(19.289d)c(h)=ln⁡(2−h2+h)h=−1−h212−h480−⋯.

若 y~0=y0 ,则 y~i<yi ,且对 h→0,y~i 也趋向于准确解 y0e−(xi−x0) .

c) 在 b) 中的输入误差 设准确和近似的初值相同. 现研究当 y~0≠y0 及 |y~0−y0|<ε0 时的性态.

因为 (y~i+1−yi+1)≤2−h2+h(y~i−yi) ,有

(19.290a)(y~i+1−yi+1)≤(2−h2+h)i+1(y~0−y0),

故 εi+1 最多和 ε0 同阶,且该方法关于初值是稳定的. 应该提到,在用辛普森方法求解上述微分方程时引进了人为的不稳定. 此时,对 h→0 ,得到通解如:

(19.290b)y~i=C1e−xi+C2(−1)iexi/3.

问题是该数值解法使用了比相应的微分方程的阶更高阶的差分.

version 1.24.0