一、误差的基本概念#
由数学方法解决实际问题时,通常按照以下过程:
实际问题抽象、简化数学模型数值计算问题近似解引起误差的原因有很多:
- 模型误差:实际问题的解与数学模型解的之差。
- 观测误差:数学问题的一些参量的值往往由观测得到,但是观测不可能绝对准确,由此产生的误差称为“观测误差”。
- 截断误差:一般数学问题难以求出精确解,需要简化为较易求解的问题,以简化问题的解作为原问题解的近似,例如泰勒展开后省略后面的无穷多项。
- 舍入误差:计算过程中,受到机器字长的限制,无穷小数和位数很多的数必须舍入成一定的位数,这样的误差为“舍入误差”。
二、绝对误差和相对误差#
设x∗为准确值x的一个近似值,称:
e(x∗)=x−x∗为近似值x∗的绝对误差,简称误差。
根据测量工具或计算情况,可以估计出e(x∗)的取值范围,即估出误差绝对值的一个上界:
∣e(x∗)∣=∣x−x∗∣≤ε称ε为近似值x∗的绝对误差限,绝对误差限越小越好。根据绝对误差限的定义,可以将准确值写作:
x=x∗±ε设x∗为准确值x的近似值,称绝对误差与准确值之比为近似值的相对误差,记作er(x∗):
er(x∗)=xe(x∗)=xx−x∗由于计算过程中准确值x难以得知。所以一般取相对误差为:
er(x∗)=x∗e(x∗)
证明相对误差可以如上取得:
当∣e(x∗)∣很小时,可以得到:
x∗e(x∗)−xe(x∗)=xx∗e(x∗)(x−x∗)=xx∗e2(x∗)=er(x∗)⋅e~r(x∗)
可知两者的差是er(x∗)的高阶无穷小,可以忽略不计。
同样,相对误差只能估计其上限,如果存在正数εr使得:
∣er(x∗)∣=∣x∗x−x∗∣≤εr称其为x∗的相对误差限,显然,误差限与近似值绝对值之比∣x∗∣ε为x∗的一个相对误差限。
三、误差的传播#
1、基本运算中的误差估计#
由微分学,当自变量的改变量(误差)很小时,函数的微分作为函数的改变量的主要线性部分可以近似函数的改变量,故可以利用微分运算公式导出误差运算公式。设数值计算中求得的解与参量x1,x2,⋯,xn有关,记为:
y=f(x1,x2,⋯,xn)设不同参量的近似值为x1∗,x2∗,⋯,xn∗,相应的解也会产生误差:
y∗=f(x1∗,x2∗,⋯,xn∗)假设f在点(x1∗,x2∗,⋯,xn∗)处可微,则当参量误差很小时,根据:
f(x1,x2,⋯,xn)=∇f(x1∗,x2∗,⋯,xn∗)⋅(x1−x1∗,x2−x2∗,⋯,xn−xn∗)+f(x1∗,x2∗,⋯,xn∗)∇f(x1∗,x2∗,⋯,xn∗)⋅(x1−x1∗,x2−x2∗,⋯,xn−xn∗)≈df(x1∗,x2∗,⋯,xn∗)解的绝对误差为:
e(y∗)=y−y∗=f(x1,x2,⋯,xn)−f(x1∗,x2∗,⋯,xn∗)≈df(x1∗,x2∗,⋯,xn∗)其相对误差为:
er(y∗)=y∗e(y∗)≈f(x1∗,x2∗,⋯,xn∗)df(x1∗,x2∗,⋯,xn∗)=d(lnf(x1∗,x2∗,⋯,xn∗))根据上面两式,可以得到和差积商的误差公式:
⎩⎨⎧e(x1±x2)=e(x1)±e(x2)e(x1x2)≈x2e(x1)+x1e(x2)e(x2x1)≈x21e(x1)−x22x1e(x2)⎩⎨⎧er(x1±x2)=x1±x2x1er(x1)±x1±x2x2er(x2)er(x1x2)≈er(x1)+er(x2)er(x2x1)≈er(x1)−er(x2)这样,再根据三角不等式,可以得到:
∣e(x1±x2)∣=∣e(x1)±e(x2)∣≤∣e(x1)∣+∣e(x2)∣∣er(x1x2)∣≈∣er(x1)+er(x2)∣≤∣er(x1)∣+∣er(x2)∣∣er(x2x1)∣≈∣er(x1)−er(x2)∣≤∣er(x1)∣+∣er(x2)∣2、算法的数值稳定性#
计算一个数学问题,求积分制:
In=∫01x+5xndx(n=1,2,⋯)注意到:
In+5In−1=∫01(x+5xn+x+55xx−1)dx=∫01xn−1dx=n1根据被积分式,知随着n增大,xn递减,In递减且大于0,可以得到:
In+1+5In=n+11⇒In<5(n+1)1In+1+5In=n+11⇒6In>n+11⇒In>6(n+1)1即:
6(n+1)1<In<5(n+1)1可以设计两种算法:
- 取I0=∫01x+51=ln1.2按照递推公式以此计算出I1,I2,⋯的近似值。
- 取In∗≈21[6(n+1)1+5(n+1)1],按照递推公式一次计算出In−1,In−2,⋯,I0的近似值。
使用方法一计算I0∼I24,下面给出其MATLAB代码:(代码中的I(n)代表In−1)
然后使用方法二计算,下面给出其MATLAB代码:
I(25) = (1 / (6 * 25) + 1 / (5 * 25)) / 2;
I(n) = (1 / n - I(n+1)) / 5;
分别比较它们的输出结果:
| 方法一 | 方法二 |
|---|
| 0 | 0.182321556793955 | 0.182321556793955 |
| 1 | 0.088392216030227 | 0.088392216030227 |
| 2 | 0.058038919848865 | 0.058038919848866 |
| 3 | 0.043138734089010 | 0.043138734089005 |
| 4 | 0.034306329554950 | 0.034306329554975 |
| 5 | 0.028468352225249 | 0.028468352225126 |
| 6 | 0.024324905540419 | 0.024324905541035 |
| 7 | 0.021232615155046 | 0.021232615151969 |
| 8 | 0.018836924224770 | 0.018836924240154 |
| 9 | 0.016926489987263 | 0.016926489910342 |
| 10 | 0.015367550063686 | 0.015367550448288 |
| 11 | 0.014071340590662 | 0.014071338667650 |
| 12 | 0.012976630380023 | 0.012976639995085 |
| 13 | 0.012039925022960 | 0.012039876947652 |
| 14 | 0.011228946313773 | 0.011229186690311 |
| 15 | 0.010521935097804 | 0.010520733215111 |
| 16 | 0.009890324510982 | 0.009896333924444 |
| 17 | 0.009371906856857 | 0.009341859789542 |
| 18 | 0.008696021271271 | 0.008846256607844 |
| 19 | 0.009151472591016 | 0.008400295908150 |
| 20 | 0.004242637044922 | 0.007998520459251 |
| 21 | 0.026405862394440 | 0.007626445322793 |
| 22 | -0.086574766517654 | 0.007322318840580 |
| 23 | 0.476352093457833 | 0.006866666666667 |
| 24 | -2.3400938006225 | 0.007333333333333 |
两种方法在n值较小的时候,结果十分相近。但是按照方法一计算的结果,在n=22,24时,积分值已经小于0,显然是错误的,这是舍入误差在计算过程中的传播所引起的后果,设I∗有误差e0,假设在计算过程中不产生新的舍入误差,则由递推公式,可以得知第n项的误差为:
en=(−5)ne0即每递推一次,误差的绝对值就扩大五倍,上述计算过程中采用format long有16位有效数字,故:
ε0=21×10−16那么在第n=21时,误差满足:
ε21=521>21×10−2而I21=0.026⋯,已经没有任何一位有效数字。而第二种方法中,尽管I24的取值精度不高,其误差限:
ε=21(1251−1501)≈0.00067但是每一次递推,其误差的绝对值都在减小,到I0时,满足:
e0=(−51)nen上述事实说明,对于同一数学问题,使用的算法不同,效果也不同,我们称计算过程中舍入误差不增长的算法具有数值稳定性,否则数值就是不稳定的。例如上述问题中,方法一数值不稳定,方法二数值稳定,我们希望选择数值更加稳定的方法。
四、数值计算中应该注意的问题#
1、避免两个相近的数相减#
根据相对误差公式:
er(x1−x2)=x1−x2x1er(x1)−x1−x2x2er(x2)可知两数之差u=x−y的相对误差为:
er(u)=er(x−y)=x−yxer(x)−yer(y)=x−ye(x)−e(y)当x,y非常接近时,u的相对误差很大,有效数字位数严重丢失,常常需要改变计算公式。下面是一些常用变换方法:
1−cosx=2sin22x,sinx1−cosx=1+cosxsinxx→0x+1−x=x+1+x1,x1−x+11=x(x+1)1x较大2、避免大数吃小数的情况#
计算机在进行运算过程中,首先要把参加运算的数字进行对阶,即把两数都写成绝对值小于1而阶码相同的数,例如a=1000001要改写为:
a=0.1×107+0.0000001×107如果计算机只能表示四位小数,那么计算出来的只有a=0.1×107,大数部分把小数部分吃掉了。所以在连加过程中,先把较小的数字相加,然后再加大数,这样小数累加后的进位不会先被大数吃掉。
3、避免除数的绝对值远小于被除数的绝对值#
根据公式:
e(yx)=y2ye(x)−xe(y)当∣y∣≪∣x∣时,舍入误差可能增大很多。
4、要简化运算、减少运算次数,提高效率#
对于计算ln2的数值,如果直接使用ln(1+x)的麦克劳林级数展开,取前n项的和用来计算近似值,截断误差为n+11,如果要求误差小于10−5,则n≥105,要对前十万项求和,计算量很大,并且舍入误差积累使得有效数字丢失严重,如果使用级数:
ln1−x1+x=2x(1+31x2+51x4+⋯+2n+1x2n+⋯)来计算,取x=31,取级数的前五项即可满足要求。显然这种方法更有效。
对于计算多项式的值:
Pn(x)=anxn+an−1xn−1+⋯+a1x+a0如果直接相加,那么需要做2n(n+1)次乘法和n次加法,但是改为使用秦九韶算法:
Pn(x)=a0+x{a1+x[a2+x(a3+x(a4+⋯)⋯)]}则只需要进行n次加法和n次乘法。