误差分析基础
误差的来源
- 计算前的误差
- 模型误差:问题建模不准确产生的误差,例如动力学计算中忽略空气阻力、地球表面积计算将地球近似为球体等
- 数据误差:常数、测量值、上一步计算结果等存在的误差
- 计算中的误差
- 截断误差:计算方法上产生的误差,例如使用3阶Taylor公式近似计算f(x)=sinx,4阶及以上的小量构成了截断误差
- 舍入误差:计算时用于表示数据的位数有限
误差及其分类
设某数据的准确值为x,计算中采取或计算出的近似值为x^,则绝对误差定义为:
e(x^)=x^−x
相对误差定义为:
er(x^)=xx^−x
实际情况下,准确值往往未知,此时精确的误差无法得知,往往使用估计的最大误差来讨论,称为误差限。绝对误差限和相对误差限分别记为ε(x^)、εr(x^)
定理:有效数字与相对误差
设对x保留p位有效数字得到x^,则x^的相对误差有界:
∣εr(x^)∣≤d05×10−p
其中d0为第一位有效数字
定理:上述定理的逆命题
设x的第一位有效数字为d0,若近似值x^的相对误差满足
∣εr(x^)∣≤d0+15×10−p
则x与x^至少满足以下两种情形之一:
- 二者前p位有效数字相同
- 或二者保留p位有效数字后的结果相同
上面的两种情形其实是对“两个数在p位有效数字精度下相同”这句模糊表述的两种解释,例如对x=9.1243,x^1=9.1247和x^2=9.1238分别是上面的两种情形
数据传递误差与计算误差
例如,用x^代替x近似计算f(x),计算结果为f^(x^),则误差分为两部分:
ε(f^(x^))=[f^(x^)−f(x^)]+[f(x^)−f(x)]
第一部分为 实际计算的函数与精确函数f不同带来的误差 ,即计算误差
第二部分为 使用的数据并非精确值带来的误差 ,即数据传递误差
计算误差的两部分:截断误差和舍入误差
考虑以下问题:使用差商近似一阶导数,即
f′(x)≈hf(x+h)−f(x)
由于
f(x+h)=f(x)+hf′(x)+2h2f′′(ξ), ξ∈(x,x+h)
于是
f′(x)−hf(x+h)−f(x)=−2hf′′(ξ)
设∣f′′(ξ)∣≤M,则
f′(x)−hf(x+h)−f(x)≤2Mh
这部分是截断误差,即展开式阶数不够带来的误差
εT=2Mh
每次计算函数f会带来ϵ的舍入误差,则总舍入误差
εR=h2ϵ
于是
ε=εT+εR=2Mh+h2ϵ
则可以取使误差最小的h作为最终模拟步长
hopt=2Mϵ
此时的误差为
εmin=2ϵM
问题的敏感性
考虑输入数据的扰动(即数据传递误差)对问题结果的影响,若影响很大,则问题敏感或病态,否则称问题不敏感或良态;问题敏感性相对的概念为稳定性
问题的敏感性可以用条件数来反映:
cond=∣Δx/x∣∣Δf/f∣
当Δx→0时
cond=f(x)xf′(x)
条件数越大,问题越病态
类似地可以定义绝对条件数:
condA=∣Δx∣∣Δf∣
注:条件数反应的是问题的特性,与计算方法无关,因此不考虑截断误差f^(x^)−f(x^)
对于简单的运算可以估算数据传递误差限:
设对某多元函数y=f(x1,x2,⋯,xn),输入数据扰动得到的近似值为y^=f(x^1,x^2,⋯,x^n)
注意:这里同样不考虑截断误差
则
y^−y=f(x^1,x^2,⋯,x^n)−f(x1,x2,⋯,xn)
≈k=1∑n(x^k−xk)∂xk∂f(x^1,x^2,⋯,x^n)
由于
k=1∑n(x^k−xk)∂xk∂f(x^1,x^2,⋯,x^n)≤k=1∑n(x^k−xk)∂xk∂f(x^1,x^2,⋯,x^n)
≤ε(x^)k=1∑n∂xk∂f(x^1,x^2,⋯,x^n)
于是
ε(y^)=ε(x^)k=1∑n∂xk∂f(x^1,x^2,⋯,x^n)
这里偏导数的自变量取近似值,是因为在实际应用中近似值可知而精确值不可知
例1:长度为100的向量求和
算法1:按存储顺序求和
算法2:先按绝对值从小到大排序,再按此顺序求和
假设所求和的数为2.0,0.01,0.01,⋯,0.01,求和时的数据精度为2位十进制,则算法1结果为2.0,算法2结果为3.0
于是算法2更稳定
上面分析的思路是:计算数据精度越低时,数据传递误差越大,因此如果一种算法在较低精度时偏差较大,说明其不稳定
例2:计算ϕ=25−1的前n次幂
设n=20,采取近似值x=0.618034,使用双精度浮点数计算,可以忽略舍入误差
算法1:直接计算xn
算法2:利用递推式
{ϕn+1=ϕn−1−ϕnϕ0=1, ϕ1≈x
设e(ϕn^)=en,则在算法2中
e0=0
e1=x−ϕ
e2=−e1
e3=e1−e2=2e1
e4=e2−e3=−3e1
类推可知
e20=−F20e1
其中F20为Fibonacci数列第20项,此时相对误差已大于1
对于算法1,
e20=x20−ϕ20=(ϕ+e1)20−ϕ20≈20ϕ19e1
由于ϕ<1,显然
20ϕ19<<F20
结论:较快速的算法不一定稳定,实际应用中需要折中考虑
算法稳定性的向后误差分析
现在用某种方法来近似函数求值问题y=f(x),设得到的近似值为(仅考虑方法误差)
y^=f^(x)
此时找到一个与上述方法误差等效的数据传递误差,即找到x^使
y^=f(x^)
则
Δx=x^−x
称为方法的向后误差,向后误差越大,说明算法可以容忍的数据传递误差越大,即算法越稳定
浮点数
浮点数存储中,尾数的有效数字位数称为精度位数p,注意由于第一位有效数字并不存储,实际精度位数为存储尾数位数+1
浮点数的机器精度为εmach=2−p(这实际上是一个相对误差)
设指数的下限值为L,上限值为U,若不考虑非规范数,则下溢值为2L,上溢值为(2−2−(p−1))2U
浮点数系统由进制、精度位数、指数下限、指数上限确定
定理(浮点数的相对误差限)
设x的浮点数表示为fl(x),则
xfl(x)−x≤εmach
定理(大数吃小数)
对两个浮点数x1,x2,若
x1x2≤21εmach
则x2对x1+x2的浮点数运算值毫无影响
浮点数的抵消现象
两个值相近、有效数字位数较高的浮点数相减,得到的数准确的有效数字位数可能很低,相对误差被放大
上述现象称为浮点数的抵消
抵消现象可以通过调整算法来避免,例如求一元二次方程的根,但其中有一个根很接近0(∣4ac∣<<b2, b>0)
此时正常应用求根公式求解靠近0的根:
x1=2a−b+b2−4ac
则分子会发生抵消。可以通过分子有理化来解除这个抵消:
x1=−b−b2−4ac2c
减小舍入误差的几点建议
- 使用双精度浮点数
- 对于运算次数很多的算法,可以采取以下建议:
- 避免乘除法中间结果溢出
- 避免加减法大数吃小数
- 避免同号相近数相减(抵消)
- 尽可能减少运算次数