4507 字
23 分钟
Chapter1:误差

概述#

这一章的核心是:

数值计算得到的通常是近似解。学习误差,就是要知道误差从哪里来、如何度量、如何传播,以及怎样设计更可靠的计算过程。

计算链条可以概括为:

实际问题 → 抽象、简化 → 数学模型 → 数值计算 → 问题近似解

在这条链条中,误差不可避免。常见来源包括:

  • 模型误差:实际问题被抽象、简化为数学模型时产生。
  • 观测误差:原始数据来自测量,测量值本身不可能绝对精确。
  • 截断误差 / 方法误差:用有限步骤近似无限过程,或用较易求解的问题近似原问题。
  • 舍入误差:计算机只能保留有限位数字,必须对数值进行舍入。

本章重点讨论:截断误差与舍入误差如何影响计算结果


目录#


误差的来源#

数值计算方法研究的是:怎样用计算过程求数学问题的近似解。

现实问题通常不能直接交给计算机求解,需要经历:

  1. 把现实问题抽象成数学模型;
  2. 用数值算法求数学模型的近似解;
  3. 在计算机中用有限精度完成计算。

每一步都会引入误差。

模型误差#

实际问题的解与数学模型的解之间的差,称为模型误差

例如实际海域、建筑、流场、圆形边界等对象是连续的、复杂的。为了计算,往往要把区域离散成网格,把复杂条件简化为可处理的边界条件。这样得到的数学模型已经是现实问题的近似。

课堂中用“圆在网格上表示”的例子说明这一点:连续圆形边界落到离散网格上时,圆边界会被网格单元近似,几何形状本身已经发生误差。

观测误差#

数学问题中的参数常由实验或观测得到。观测值无法绝对准确,因此由观测数据带来的误差称为观测误差

例如长度、速度、温度、流量等物理量来自仪器测量。仪器精度有限,读数本身就带有误差。

截断误差#

许多数学对象本身含有无限过程。计算时只能截取有限项或有限步,因此会产生截断误差,也称方法误差

典型例子是用泰勒级数近似函数:

cosx=1x22!+x44!x66!++(1)nx2n(2n)!+\cos x=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\cdots+\frac{(-1)^n x^{2n}}{(2n)!}+\cdots

x|x| 很小时,可以用

cosx1x22\cos x\approx 1-\frac{x^2}{2}

作为近似。由交错级数的莱布尼茨判别法可知,截断误差的绝对值不超过下一项:

Rx424.|R|\le \frac{x^4}{24}.

所以截断误差来自“无限过程被有限化”。

舍入误差#

计算机不能保存所有实数。无穷小数、位数很多的数都要舍入成有限位数字,由此产生舍入误差

课堂一开始提到的数制转换也说明了这一点:十进制整数可以转成二进制整数,例如

1310=11012,13_{10}=1101_2,

但许多十进制小数在二进制中会成为无限循环小数。计算机只能截断或舍入到有限位,于是出现舍入误差。

TIP

数值计算中最常见的危险不是“有误差”,而是误差在后续运算中被放大。所以后面要讨论误差传播、条件数和算法稳定性。


绝对误差、相对误差与有效数字#

绝对误差#

xx 为准确值,xx^*xx 的一个近似值,则近似值 xx^*绝对误差

e(x)=xx.e(x^*)=x-x^*.

准确值 xx 往往未知,所以绝对误差的准确值通常也未知。实际中常估计一个正数 ε\varepsilon,使

e(x)=xxε.|e(x^*)|=|x-x^*|\le \varepsilon.

这个 ε\varepsilon 称为 xx^*绝对误差限,简称误差限

于是准确值 xx 必在区间

xεxx+εx^*-\varepsilon\le x\le x^*+\varepsilon

中,也可以写作

x=x±ε.x=x^*\pm \varepsilon.

例:圆周率近似#

若取

π3.14,\pi\approx 3.14,

由于 3.143.14 是四舍五入到小数点后两位的结果,所以误差不超过最后保留位的半个单位:

π3.140.0016<12×102.|\pi-3.14|\le 0.0016<\frac12\times 10^{-2}.

若取

π3.142,\pi\approx 3.142,

π3.1420.00041<12×103.|\pi-3.142|\le 0.00041<\frac12\times 10^{-3}.

这里可以看出:误差限与保留位数有关,但它不能完全反映近似值本身的精确程度。

相对误差#

绝对误差要结合数量级才有意义。比如同样误差 0.10.1,对测量 10001000 米来说很小,对测量 0.20.2 米来说很大。

x0x\ne 0,近似值 xx^*相对误差定义为

er(x)=e(x)x=xxx.e_r(x^*)=\frac{e(x^*)}{x}=\frac{x-x^*}{x}.

由于准确值 xx 通常未知,实际常用

er(x)e(x)xe_r(x^*)\approx \frac{e(x^*)}{x^*}

估计相对误差。

若存在正数 εr\varepsilon_r,使

er(x)=e(x)xεr,|e_r(x^*)|=\left|\frac{e(x^*)}{x^*}\right|\le \varepsilon_r,

则称 εr\varepsilon_rxx^*相对误差限

例:光速测量#

若实验测得光速

c=2.997925×105 km/s,c^*=2.997925\times 10^5\ \text{km/s},

其绝对误差限为 0.1 km/s0.1\ \text{km/s},则相对误差限为

0.12.997925×105<4×107.\frac{0.1}{2.997925\times 10^5}<4\times 10^{-7}.

所以 4×1074\times 10^{-7} 可作为该近似值的相对误差限。

TIP

绝对误差回答“差了多少”;相对误差回答“相对于原数差了多大比例”。数值计算中判断精度时,相对误差通常更有可比性。

有效数字#

有效数字既能表示近似值的大小,也能表示近似值的精确程度。

在计算中,常按四舍五入原则取近似值。若近似值 xx^* 的误差限为

12×10n,\frac12\times 10^{-n},

则称 xx^* 准确到小数点后第 nn

从第一个非零数字到该精确位之间的所有数字,都称为有效数字。

例:2\sqrt2 的近似值#

2=1.414213562\sqrt2=1.414213562\cdots

若取四位小数:

x=1.414,x^*=1.414,

21.41412×103,|\sqrt2-1.414|\le \frac12\times 10^{-3},

所以 1.4141.41444 位有效数字。

若取八位小数:

x=1.4142136,x^*=1.4142136,

21.414213612×107,|\sqrt2-1.4142136|\le \frac12\times 10^{-7},

所以它有 88 位有效数字。

例:小数前有零时的有效数字#

x=0.003400±12×105,x=0.003400\pm \frac12\times 10^{-5},

则该近似值准确到小数点后第 55 位。从第一个非零数字 33 到这一位共有

3, 4, 0

所以 0.0034000.00340033 位有效数字。前面的零只起定位作用,不计入有效数字。

例:整数部分较大时#

x=1452.046x^*=1452.046

77 位有效数字,则误差限为

12×103.\frac12\times 10^{-3}.

x=1452.0x^*=1452.0

55 位有效数字,则误差限为

12×101.\frac12\times 10^{-1}.

注意:末尾的 00 若位于有效位范围内,也应计为有效数字。

有效数字与相对误差的关系#

若近似值的规格化形式为

x=±0.a1a2an×10m,a10,x^*=\pm 0.a_1a_2\cdots a_n\times 10^m,\qquad a_1\ne 0,

并且 xx^*nn 位有效数字,则其相对误差限可取

εr=12a1×10n+1.\varepsilon_r=\frac{1}{2a_1}\times 10^{-n+1}.

反过来,如果相对误差限满足

εr12(a1+1)×10n+1,\varepsilon_r\le \frac{1}{2(a_1+1)}\times 10^{-n+1},

xx^* 至少有 nn 位有效数字。

例:ee 的近似值#

e2.72,e\approx 2.72,

