1775 字
9 分钟
误差
2026-03-03
浏览量 Loading

一、误差的基本概念#

由数学方法解决实际问题时,通常按照以下过程:

实际问题抽象、简化数学模型数值计算问题近似解实际问题\xrightarrow{抽象、简化}数学模型\xrightarrow{数值计算}问题近似解

引起误差的原因有很多:

  1. 模型误差:实际问题的解与数学模型解的之差。
  2. 观测误差:数学问题的一些参量的值往往由观测得到,但是观测不可能绝对准确,由此产生的误差称为“观测误差”。
  3. 截断误差:一般数学问题难以求出精确解,需要简化为较易求解的问题,以简化问题的解作为原问题解的近似,例如泰勒展开后省略后面的无穷多项。
  4. 舍入误差:计算过程中,受到机器字长的限制,无穷小数和位数很多的数必须舍入成一定的位数,这样的误差为“舍入误差”。

二、绝对误差和相对误差#

xx^*为准确值xx的一个近似值,称:

e(x)=xxe(x^*)=x-x^*

为近似值xx^*的绝对误差,简称误差。

根据测量工具或计算情况,可以估计出e(x)e(x^*)的取值范围,即估出误差绝对值的一个上界:

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

ε\varepsilon为近似值xx^*的绝对误差限,绝对误差限越小越好。根据绝对误差限的定义,可以将准确值写作:

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

xx^*为准确值xx的近似值,称绝对误差与准确值之比为近似值的相对误差,记作er(x)e_r(x^*)

er(x)=e(x)x=xxxe_r(x^*)=\frac{e(x^*)}{x}=\frac{x-x^*}{x}

由于计算过程中准确值xx难以得知。所以一般取相对误差为:

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

证明相对误差可以如上取得:

e(x)|e(x^*)|很小时,可以得到:

e(x)xe(x)x=e(x)(xx)xx=e2(x)xx=er(x)e~r(x)\begin{aligned} \frac{e(x^*)}{x^*}-\frac{e(x^*)}{x}&=\frac{e(x^*)(x-x^*)}{xx^*}\\&=\frac{e^2(x^*)}{xx*}\\&=e_{r}(x^*)\cdot\tilde{e}_r(x^*) \end{aligned}

可知两者的差是er(x)e_r(x^*)的高阶无穷小,可以忽略不计。

同样,相对误差只能估计其上限,如果存在正数εr\varepsilon_r使得:

er(x)=xxxεr|e_r(x^*)|=|\frac{x-x^*}{x^*}|\le\varepsilon_r

称其为xx^*的相对误差限,显然,误差限与近似值绝对值之比εx\frac{\varepsilon}{|x^*|}xx^*的一个相对误差限。

三、误差的传播#

1、基本运算中的误差估计#

由微分学,当自变量的改变量(误差)很小时,函数的微分作为函数的改变量的主要线性部分可以近似函数的改变量,故可以利用微分运算公式导出误差运算公式。设数值计算中求得的解与参量x1,x2,,xnx_1,x_2,\cdots,x_n有关,记为:

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

设不同参量的近似值为x1,x2,,xnx_1^*,x_2^*,\cdots,x_n^*,相应的解也会产生误差:

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

假设ff在点(x1,x2,,xn)(x_1^*,x_2^*,\cdots,x_n^*)处可微,则当参量误差很小时,根据:

f(x1,x2,,xn)=f(x1,x2,,xn)(x1x1,x2x2,,xnxn)+f(x1,x2,,xn)f(x_1,x_2,\cdots,x_n)=\nabla f(x_1^*,x_2^*,\cdots,x_n^*)\cdot(x_1-x_1^*,x_2-x_2^*,\cdots,x_n-x_n^*)+f(x_1^*,x_2^*,\cdots,x_n^*)f(x1,x2,,xn)(x1x1,x2x2,,xnxn)df(x1,x2,,xn)\nabla f(x_1^*,x_2^*,\cdots,x_n^*)\cdot(x_1-x_1^*,x_2-x_2^*,\cdots,x_n-x_n^*)\approx\mathrm{d}f(x_1^*,x_2^*,\cdots,x_n^*)

解的绝对误差为:

e(y)=yy=f(x1,x2,,xn)f(x1,x2,,xn)df(x1,x2,,xn)\begin{aligned} e(y^*)&=y-y^*\\&=f(x_1,x_2,\cdots,x_n)-f(x_1^*,x_2^*,\cdots,x_n^*)\\&\approx\mathrm{d}f(x_1^*,x_2^*,\cdots,x_n^*) \end{aligned}

其相对误差为:

er(y)=e(y)ydf(x1,x2,,xn)f(x1,x2,,xn)=d(lnf(x1,x2,,xn))\begin{aligned} e_r(y^*)&=\frac{e(y^*)}{y^*}\\&\approx\frac{\mathrm{d}f(x_1^*,x_2^*,\cdots,x_n^*)}{f(x_1^*,x_2^*,\cdots,x_n^*)}\\&=\mathrm{d}(\ln f(x_1^*,x_2^*,\cdots,x_n^*)) \end{aligned}

