第一章 误差与有效数字
1.1 误差分类
(一)模型误差
在用计算机解决实际问题时,需将实际问题转化为数学模型。数学模型是对实际问题的抽象、简化,忽略了一些次要因素,是客观现象的近似、粗糙描述。数学模型与实际问题之间出现的误差称为模型误差。例如牛顿第二定律建立的模型,虽为优秀近似,但实际中因风、空气阻力等微小变化因素,无法准确预测结果,计算时需进行处理或简化。
(二)参数误差(观测误差)
数学模型中物理参数的具体数值一般通过实验测定或观测得到,与真值之间存在的误差称为参数误差或观测误差。产生原因如下:
- 测量仪器:测量依赖测量仪器,每种仪器精度有限,且受制造工艺限制存在一定误差,限制了观测值精度。
- 观测者:不同观测者感觉器官辨别能力有差异,同一观测者在不同时间、空间的辨别能力也会不同。
- 外界条件:温度、湿度、压强、风力、大气折光、电离层等因素会直接影响观测结果,且随这些因素变化影响不同,导致观测结果产生误差。
(三)方法误差(截断误差)
在数学模型及其参数值确定后,采用数值方法计算时,由于多数数值方法是近似方法,计算结果与准确值之间存在的误差,称为方法误差或截断误差。
示例:对于定积分I=∫0211+x31dx
- 解析解求解:在MATLAB中,使用符号运算工具箱的
int函数可求其解析解。
- 近似值计算:利用5阶泰勒级数近似代替被积函数计算近似值,需使用
taylor函数进行泰勒展开。
MATLAB实现代码:
syms x;
y = 1/(1 + x^3);
I1 = int(y, 0, 1/2);
yt = taylor(y, x, 'order', 6);
I2 = int(yt, 0, 1/2);
fplot(y, [0, 1/2], 'k', 'linewidth', 2);
hold on;
fplot(yt, [0, 1/2], 'k--', 'linewidth', 2);
legend(gca, {'$y =' + latex(y) + '$', '${y_t}=' + latex(yt) + '$'}, 'interpreter', 'latex', 'fontsize', 12, 'Position', [0.65, 0.7, 0.25, 0.2]);
text(0.05, 0.92, {'$\int_{0}^{\frac{1}{2}} {y}dx=' + latex(I1) + '$'}, 'interpreter', 'latex', 'fontsize', 12);
text(0.05, 0.9, {'$\int_{0}^{\frac{1}{2}} {y_t}dx=' + latex(I2) + '$'}, 'interpreter', 'latex', 'fontsize', 12);
(四)舍入误差
在计算机数值计算中,因数据位数可能很多甚至无穷,而计算机字长有限,对中间结果数据按“四舍五入”等规则取近似值,导致计算过程产生的误差,称为舍入误差。例如,在MATLAB中,[−90071992547409929007199254740993,−1801439850948198418014398509481983)内的所有实数都表示为 -1,就会产生舍入误差。
误差分类总结
- 固有误差:建立数学模型时就存在的模型误差和观测误差,是客观存在的。
- 计算误差:由计算方法引起的截断误差和舍入误差,在数值计算方法中主要讨论计算误差。
1.2 绝对误差与相对误差
(一)绝对误差
数值误差源于近似的数值操作,准确值x与近似值x∗的差值e=x−x∗,称为近似值x∗的绝对误差。通常难以算出准确值x和误差准确值,只能估计误差范围,即∣e∣=∣x−x∗∣≤ε,ε为近似值x∗的绝对误差限,也可表示为x=x∗±ε。
(二)相对误差
绝对误差定义未考虑被估计值量级。例如x1=x1∗±e1=10±1,x2=x2∗±e2=1000±5,虽e2>e1,但不能说明x1∗近似程度比x2∗好。因此将误差相对真值归一化,er=xx−x∗为近似值x∗的相对误差,相对误差限记为∣er∣=xx−x∗=∣x∣∣e∣≤εr ,实际中常用εr∗=∣x∗∣ε近似相对误差限。
1.3 有效数字
(一)定义
若近似值x∗的误差限是某一数位的半个单位,且该位到x∗的第一位非零数字共有n位,则称x∗具有n位有效数字。科学计数法表示为x∗=±0.a1a2⋯an×10m(即x∗=±(a1×10−1+a2×10−2+⋯+an×10−n)×10m ),其中m为整数,a1,a2,⋯,an是0∼9间整数,且a1=0,误差限ε=21×10m−n。
(二)MATLAB 实现
可编写函数getdigits求近似值的有效数字位数及误差限,代码如下:
function [n,e]=getdigits(xtrue,x)
err=xtrue-x;
[~,m]=enotation(x);
[err,q]=enotation(err);
if err<5
n=m-q;
else
n=m-q-1;
end
e=sym(1/2)*10^(m-n);
function [x,m]=enotation(x)
x=abs(x);
p=0;
while x>=10
x=x/10;
p=p+1;
end
if x~=0
while x<1
x=x*10;
p=p-1;
end
end
m=p+1;
end
end
(三)示例
已知圆周率π真值为3.1415926535897931⋯ :
- 当近似值π∗=3.1415时,调用
getdigits函数可得有效数字位数为4,误差限为1/2000。
- 当近似值π∗=3.141593 时,调用
getdigits函数可得有效数字位数为6,误差限为1/200000 。
1.4 误差的传播与估计
在数值计算中,参与运算的数据多为近似数,本身带有误差,这些误差会在运算中传播与积累,从而影响计算结果的准确性。虽然精确确定计算结果的精度较为困难,但对计算误差进行定量估计是可行的。
-
原始公式推导:
- 对于函数f(x1,x2),其泰勒展开式包含高阶项+2!1[(∂x12∂2f)∗⋅(x1−x1∗)2+2(∂x1∂x2∂2f)∗⋅(x1−x1∗)(x2−x2∗)+(∂x22∂2f)∗⋅(x2−x2∗)2]+⋯,其中x1−x1∗=e(x1)和x2−x2∗=e(x2)一般为小量值。
- 忽略高阶小量后,f(x1,x2)可简化为f(x1,x2)=f(x1∗,x2∗)+[(∂x1∂f)∗⋅e(x1)+(∂x2∂f)∗⋅e(x2)]。
-
绝对误差传播公式:
- 设y=f(x1,x2),y∗=f(x1∗,x2∗),绝对误差e(y)=y−y∗。
- 则e(y)=f(x1,x2)−f(x1∗,x2∗)≈(∂x1∂f)∗⋅e(x1)+(∂x2∂f)∗⋅e(x2) 。
- 式中(∂x1∂f)∗和(∂x2∂f)∗分别是x1∗和x2∗对y∗的绝对误差增长因子,用于表示绝对误差e(x1)和e(x2)经过传播后增大或缩小的倍数。
-
相对误差传播公式
相对误差传播公式为
εr∗(y)=∣y∗∣ε(y)≈i=1∑n[(∂xi∂f)∗⋅∣y∗∣ε(xi)]=i=1∑n[y∗xi∗(∂xi∂f)∗⋅εr∗(xi)]
。当误差增长因子的绝对值很大时,数据误差经运算传播后,可能导致结果出现较大误差。
两数和、差、积与商的误差传播公式
- 绝对误差:
- e(x1±x2)≈e(x1)±e(x2)
- e(x1x2)≈x2∗e(x1)+x1∗e(x2)
- e(x2x1)≈x2∗1e(x1)−(x2∗)2x1∗e(x2) (x2∗=0)
- 相对误差:
- er∗(x1±x2)≈x1∗±x2∗x1∗er∗(x1)±x1∗±x2∗x2∗er∗(x2)
- er∗(x1x2)≈er∗(x1)+er∗(x2)
- er∗(x2x1)≈er∗(x1)−er∗(x2) (x2=0)
示例
已知a=2018,b=2017 ,要估计a−b的有效数字位数。
- 分析思路:
- 利用
vpa函数结合char函数和str2double函数获取a和b具有8位有效数字的近似值。
- 调用
getdigits函数求得a和b近似值的误差限。
- 根据误差传播公式(两数差的绝对误差公式e(x1−x2)≈e(x1)+e(x2) )得到a−b的误差限。
- 依据误差限反推出a−b的有效数字位数。
- 完整MATLAB代码:
format longG;
a = sqrt(2018);
b = sqrt(2017);
a1 = str2double(char(vpa(a, 8)));
[n1,e1]=getdigits(a,a1);
b1 = str2double(char(vpa(b, 8)));
[n2,e2]=getdigits(b,b1);
e = e1 + e2;
m = ceil(log10(abs(a1 - b1)));
n = fix(log10(10^m/(2*e)));
- 结果说明:
通过上述代码,可得到a和b近似值的相关信息以及a−b的有效数字位数。需要注意,由误差估计式得出绝对误差限和相对误差限时,因取绝对值并用三角不等式放大,是按最坏情形给出,结果较为保守 。