这里 a1=2a_1=2,且有 33 位有效数字,所以相对误差限为

εr=12×2×103+1=0.25×102.\varepsilon_r=\frac{1}{2\times 2}\times 10^{-3+1}=0.25\times 10^{-2}.

数值计算中误差的传播#

误差进入计算过程后,会通过函数运算继续传播。

一般函数的误差传播#

设数值计算问题为

y=f(x1,x2,,xn),y=f(x_1,x_2,\cdots,x_n),

参数 x1,x2,,xnx_1,x_2,\cdots,x_n 的近似值分别为

x1,x2,,xn.x_1^*,x_2^*,\cdots,x_n^*.

对应的近似结果为

y=f(x1,x2,,xn).y^*=f(x_1^*,x_2^*,\cdots,x_n^*).

当数据误差较小时,由多元函数的一阶泰勒展开,有

e(y)=yyi=1nf(x1,,xn)xie(xi).e(y^*)=y-y^* \approx \sum_{i=1}^{n}\frac{\partial f(x_1^*,\cdots,x_n^*)}{\partial x_i}\,e(x_i^*).

这说明:

输出误差大约等于各输入误差经过偏导数加权后的和。

其相对误差为

er(y)=e(y)yi=1nf(x1,,xn)xixif(x1,,xn)er(xi).e_r(y^*)=\frac{e(y^*)}{y^*} \approx \sum_{i=1}^{n} \frac{\partial f(x_1^*,\cdots,x_n^*)}{\partial x_i} \frac{x_i^*}{f(x_1^*,\cdots,x_n^*)} e_r(x_i^*).

其中

fxixif\frac{\partial f}{\partial x_i}\frac{x_i^*}{f}

反映了第 ii 个输入相对误差对输出相对误差的放大程度。

四则运算的误差传播#

由一般公式可推出四则运算中的误差传播规律。

和、差#

e(x1±x2)=e(x1)±e(x2),e(x_1\pm x_2)=e(x_1)\pm e(x_2),er(x1±x2)=x1x1±x2er(x1)±x2x1±x2er(x2).e_r(x_1\pm x_2)=\frac{x_1}{x_1\pm x_2}e_r(x_1)\pm \frac{x_2}{x_1\pm x_2}e_r(x_2).

由此可得误差限估计:

e(x1±x2)e(x1)+e(x2).|e(x_1\pm x_2)|\le |e(x_1)|+|e(x_2)|.

结论:和差的绝对误差限不超过各数绝对误差限之和

#

e(x1x2)x2e(x1)+x1e(x2),e(x_1x_2)\approx x_2e(x_1)+x_1e(x_2),er(x1x2)er(x1)+er(x2).e_r(x_1x_2)\approx e_r(x_1)+e_r(x_2).

结论:乘积的相对误差近似等于各因子相对误差之和

#

e(x1x2)1x2e(x1)x1x22e(x2),e\left(\frac{x_1}{x_2}\right)\approx \frac{1}{x_2}e(x_1)-\frac{x_1}{x_2^2}e(x_2),er(x1x2)er(x1)er(x2).e_r\left(\frac{x_1}{x_2}\right)\approx e_r(x_1)-e_r(x_2).

误差限估计为

er(x1x2)er(x1)+er(x2).\left|e_r\left(\frac{x_1}{x_2}\right)\right| \le |e_r(x_1)|+|e_r(x_2)|.

例:y=xny=x^n#

y=xn.y=x^n.

由相对误差公式:

er(y)=d(lnxn)=nd(lnx)=ner(x).e_r(y)=d(\ln x^n)=n\,d(\ln x)=n e_r(x).

所以

er(xn)ner(x).e_r(x^n)\approx n e_r(x).

特别地,若

y=x=x1/2,y=\sqrt{x}=x^{1/2},

er(y)12er(x).e_r(y)\approx \frac12 e_r(x).

也就是说,开平方会把输入相对误差约缩小一半;取 nn 次幂会把相对误差约放大 nn 倍。

