数值计算复习笔记之(一)误差定义
误差
准确值与近似值的差距就是误差。
误差通常来自于
- 截断误差:由简化问题引起的误差,如求收敛级数之和的近似值 c o s ( x ) = 1 − x 2 2 ! + x 4 4 ! − x 6 6 ! + ⋯ + ( − 1 ) n x 2 n ( 2 n ) ! + ⋯ ≈ 1 − x 2 2 ! cos(x)=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\cdots+\frac{(-1)^nx^{2n}}{(2n)!}+\cdots\approx1-\frac{x^2}{2!} cos(x)=1−2!x2+4!x4−6!x6+⋯+(2n)!(−1)nx2n+⋯≈1−2!x2。
- 舍入误差:由采取舍入操作引起的误差,通常因为计算机等精度限制。
- 模型误差及观测误差:由数学模型、观测引起的误差。
基本上只研究舍入误差和截断误差。
绝对误差与相对误差
设近似值
x
∗
x^*
x∗近似于准确值
x
x
x,那么
x
∗
x^*
x∗的绝对误差(即误差)表示为:
e
(
x
∗
)
=
x
−
x
∗
e(x^*)=x-x^*
e(x∗)=x−x∗
由于难以求出准确值,只能估算出误差绝对值的某个上界
ϵ
\epsilon
ϵ,这些上界称为绝对误差限(即误差限):
∣
e
(
x
∗
)
∣
≤
ϵ
|e(x^*)|\le\epsilon
∣e(x∗)∣≤ϵ
- 注意误差有正负之分,而误差限总是正值
- 误差限不唯一
近似值
x
∗
x^*
x∗的误差与准确值
x
x
x之比称为相对误差
e
r
(
x
∗
)
e_r(x^*)
er(x∗),由于难以求出准确值,一般取相对误差为:
e
r
(
x
∗
)
=
e
(
x
∗
)
x
∗
e_r(x^*)=\frac{e(x^*)}{x^*}
er(x∗)=x∗e(x∗)
相似的,估算相对误差的某个上界
ϵ
r
\epsilon_r
ϵr,这些上界称为相对误差限:
∣
e
r
(
x
∗
)
∣
≤
ϵ
r
|e_r(x^*)|\le\epsilon_r
∣er(x∗)∣≤ϵr
有效数字
如果近似值 x ∗ x^* x∗的误差限是 0.5 × 1 0 − n 0.5×10^{-n} 0.5×10−n ,则称 x ∗ x^* x∗准确到小数点后的第 n n n位,从第一个非零数字到这一位的所有数字均称为有效数字。
如 x = 0.003400 ± 0.5 × 1 0 − 5 x=0.003400\pm 0.5×10^{-5} x=0.003400±0.5×10−5 表示近似值 x ∗ = 0.003400 x^*=0.003400 x∗=0.003400 精确到小数点后第5位,有3位有效数字。
有效数字与相对误差限关系
若
x
∗
x^*
x∗有
n
n
n位有效数字,
a
1
a_1
a1为首位有效数字,则
x
∗
x^*
x∗的相对误差限为:
1
2
a
1
×
1
0
−
n
+
1
\frac{1}{2a_1}×10^{-n+1}
2a11×10−n+1
反之,若
x
∗
x^*
x∗的相对误差限
ϵ
r
\epsilon_r
ϵr满足:
ϵ
r
≤
1
2
a
1
×
1
0
−
n
+
1
\epsilon_r\le\frac{1}{2a_1}×10^{-n+1}
ϵr≤2a11×10−n+1
则
x
∗
x^*
x∗至少有
n
n
n位有效数字。
误差基本运算
记
y
=
f
(
x
1
,
x
2
,
⋯
,
x
n
)
y=f(x_1,x_2,\cdots,x_n)
y=f(x1,x2,⋯,xn) ,近似解记为
y
∗
=
f
(
x
1
∗
,
x
2
∗
,
⋯
,
x
n
∗
)
y^*=f(x_1^*,x_2^*,\cdots,x_n^*)
y∗=f(x1∗,x2∗,⋯,xn∗) ,假定
f
f
f在点
(
x
1
∗
,
x
2
∗
,
⋯
,
x
n
∗
)
(x_1^*,x_2^*,\cdots,x_n^*)
(x1∗,x2∗,⋯,xn∗)可微,解的误差为:
e
(
y
∗
)
=
y
−
y
∗
≈
d
y
∗
=
∑
i
=
1
n
∂
y
∗
∂
x
i
⋅
e
(
x
i
∗
)
\begin{aligned} e(y^*)=y-y^* &\approx dy^* \\ &= \sum_{i=1}^{n} \frac{\partial y^*}{\partial x_i}·e(x_i^*) \end{aligned}
e(y∗)=y−y∗≈dy∗=i=1∑n∂xi∂y∗⋅e(xi∗)
由 Δ y = A Δ x + o ( Δ x ) \Delta y = A\Delta x + o(\Delta x) Δy=AΔx+o(Δx) ,这里的 A A A就是偏导 ∂ y ∗ ∂ x \frac{\partial y^*}{\partial x} ∂x∂y∗ , Δ x \Delta x Δx就是 e ( x ∗ ) e(x^*) e(x∗), d y dy dy即 A Δ x A\Delta x AΔx 。
微分学中,当自变量改变量 Δ x \Delta x Δx(这里可以看做是误差)很小时,函数的微分 d y = A Δ x dy=A\Delta x dy=AΔx 作为函数该变量的主要线性部分可以近似函数的改变量 Δ y \Delta y Δy,故利用微分运算公式可导出误差运算公式。
导出误差基本运算公式:
{
e
(
x
1
±
x
2
)
=
e
(
x
1
)
±
e
(
x
2
)
e
(
x
1
x
2
)
≈
x
2
e
(
x
1
)
+
x
1
e
(
x
2
)
e
(
x
1
x
2
)
≈
1
x
2
e
(
x
1
)
−
x
1
x
2
2
e
(
x
2
)
\left\{ \begin{aligned} 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(\frac{x_1}{x_2})&\approx \frac{1}{x_2}e(x_1)-\frac{x_1}{x_2^2} e(x_2)\\ \end{aligned} \right.
⎩⎪⎪⎪⎨⎪⎪⎪⎧e(x1±x2)e(x1x2)e(x2x1)=e(x1)±e(x2)≈x2e(x1)+x1e(x2)≈x21e(x1)−x22x1e(x2)
解的相对误差为:
e
(
y
∗
)
=
e
(
y
∗
)
y
∗
≈
d
y
∗
y
∗
=
∑
i
=
1
n
∂
y
∗
∂
x
i
⋅
e
(
x
i
∗
)
y
∗
\begin{aligned} e(y^*)=\frac{e(y^*)}{y^*} &\approx \frac{dy^*}{y^*} \\ &= \sum_{i=1}^{n} \frac{\partial y^*}{\partial x_i}·\frac{ e(x_i^*) }{y^*} \end{aligned}
e(y∗)=y∗e(y∗)≈y∗dy∗=i=1∑n∂xi∂y∗⋅y∗e(xi∗)
导出相对误差基本运算公式:
{
e
r
(
x
1
±
x
2
)
=
e
(
x
1
)
±
e
(
x
2
)
x
1
±
x
2
e
r
(
x
1
x
2
)
≈
e
(
x
1
)
x
1
+
e
(
x
2
)
x
2
=
e
r
(
x
1
)
+
e
r
(
x
2
)
e
(
x
1
x
2
)
≈
e
(
x
1
)
x
1
−
e
(
x
2
)
x
2
=
e
r
(
x
1
)
−
e
r
(
x
2
)
\left\{ \begin{aligned} e_r(x_1 \pm x_2)&= \frac{ e(x_1) \pm e(x_2) }{x_1 \pm x_2}\\ e_r(x_1x_2)&\approx \frac{ e(x_1)}{x_1}+\frac{ e(x_2)}{x_2}=e_r(x_1)+e_r(x_2)\\ e(\frac{x_1}{x_2})&\approx \frac{e(x_1)}{x_1}-\frac{e(x_2)}{x_2}=e_r(x_1)-e_r(x_2)\\ \end{aligned} \right.
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧er(x1±x2)er(x1x2)e(x2x1)=x1±x2e(x1)±e(x2)≈x1e(x1)+x2e(x2)=er(x1)+er(x2)≈x1e(x1)−x2e(x2)=er(x1)−er(x2)
注意分辨公式里的误差 e e e 和相对误差 e r e_r er
相对误差公式即在上述误差公式的基础上除以 y ∗ y^* y∗ ,再把 e e e 转化为 e r e_r er
例1:假设运算中数据都精确到两位小数,试求 x ∗ = a ⋅ b − c x^*=a·b-c x∗=a⋅b−c的误差限和相对误差限。
e ( x ∗ ) = a ∗ ⋅ e ( b ∗ ) + b ∗ ⋅ e ( a ∗ ) − e ( c ∗ ) e(x^*)=a^*·e(b^*)+b^*·e(a^*)-e(c^*) e(x∗)=a∗⋅e(b∗)+b∗⋅e(a∗)−e(c∗)
由于数据精确到两位小数,故 e ( a ∗ ) , e ( b ∗ ) , e ( c ∗ ) ≤ 0.5 × 1 0 − 2 e(a^*),e(b^*),e(c^*) \le 0.5×10^{-2} e(a∗),e(b∗),e(c∗)≤0.5×10−2 ,则有:
e ( x ∗ ) ≤ ( 0.5 × 1 0 − 2 ) a ∗ + ( 0.5 × 1 0 − 2 ) b ∗ − ( 0.5 × 1 0 − 2 ) = ( a ∗ + b ∗ − 1 ) ⋅ ( 0.5 × 1 0 − 2 ) \begin{aligned} e(x^*) & \le (0.5×10^{-2})a^*+(0.5×10^{-2})b^*-(0.5×10^{-2}) \\ &=(a^*+b^*-1)·(0.5×10^{-2}) \end{aligned} e(x∗)≤(0.5×10−2)a∗+(0.5×10−2)b∗−(0.5×10−2)=(a∗+b∗−1)⋅(0.5×10−2)
数值计算应注意的问题
-
避免两个相近的数相减
e r ( x ∗ − y ∗ ) = e ( x ∗ − y ∗ ) x ∗ − y ∗ e_r(x^*-y^*)=\frac{e(x^*-y^*)}{x^*-y^*} er(x∗−y∗)=x∗−y∗e(x∗−y∗)
相近的 x x x与 y y y会导致相对误差增大,相对误差限增大,从而使得结果的有效数字减少。 -
避免大数吃小数
由于计算机小数位数精度限制,大数减去小数经常会未变化,此时结果不准确。 -
避免除数的绝对值远小于被除数的绝对值
e ( x y ) ≈ 1 y e ( x ) − x y 2 e ( y ) e(\frac{x}{y})\approx \frac{1}{y}e(x)-\frac{x}{y^2} e(y) e(yx)≈y1e(x)−y2xe(y)
当 y ≪ x y\ll x y≪x时,后项导致舍入误差增大 -
要简化计算,减少计算次数
计算量大小会影响误差的累积。
例2(算法稳定性问题):考虑递推式算法 I n = 1 n − 5 I n − 1 I_n=\frac{1}{n}-5I_{n-1} In=n1−5In−1 ,假设 I 0 I_0 I0 有误差 e 0 e_0 e0 ,计算中没有舍入误差情况下,求 e n e_n en 。
e n = I n − I n ∗ = − 5 I n − 1 + 5 I n − 1 ∗ = − 5 ( I n − 1 − I n − 1 ∗ ) = − 5 e n − 1 = ( − 5 ) n e 0 \begin{aligned} e_n = I_n - I_n^* &= -5I_{n-1}+5I_{n-1}^* \\&= -5(I_{n-1}-I_{n-1}^*)\\&=-5e_{n-1}\\&= (-5)^ne_0 \end{aligned} en=In−In∗=−5In−1+5In−1∗=−5(In−1−In−1∗)=−5en−1=(−5)ne0
每计算一次,误差便会扩大到5倍。由于计算过程中舍入误差增长,该算法不具有数值稳定性。相反,舍入误差不增长的算法具有数值稳定性。
本文地址:https://blog.csdn.net/weixin_39955411/article/details/109011134
上一篇: C++编程语言的四项基本准则