根据上面两式,可以得到和差积商的误差公式:

{e(x1±x2)=e(x1)±e(x2)e(x1x2)x2e(x1)+x1e(x2)e(x1x2)1x2e(x1)x1x22e(x2)\begin{cases} e(x_1\pm x_2)=e(x_1)\pm e(x_2)\\ e(x_1x_2)\approx x_2e(x_1)+x_1e(x_2)\\ e\left(\dfrac{x_1}{x_2}\right)\approx \dfrac{1}{x_2}e(x_1)-\dfrac{x_1}{x_2^2}e(x_2) \end{cases}{er(x1±x2)=x1x1±x2er(x1)±x2x1±x2er(x2)er(x1x2)er(x1)+er(x2)er(x1x2)er(x1)er(x2)\begin{cases} e_r(x_1\pm x_2)=\dfrac{x_1}{x_1\pm x_2}e_r(x_1)\pm \dfrac{x_2}{x_1\pm x_2}e_r(x_2)\\ e_r(x_1x_2)\approx e_r(x_1)+e_r(x_2)\\ e_r\left(\dfrac{x_1}{x_2}\right)\approx e_r(x_1)-e_r(x_2) \end{cases}

这样,再根据三角不等式,可以得到:

e(x1±x2)=e(x1)±e(x2)e(x1)+e(x2)|e(x_1\pm x_2)|=|e(x_1)\pm e(x_2)|\le |e(x_1)| + |e(x_2)|er(x1x2)er(x1)+er(x2)er(x1)+er(x2)|e_r(x_1x_2)|\approx |e_r(x_1)+e_r(x_2)|\le |e_r(x_1)|+|e_r(x_2)|er(x1x2)er(x1)er(x2)er(x1)+er(x2)|e_r\left(\dfrac{x_1}{x_2}\right)|\approx |e_r(x_1)-e_r(x_2)|\le|e_r(x_1)|+|e_r(x_2)|

2、算法的数值稳定性#

计算一个数学问题,求积分制:

In=01xnx+5dx(n=1,2,)I_n=\int_0^1\frac{x^n}{x+5}\mathrm{d}x\quad(n=1,2,\cdots)

注意到:

In+5In1=01(xnx+5+5xx1x+5)dx=01xn1dx=1nI_n+5I_{n-1}=\int_0^1(\frac{x^n}{x+5}+\frac{5x^{x-1}}{x+5})\mathrm{d}x=\int_0^1x^{n-1}\mathrm{d}x=\frac{1}{n}

根据被积分式,知随着nn增大,xnx^n递减,InI_n递减且大于00,可以得到:

In+1+5In=1n+1In<15(n+1)I_{n+1}+5I_n=\frac{1}{n+1}\Rightarrow I_n<\frac{1}{5(n+1)}In+1+5In=1n+16In>1n+1In>16(n+1)I_{n+1}+5I_{n}=\frac{1}{n+1}\Rightarrow 6I_n >\frac{1}{n+1}\Rightarrow I_n>\frac{1}{6(n+1)}

即:

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

可以设计两种算法:

  1. I0=011x+5=ln1.2I_0=\int_0^1 \frac{1}{x+5}=\ln 1.2按照递推公式以此计算出I1,I2,I_1,I_2,\cdots的近似值。
  2. In12[16(n+1)+15(n+1)]I_n^*\approx \frac12[\frac{1}{6(n+1)}+\frac{1}{5(n+1)}],按照递推公式一次计算出In1,In2,,I0I_{n-1},I_{n-2},\cdots,I_0的近似值。

使用方法一计算I0I24I_0\sim I_{24},下面给出其MATLAB代码:(代码中的I(n)代表In1I_{n-1}

format long
I = zeros(25,1);
I(1) = log(1.2);
for n = 1:24
I(n+1) = 1/n - 5 * I(n);
end
I(1:25)

然后使用方法二计算,下面给出其MATLAB代码:

format long
I = zeros(25,1);
I(25) = (1 / (6 * 25) + 1 / (5 * 25)) / 2;
for n = 24:-1:1
I(n) = (1 / n - I(n+1)) / 5;
end
I(1:25)

分别比较它们的输出结果:

方法一方法二
00.1823215567939550.182321556793955
10.0883922160302270.088392216030227
20.0580389198488650.058038919848866
30.0431387340890100.043138734089005
40.0343063295549500.034306329554975
50.0284683522252490.028468352225126
60.0243249055404190.024324905541035
70.0212326151550460.021232615151969
80.0188369242247700.018836924240154
90.0169264899872630.016926489910342
100.0153675500636860.015367550448288
110.0140713405906620.014071338667650
120.0129766303800230.012976639995085
130.0120399250229600.012039876947652
140.0112289463137730.011229186690311
150.0105219350978040.010520733215111
160.0098903245109820.009896333924444
170.0093719068568570.009341859789542
180.0086960212712710.008846256607844
190.0091514725910160.008400295908150
200.0042426370449220.007998520459251
210.0264058623944400.007626445322793
22-0.0865747665176540.007322318840580
230.4763520934578330.006866666666667
24-2.34009380062250.007333333333333

两种方法在nn值较小的时候,结果十分相近。但是按照方法一计算的结果,在n=22,24n=22,24时,积分值已经小于00,显然是错误的,这是舍入误差在计算过程中的传播所引起的后果,设II^*有误差e0e_0,假设在计算过程中不产生新的舍入误差,则由递推公式,可以得知第nn项的误差为:

en=(5)ne0e_n=(-5)^ne_0

即每递推一次,误差的绝对值就扩大五倍,上述计算过程中采用format long有16位有效数字,故:

ε0=12×1016\varepsilon_0=\frac{1}{2}\times 10^{-16}

那么在第n=21n=21时,误差满足:

ε21=521>12×102\varepsilon_{21}=5^{21}>\frac{1}{2}\times 10^{-2}

I21=0.026I_{21}=0.026\cdots,已经没有任何一位有效数字。而第二种方法中,尽管I24I_{24}的取值精度不高,其误差限:

ε=12(11251150)0.00067\varepsilon=\frac{1}{2}(\frac{1}{125}-\frac{1}{150})\approx0.00067

但是每一次递推,其误差的绝对值都在减小,到I0I_0时,满足:

e0=(15)nene_0=(-\frac{1}{5})^ne_n

上述事实说明,对于同一数学问题,使用的算法不同,效果也不同,我们称计算过程中舍入误差不增长的算法具有数值稳定性,否则数值就是不稳定的。例如上述问题中,方法一数值不稳定,方法二数值稳定,我们希望选择数值更加稳定的方法。

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

1、避免两个相近的数相减#

根据相对误差公式:

er(x1x2)=x1x1x2er(x1)x2x1x2er(x2)e_r(x_1 - x_2)=\dfrac{x_1}{x_1 - x_2}e_r(x_1) - \dfrac{x_2}{x_1 - x_2}e_r(x_2)

可知两数之差u=xyu=x-y的相对误差为:

er(u)=er(xy)=xer(x)yer(y)xy=e(x)e(y)xye_r(u)=e_r(x-y)=\frac{xe_r(x)-ye_r(y)}{x-y}=\frac{e(x)-e(y)}{x-y}

x,yx,y非常接近时,uu的相对误差很大,有效数字位数严重丢失,常常需要改变计算公式。下面是一些常用变换方法:

1cosx=2sin2x2,1cosxsinx=sinx1+cosxx01-\cos x=2\sin^2\frac{x}{2},\frac{1-\cos x}{\sin x}=\frac{\sin x}{1+\cos x}\quad x\to 0x+1x=1x+1+x,1x1x+1=1x(x+1)x较大\sqrt{x+1}-\sqrt{x}=\frac{1}{\sqrt{x+1}+\sqrt{x}},\frac 1 x-\frac 1 {x+1}=\frac{1}{x(x+1)}\quad x较大

2、避免大数吃小数的情况#

计算机在进行运算过程中,首先要把参加运算的数字进行对阶,即把两数都写成绝对值小于11而阶码相同的数,例如a=1000001a=1000001要改写为:

a=0.1×107+0.0000001×107a=0.1\times 10^{7}+0.0000001\times 10^{7}

如果计算机只能表示四位小数,那么计算出来的只有a=0.1×107a=0.1\times 10^7,大数部分把小数部分吃掉了。所以在连加过程中,先把较小的数字相加,然后再加大数,这样小数累加后的进位不会先被大数吃掉。

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

根据公式:

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

yx|y|\ll|x|时,舍入误差可能增大很多。

4、要简化运算、减少运算次数,提高效率#

对于计算ln2\ln 2的数值,如果直接使用ln(1+x)\ln(1+x)的麦克劳林级数展开,取前nn项的和用来计算近似值,截断误差为1n+1\frac{1}{n+1},如果要求误差小于10510^{-5},则n105n\ge10^5,要对前十万项求和,计算量很大,并且舍入误差积累使得有效数字丢失严重,如果使用级数:

ln1+x1x=2x(1+13x2+15x4++x2n2n+1+)\ln\frac{1+x}{1-x}=2x(1+\frac{1}{3}x^2+\frac{1}{5}x^4+\cdots+\frac{x^{2n}}{2n+1}+\cdots)

来计算,取x=13x=\frac 13,取级数的前五项即可满足要求。显然这种方法更有效。

对于计算多项式的值:

Pn(x)=anxn+an1xn1++a1x+a0P_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(a3+x(a4+))]}P_n(x)=a_0+x\{a_1+x[a_2+x(a_3+x(a_4+\cdots)\cdots)]\}

则只需要进行nn次加法和nn次乘法。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

误差
https://www.laoguantx.cn/posts/error/
作者
老官童鞋gogo
发布于
2026-03-03
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时