例:计算 x=1.21×3.659.81x^*=1.21\times 3.65-9.81#

假定参与运算的数据都准确到两位小数,则每个输入的绝对误差限均为

12×102.\frac12\times 10^{-2}.

f(a,b,c)=abc,f(a,b,c)=ab-c,

其中 a=1.21,b=3.65,c=9.81a=1.21,b=3.65,c=9.81。由误差传播公式,

e(f)be(a)+ae(b)e(c).e(f)\approx b e(a)+a e(b)-e(c).

于是绝对误差限满足

e(f)(3.65+1.21+1)×12×102=0.0293.|e(f)|\le (3.65+1.21+1)\times \frac12\times 10^{-2}=0.0293.

近似结果为

f=1.21×3.659.81=5.3935.f^*=1.21\times 3.65-9.81=-5.3935.

相对误差限可估计为

e(f)f0.02935.39350.0054.\frac{|e(f)|}{|f^*|}\le \frac{0.0293}{5.3935}\approx 0.0054.

因此该计算结果大约有两位有效数字。

线性方程组中的误差放大:条件数#

课堂还补充了线性方程组中误差放大的问题。

考虑

Ax=b.Ax=b.

如果右端项 bb 有扰动 δb\delta b,对应解的扰动为 δx\delta x,则

A(x+δx)=b+δb.A(x+\delta x)=b+\delta b.

Ax=bAx=b

Aδx=δb,A\delta x=\delta b,

从而

δx=A1δb.\delta x=A^{-1}\delta b.

取范数,有

δxA1δb.\|\delta x\|\le \|A^{-1}\|\,\|\delta b\|.

另一方面,

b=AxAx.\|b\|=\|Ax\|\le \|A\|\,\|x\|.

于是得到相对误差估计:

δxxAA1δbb.\frac{\|\delta x\|}{\|x\|} \le \|A\|\,\|A^{-1}\|\frac{\|\delta b\|}{\|b\|}.

定义矩阵 AA条件数

cond(A)=AA1.\operatorname{cond}(A)=\|A\|\,\|A^{-1}\|.

因此

δxxcond(A)δbb.\frac{\|\delta x\|}{\|x\|} \le \operatorname{cond}(A)\frac{\|\delta b\|}{\|b\|}.
TIP

条件数衡量的是问题本身对扰动的敏感程度。

  • cond(A)\operatorname{cond}(A) 小:右端项小扰动通常只导致解的小扰动。
  • cond(A)\operatorname{cond}(A) 大:右端项很小的误差也可能被严重放大。

这种问题称为病态问题病态线性方程组

例:Hilbert 矩阵#

课堂用 Hilbert 矩阵演示病态性。Hilbert 矩阵定义为

Hij=1i+j1,1i,jn.H_{ij}=\frac{1}{i+j-1},\qquad 1\le i,j\le n.

例如

H3=[11213121314131415].H_3= \begin{bmatrix} 1 & \frac12 & \frac13\\ \frac12 & \frac13 & \frac14\\ \frac13 & \frac14 & \frac15 \end{bmatrix}.

课堂中用软件计算得到:

cond(hilb(4))

结果约为

1.55×104.1.55\times 10^4.

继续增大阶数:

cond(hilb(10))

结果约为

1.60×1013.1.60\times 10^{13}.

这说明 Hilbert 矩阵随阶数增大迅速变得极度病态。即使输入数据只产生很小扰动,解也可能出现明显误差。


算法的数值稳定性#

什么是数值稳定性#

同一个数学问题可以有多种算法。数学上等价的算法,在有限精度计算中效果可能差别很大。

如果计算过程中产生的舍入误差不会持续放大,这类算法称为数值稳定;如果误差在递推或迭代中不断被放大,则称为数值不稳定

WARNING

要区分两个概念:

  • 问题病态性:问题本身对输入扰动敏感,常用条件数衡量。
  • 算法稳定性:算法在计算过程中是否放大舍入误差。

病态问题即使用稳定算法也很难算准;良态问题若选了不稳定算法,也可能算坏。

