1.数值算法
数值计算是指借助计算机用数值方法来近似求解数学问题。
在数学的长期发展过程中,数学家们解决了一个又一个的问题。这中间有些问题是可以求出确切解的,但是有些问题是不容易或者根本无法求出确切的解的。数值计算可以用来解决这些数学问题。
我们通常使用下列四个标准来衡量数值算法的优劣:
- 简单易实现:算法容易在计算机上面实现
- 收敛与稳定:算法具有很好的收敛性和稳定性
- 计算效率高:算法的效率高,而且节省存储
- 算法有效:算法确实可以解决对应的问题
2.误差
误差的含义和分类
前面说了,数值计算的目的不是求一个确切解,而是近似的求解。误差就是衡量数值计算结果和确切解近似程度的工具。
误差描述数值计算中近似值的精确程度
在一般的数值计算教材的定义中,误差按来源可分为模型误差、观测误差、截断误差和舍入误差四种。下面我来谈一下我对四种误差的理解。
- 模型误差:在针对实际问题的分析中,我们建立了一个数学模型,这个数学模型带有自己的误差。例如对于人口问题,如果我们建立线性模型来研究人口问题,显然这和实际情况就存在一些误差
- 观测误差:这个比较好理解,我们在获取数据时,难免会有测量的误差,例如对于同一本书籍,用20cm的直尺和精度更高的游标卡尺测量,其厚度的测量值是不一样的,并且这两个测量的值和原始数据本身会有一定的误差
- 截断误差:在数学计算中,近似方法通常都要舍去某些项,这些舍去的东西就形成了截断误差,这是人为的截断,又称为方法误差
- 舍入误差:计算机只可以计算有限的数字,而且对于 2 \sqrt{2} 2这样的数字,计算机是无法表示的,那么我们必须进行保留有限位,这就是舍入
绝对误差,相对误差和误差限
- 假设精确值为 x ∗ x^* x∗, x x x 是精确值 x ∗ x^* x∗ 的一个近似值,将误差 e r r o r error error简单表示为 e e e记 e = x ∗ − x e =x^*-x e=x∗−x为近似值 x x x的绝对误差,简称误差
- 如果绝对误差满足 ∣ e ∣ ≤ ϵ |e|\leq \epsilon ∣e∣≤ϵ 则称 ϵ \epsilon ϵ 为近似值 x x x的绝对误差限,简称误差限
- 有时绝对误差不能很好的描述近似的程度,所以定义 e r = e x ∗ e_r=\frac{e}{x^*} er=x∗e为相对误差,在实际情况中, x ∗ x^* x∗不容易获得,所以实际中有时取 e r = e x e_r=\frac{e}{x} er=xe,相对的,可以定义满足 ∣ e r ∣ ≤ ϵ r |e_r|\leq\epsilon_r ∣er∣≤ϵr的 ϵ r \epsilon_r ϵr为相对误差限
- 有效数字:在诸多实验学科中都会定义一个有效数字的概念。这里用误差来给有效数字下一个数值计算的定义。设数 x x x是数 x ∗ x^* x∗的近似值,如果 x x x的绝对误差限是它的某一数位的半个单位,并且从 x x x左起第一个非零数字到该数位共有 n n n 位,则称这 n n n个数字为 x x x的有效数字,也称用 x x x近似 x ∗ x^* x∗时具有 n n n位有效数字。例如对于 x = 0.578 x = 0.578 x=0.578,若其绝对误差限为 0.0005 0.0005 0.0005,那么它就有3位有效数字
3.误差传播规律
在实际的数值计算中,已知局部的误差,如何通过分析求出整体的误差?
如果我们不考虑模型误差,截断误差和舍入误差,只分析初始的数据误差对结算结果误差的影响,即分析算法的稳定性,那么我们就需要分析误差传播规律。
这个问题可以描述成以下的数学问题
已
知
算
法
为
y
=
f
(
x
1
,
x
2
,
.
.
.
,
x
n
)
x
1
,
x
2
,
.
.
.
x
n
的
精
确
值
分
别
为
x
1
∗
,
x
2
∗
,
.
.
.
x
n
∗
每
个
数
据
的
误
差
为
e
i
=
x
i
∗
−
x
i
求
e
y
=
y
∗
−
y
的
值
已知算法为y=f(x_1,x_2,...,x_n) \\ x_1,x_2,...x_n的精确值分别为x_1^*,x_2^*,...x_n^* \\ 每个数据的误差为 e_i = x_i^*-x_i \\ 求 e_y=y^*-y的值
已知算法为y=f(x1,x2,...,xn)x1,x2,...xn的精确值分别为x1∗,x2∗,...xn∗每个数据的误差为ei=xi∗−xi求ey=y∗−y的值
我们不妨先来分析加法的绝对误差传播
y
=
f
(
x
1
,
x
2
)
=
x
1
+
x
2
,
e
1
=
x
1
∗
−
x
1
,
e
2
=
x
2
∗
−
x
2
则
e
y
=
y
∗
−
y
=
(
x
1
∗
+
x
2
∗
)
−
(
x
1
+
x
2
)
=
x
1
∗
−
x
1
+
x
2
∗
−
x
2
=
e
1
+
e
2
y=f(x_1,x_2)=x_1+x_2, e_1 = x_1^*-x_1,e_2=x_2^*-x_2 \\ 则e_y=y^*-y=(x_1^*+x_2^*)-(x_1+x_2)=x_1^*-x_1+x_2^*-x_2=e_1+e_2
y=f(x1,x2)=x1+x2,e1=x1∗−x1,e2=x2∗−x2则ey=y∗−y=(x1∗+x2∗)−(x1+x2)=x1∗−x1+x2∗−x2=e1+e2
也就是说加法的误差传播是线性的,下面我们来分析减法的相对误差传播
y
=
f
(
x
1
,
x
2
)
=
x
1
−
x
2
,
e
1
r
=
x
1
∗
−
x
1
x
1
,
e
2
r
=
x
2
∗
−
x
2
x
2
则
e
y
r
=
y
∗
−
y
y
=
(
x
1
∗
−
x
2
∗
)
−
(
x
1
−
x
2
)
x
1
−
x
2
=
(
x
1
∗
−
x
1
)
−
(
x
2
∗
−
x
2
)
x
1
−
x
2
=
x
1
e
1
r
−
x
2
e
2
r
x
1
−
x
2
y=f(x_1,x_2)=x_1-x_2, e_{1r} = \frac{x_1^*-x_1}{x_1},e_{2r}=\frac{x_2^*-x_2}{x_2} \\ 则e_{yr}=\frac{y^*-y}{y}=\frac{(x_1^*-x_2^*)-(x_1-x_2)}{x_1-x_2}=\frac{(x_1^*-x_1)-(x_2^*-x_2)}{x_1-x_2}=\frac{x_1e_{1r}-x_2e_{2r}}{x_1-x_2}
y=f(x1,x2)=x1−x2,e1r=x1x1∗−x1,e2r=x2x2∗−x2则eyr=yy∗−y=x1−x2(x1∗−x2∗)−(x1−x2)=x1−x2(x1∗−x1)−(x2∗−x2)=x1−x2x1e1r−x2e2r
这里的规律就不那么显然了,让我们进行简单的放缩
∣
e
y
r
∣
=
∣
x
1
e
1
r
−
x
2
e
2
r
x
1
−
x
2
∣
≤
∣
x
1
x
1
−
x
2
∣
∣
e
1
r
∣
+
∣
x
2
x
1
−
x
2
∣
∣
e
2
r
∣
|e_{yr}|=\left|\frac{x_1e_{1r}-x_2e_{2r}}{x_1-x_2}\right|\leq\left|\frac{x_1}{x_1-x_2}\right||e_{1r}|+\left|\frac{x_2}{x_1-x_2}\right||e_{2r}|
∣eyr∣=∣∣∣∣x1−x2x1e1r−x2e2r∣∣∣∣≤∣∣∣∣x1−x2x1∣∣∣∣∣e1r∣+∣∣∣∣x1−x2x2∣∣∣∣∣e2r∣
如果减法的两个数字
x
1
,
x
2
x_1,x_2
x1,x2很接近,那么相对误差就可能会很大,所以从这一点总结出一条规律:避免相近的数相减
如果算法是一个复杂的过程,我们可以考虑用泰勒公式来研究误差的传播
将
多
元
函
数
f
(
x
1
∗
,
x
2
∗
)
在
(
x
1
,
x
2
)
处
进
行
泰
勒
展
开
f
(
x
1
∗
,
x
2
∗
)
=
f
(
x
1
,
x
2
)
+
∂
f
∂
x
1
(
x
1
∗
−
x
1
)
+
∂
f
∂
x
2
(
x
2
∗
−
x
2
)
+
R
,
R
是
余
项
余
项
是
更
高
阶
的
导
数
和
更
高
阶
的
误
差
,
我
们
不
妨
舍
去
它
们
e
y
=
f
(
x
1
∗
,
x
2
∗
)
−
f
(
x
1
,
x
2
)
≈
∂
f
∂
x
1
(
x
1
∗
−
x
1
)
+
∂
f
∂
x
2
(
x
2
∗
−
x
2
)
=
∂
f
∂
x
1
e
x
1
+
∂
f
∂
x
2
e
x
2
将多元函数f(x_1^*,x_2^*)在(x_1,x_2)处进行泰勒展开 \\ f(x_1^*,x_2^*)=f(x_1,x_2)+\frac{\partial f}{\partial x_1}(x_1^*-x_1)+ \frac{\partial f}{\partial x_2}(x_2^*-x_2)+R,R是余项 \\ 余项是更高阶的导数和更高阶的误差,我们不妨舍去它们\\ e_y = f(x_1^*,x_2^*)-f(x_1,x_2)\approx \frac{\partial f}{\partial x_1}(x_1^*-x_1)+ \frac{\partial f}{\partial x_2}(x_2^*-x_2)=\frac{\partial f}{\partial x_1}e_{x_1}+ \frac{\partial f}{\partial x_2}e_{x_2}
将多元函数f(x1∗,x2∗)在(x1,x2)处进行泰勒展开f(x1∗,x2∗)=f(x1,x2)+∂x1∂f(x1∗−x1)+∂x2∂f(x2∗−x2)+R,R是余项余项是更高阶的导数和更高阶的误差,我们不妨舍去它们ey=f(x1∗,x2∗)−f(x1,x2)≈∂x1∂f(x1∗−x1)+∂x2∂f(x2∗−x2)=∂x1∂fex1+∂x2∂fex2
这就是误差的传播规律,有时也称这两个导数为误差的增长因子或传播系数,它们描述了误差增大还是缩小的规律
数值计算的一些经验
通过对误差的讨论,总结出一系列关于数值计算的一些经验
- 避免相近的数相减
- 避免除以绝对值很小的数字
- 合理安排数字的运算顺序,防止大数吃掉小数