例:递推计算积分#

考虑积分

In=01xnx+5dx,n=0,1,2,I_n=\int_0^1\frac{x^n}{x+5}\,dx,\qquad n=0,1,2,\cdots

xnx+5+5xn1x+5=xn1\frac{x^n}{x+5}+5\frac{x^{n-1}}{x+5}=x^{n-1}

可得递推关系

In+5In1=01xn1dx=1n.I_n+5I_{n-1}=\int_0^1 x^{n-1}\,dx=\frac1n.

另外,由于 0x10\le x\le 1

5x+56,5\le x+5\le 6,

所以有估计

16(n+1)<In<15(n+1).\frac{1}{6(n+1)}<I_n<\frac{1}{5(n+1)}.

这给出了 InI_n 的正性和大致范围。

算法 I:正向递推#

先算

I0=011x+5dx=ln65=ln1.2.I_0=\int_0^1\frac{1}{x+5}\,dx=\ln\frac65=\ln 1.2.

再由

In=1n5In1,n=1,2,I_n=\frac1n-5I_{n-1},\qquad n=1,2,\cdots

依次计算 I1,I2,I_1,I_2,\cdots

课堂演示代码可以写成:

I = zeros(30, 1);
I(1) = log(1.2);
for n = 1:29
I(n + 1) = 1/n - 5 * I(n);
end
I(1:15)

问题在于:若 I0I_0 有误差 e0e_0,且递推中不再产生新的舍入误差,则

en=InIn=5en1.e_n=I_n-I_n^*=-5e_{n-1}.

因此

en=(5)ne0.e_n=(-5)^n e_0.

也就是说,每向前递推一步,误差约放大 55 倍。正向递推是数值不稳定的。

算法 II:反向递推#

先取一个较大的 nn,用上下界给出 InI_n 的粗略近似。例如取

I14=12(16×15+15×15)0.01222222.I_{14}^*=\frac12\left(\frac{1}{6\times 15}+\frac{1}{5\times 15}\right)\approx 0.01222222.

再由递推式改写为

Ik1=15(1kIk),k=n,n1,,1.I_{k-1}=\frac15\left(\frac1k-I_k\right),\qquad k=n,n-1,\cdots,1.

I14I_{14} 反推 I13,I12,,I0I_{13},I_{12},\cdots,I_0

课堂演示代码可以写成:

I = zeros(15, 1);
I(15) = 0.5 * (1/(6*15) + 1/(5*15));
for k = 14:-1:1
I(k) = (1/k - I(k + 1)) / 5;
end
I

误差满足

ek1=15ek.e_{k-1}=-\frac15 e_k.

所以反向递推时,误差每一步约缩小为原来的 1/51/5。反向递推是数值稳定的。

两种算法结果对比#

nn算法 I 正向递推算法 II 反向递推
00.182321550.18232155
10.088392250.08839222
20.058038750.05803892
30.043139580.04313873
40.034302080.03430633
50.028489580.02846835
60.024187500.02432491
70.021763900.02123260
80.016183050.01883699
90.030195880.01692617
10-0.050979410.01536914
110.345806120.01406339
12-0.645697600.01301636
138.305409380.01184127
14-41.456183100.01222222

由积分定义可知 In>0I_n>0。正向递推到后面甚至得到负数,明显错误;反向递推得到的结果保持合理。

TIP

这个例子说明:算法不能只看数学等价性,还要看误差在计算过程中的传播方式。


数值计算中应注意的问题#

由于误差会传播和放大,数值计算中要尽量避免下列现象。

避免两个相近数相减#

两个相近数相减时,结果很小,而相对误差可能很大。

由差的相对误差公式,若

u=xy,u=x-y,

er(u)=e(x)e(y)xy.e_r(u)=\frac{e(x)-e(y)}{x-y}.

xyx\approx y 时,分母 xyx-y 很小,误差会被放大,有效数字会严重损失。这种现象称为相消误差

例:计算 1+1071\sqrt{1+10^{-7}}-1#

如果直接计算

x=1+1071,x=\sqrt{1+10^{-7}}-1,

由于 1+1071\sqrt{1+10^{-7}}\approx 1,两个相近数相减会丢失有效数字。

可做代数变形:

1+1071=1071+107+1.\sqrt{1+10^{-7}}-1 = \frac{10^{-7}}{\sqrt{1+10^{-7}}+1}.

这样避免了相近数直接相减。

例:计算 1cos21-\cos 2^\circ#

利用四位数学表,

cos20.9994.\cos 2^\circ\approx 0.9994.

若直接计算

1cos210.9994=0.0006,1-\cos2^\circ\approx 1-0.9994=0.0006,

该近似值只有一位有效数字。

若改用恒等式

1cos2=2sin21,1-\cos2^\circ=2\sin^21^\circ,

查表得

sin10.0175,\sin1^\circ\approx 0.0175,

于是

1cos22(0.0175)2=0.6125×103.1-\cos2^\circ\approx 2(0.0175)^2=0.6125\times 10^{-3}.

这时至少有两位有效数字。

常用的避免相消变形包括:

1cosx=2sin2x2,1-\cos x=2\sin^2\frac{x}{2},\frac{1-\cos x}{\sin x}=\frac{\sin x}{1+cos x},x+1x=1x+1+x,\sqrt{x+1}-\sqrt{x}=\frac{1}{\sqrt{x+1}+\sqrt{x}},1x1x+1=1x(x+1).\frac1x-\frac1{x+1}=\frac{1}{x(x+1)}.

避免大数吃小数#

计算机有限位运算中,若一个很大的数与一个很小的数相加,小数部分可能被舍去。

例如

a=109+1.a=10^9+1.

为了使两项数量级相同,可写成

a=0.1×1010+0.0000000001×1010.a=0.1\times 10^{10}+0.0000000001\times 10^{10}.

如果计算机只能保留 88 位小数,则第二项会被舍去,得到

a0.1×1010=109.a\approx 0.1\times 10^{10}=10^9.

这就是“大数吃小数”。

例:二次方程求根#

求方程

x2(109+1)x+109=0x^2-(10^9+1)x+10^9=0

的根。

容易看出两个根为

x1=109,x2=1.x_1=10^9, \qquad x_2=1.

若直接使用求根公式,

x=109+1±(109+1)24×1092,x=\frac{10^9+1\pm \sqrt{(10^9+1)^2-4\times 10^9}}{2},

在计算较小根时会出现两个相近大数相减,可能得到错误结果。

对于较小根,应该用等价公式

x2=2×109109+1+(109+1)24×109.x_2=\frac{2\times 10^9}{10^9+1+\sqrt{(10^9+1)^2-4\times 10^9}}.

这样避免了大数相减,能得到

x21.x_2\approx 1.

避免除数绝对值远小于被除数#

由商的绝对误差传播公式:

e(xy)=ye(x)xe(y)y2.e\left(\frac{x}{y}\right)=\frac{y e(x)-x e(y)}{y^2}.

yx|y|\ll |x| 时,分母 y2y^2 很小,误差会被显著放大。

所以在数值计算中,应尽量避免把很小的数放到分母里,特别是在小分母本身还有误差时。

简化计算,减少运算次数#

运算次数越多,舍入误差累计的机会越多。选择合适公式可以同时减少计算量和误差积累。

例:计算 ln2\ln 2#

若用交错级数

ln2=112+1314++(1)n1n+\ln2=1-\frac12+\frac13-\frac14+\cdots+\frac{(-1)^{n-1}}{n}+\cdots

取前 nn 项时,截断误差约不超过

1n+1.\frac{1}{n+1}.

若要求误差小于 10510^{-5},需要

n105.n\ge 10^5.

这意味着要计算十万项,效率很低,而且舍入误差也会累积。

利用级数

ln1+x1x=2(x+x33+x55++x2n+12n+1+),\ln\frac{1+x}{1-x}=2\left(x+\frac{x^3}{3}+\frac{x^5}{5}+\cdots+\frac{x^{2n+1}}{2n+1}+\cdots\right),

x=13,x=\frac13,

ln2=23[1+13×9+15×92++1(2n+1)9n+].\ln2=\frac23\left[1+\frac{1}{3\times 9}+\frac{1}{5\times 9^2}+\cdots+\frac{1}{(2n+1)9^n}+\cdots\right].

若只取前 55 项,截断误差满足

e<23111×95(1+19+192+)=112×11×94<105.e<\frac{2}{3}\cdot\frac{1}{11\times 9^5}\left(1+\frac19+\frac{1}{9^2}+\cdots\right) = \frac{1}{12\times 11\times 9^4}<10^{-5}.

显然,第二种算法效率更高。

例:多项式求值与秦九韶算法#

Pn(x)=anxn+an1xn1++a1x+a0.P_n(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots+a_1x+a_0.

若直接按定义计算,需要约

n(n+1)2\frac{n(n+1)}2

次乘法和 nn 次加法。

利用秦九韶算法,将多项式写成

Pn(x)=a0+x{a1+x[a2++x(an1+anx)]}.P_n(x)=a_0+x\{a_1+x[a_2+\cdots+x(a_{n-1}+a_nx)]\}.

递推形式为

{un=an,uk=xuk+1+ak,k=n1,n2,,0,Pn(x)=u0.\begin{cases} u_n=a_n,\\ u_k=xu_{k+1}+a_k,\qquad k=n-1,n-2,\cdots,0,\\ P_n(x)=u_0. \end{cases}

这样只需 nn 次乘法和 nn 次加法。

选用数值稳定性好的算法#

算法的数学形式可能等价,但数值效果可能相差很大。

选择算法时应优先考虑:

  • 是否会导致相近数相减;
  • 是否会让小误差在递推中持续放大;
  • 是否会出现大数吃小数;
  • 是否可通过变形减少运算次数;
  • 问题本身是否病态。

前面的积分递推例子表明:同一递推关系正向计算不稳定,反向计算稳定。


本章小结#

这一章可以抓住四条主线。

第一,误差来源:

模型误差、观测误差、截断误差、舍入误差

本章重点关注截断误差和舍入误差。

第二,误差度量:

e(x)=xx,e(x)ε,e(x^*)=x-x^*, \qquad |e(x^*)|\le \varepsilon,er(x)e(x)x,er(x)εr.e_r(x^*)\approx \frac{e(x^*)}{x^*}, \qquad |e_r(x^*)|\le \varepsilon_r.

有效数字用来同时描述近似值的大小和精度。若

x=±0.a1a2an×10m,x^*=\pm 0.a_1a_2\cdots a_n\times 10^m,

且有 nn 位有效数字,则

εr=12a1×10n+1\varepsilon_r=\frac{1}{2a_1}\times 10^{-n+1}

可作为相对误差限。

第三,误差传播:

e(y)i=1nfxie(xi),e(y^*)\approx \sum_{i=1}^{n}\frac{\partial f}{\partial x_i}e(x_i^*),

相对误差传播由

fxixif\frac{\partial f}{\partial x_i}\frac{x_i^*}{f}

决定放大倍数。

四则运算中:

  • 和差主要看绝对误差;
  • 积商主要看相对误差;
  • 相近数相减最容易丢失有效数字。

第四,算法选择:

  • 避免相消;
  • 避免大数吃小数;
  • 避免小分母放大误差;
  • 简化计算、减少运算次数;
  • 选数值稳定的算法;
  • 对线性方程组,还要关注条件数。

本章最重要的思想是:

数值计算不仅要算出一个答案,还要知道这个答案是否可靠,以及为什么可靠。

Chapter1:误差
https://www.sleepyfish2031.top/posts/课程笔记/计算方法/chapter1/
作者
Sleepyfish
发布于
2026-05-29
许可协议
CC BY-NC-SA 4.0