数值分析
0. 前言
数值分析 也称 计算数学, 为数学科学的一个分支。它主要对计算机求解各种数学问题的数值计算方法与实现。在实际应用中,根据问题建立的 数学模型 其 完备形式 一般不能方便得求出 精确解,对复杂的 非线性模型 忽略一些因素 简化模型 往往不能满足 近似程度的要求,因此使用 数值方法 直接求解 做 较少的简化,可以得到满足一定近似程度要求的结果。
import numpy as np
import re
1. 数值计算 的 误差
由于我们 对实际问题 进行抽象描述 简化 后建立数学模型,其与实际问题之间 是近似的,我们对他们之间出现的这种误差 称为 模型误差。由于 这种误差 难于用数量表示,假设 数学模型合理,我们在此不讨论此误差。在实际应用中 还存在 观测误差,其不为计算过程中生成的误差,同样在此不做讨论。
在数学模型不能获得精确解时,通过数值方法求得的近似解与精确解之间所导致的误差 为在此讨论的误差。由于计算机上的字长有限,原始数据在计算机上表示时就有误差,计算过程中又产生新的误差,这种误差称为 舍入误差。例:用 3.14159 3.14159 3.14159 来近似代替 π \pi π, 产生的误差为
R = π − 3.14159 = 0.0000026 ⋯ R = \pi - 3.14159 = 0.0000026 \cdots R=π−3.14159=0.0000026⋯
1.1. 误差
- 绝对误差:
e
∗
=
x
∗
−
x
e^* = x^* - x
e∗=x∗−x
- x x x 为 准确值
- x ∗ x^* x∗ 为 近似值
- 误差限: 误差绝对值的一个上限,该值总为正数
- ε ∗ \varepsilon^* ε∗ 为 近似值的误差限 ∣ x ∗ − x ∣ ≤ ε ∗ \lvert x^* - x \rvert \leq \varepsilon^* ∣x∗−x∣≤ε∗
- 即 x ∗ − ε ∗ ≤ x ≤ x ∗ + ε ∗ x^* - \varepsilon^* \leq x \leq x^* + \varepsilon^* x∗−ε∗≤x≤x∗+ε∗
- 有时 使用 x = x ∗ ± ε ∗ x = x^* \pm \varepsilon^* x=x∗±ε∗ 表示
def 误差(x_star: float, x_true:float):
return x_star - x_true
- 相对误差:
- 考虑误差大小时,其值对 x x x 本身大小相关,因此应考虑它们的比值。
- 近似值 x ∗ x^* x∗ 的相对误差 e r ∗ = x ∗ x = x ∗ − x x \displaystyle e^*_r = \frac{x^*}{x} = \frac{x^* -x}{x} er∗=xx∗=xx∗−x
- 在实际计算中 准确值 总是未知,通常取
e r ∗ = x ∗ x ∗ = x ∗ − x x ∗ \displaystyle e^*_r = \frac{x^*}{x^*} = \frac{x^* -x}{x^*} er∗=x∗x∗=x∗x∗−x - 假设误差不大时,两公式 取得 相对误差 相差极小,故忽略不计。
- 相对误差限: 相对误差的绝对值 上界
- ε r ∗ = ε ∗ ∣ x ∗ ∣ ≥ ∣ x ∗ − x x ∗ ∣ \displaystyle\varepsilon^*_r = \frac{\varepsilon^*}{\lvert x^* \rvert} \geq \lvert \frac{x^* -x}{x^*} \rvert εr∗=∣x∗∣ε∗≥∣x∗x∗−x∣
def 相对误差(x_star, x_true):
return (x_star-x_true)/x_star
1.2. 有效数字
- 定义:
x
∗
x^*
x∗ 有
n
n
n 位 有效数字。其表示为:
x ∗ = ± ( a 0 + a 1 × 1 0 − 1 + ⋯ + a n − 1 × 1 0 − ( n − 1 ) ) × 1 0 m a i ( 0 ≤ i < n ) ∈ I [ 0 , 9 ] , a 0 ≠ 0 i , m ∈ I x^* = \pm (a_0 + a_1\times10^{-1}+\cdots + a_{n-1}\times10^{-(n-1)}) \times 10^m \\ a_i(0\leq i<n) \in I_{[0,9]} , \; a_0 \neq 0 \\ i,m \in I x∗=±(a0+a1×10−1+⋯+an−1×10−(n−1))×10mai(0≤i<n)∈I[0,9],a0=0i,m∈I
∣ x − x ∗ ∣ ≤ 1 2 × 1 0 m − n + 1 \lvert x - x^* \rvert \leq \frac{1}{2} \times 10^{m-n+1} ∣x−x∗∣≤21×10m−n+1
def 有效数字(star_x:str, x:float):
string_x = str(star_x)
if bool(re.match(r"\s*[+-]?([\d]+(\.[\d]*)?|\.[\d]+)(e[+-]?[\d]+)? *$", string_x)):
float_x = float(star_x)
if "e" not in string_x:
string_x = "%e"%float_x
M = int(string_x.split("e")[-1])
error = np.abs(float_x - x) # |x - x^*|
#print("误差为 %e" %误差(float_x, x))
N = 0
while (error <= (0.5 * 10**(M-N))):
N += 1
print(f"近似值 %.{N-1}e 有 {N} 位 有效数 -- 精确值:{x}。"%float_x)
return M, N
else:
print("输入非数字!")
- 例:
有效数字("3.14", np.pi)
有效数字("3.1416", np.pi)
有效数字("8", 8.000033)
有效数字(2.7183, 2.7182818)
有效数字(-187.93, -187.93253)
M, N = 有效数字(0.037856, 0.03785551)
近似值 3.14e+00 有 3 位 有效数 -- 精确值:3.141592653589793。
近似值 3.1416e+00 有 5 位 有效数 -- 精确值:3.141592653589793。
近似值 8.0000e+00 有 5 位 有效数 -- 精确值:8.000033。
近似值 2.7183e+00 有 5 位 有效数 -- 精确值:2.7182818。
近似值 -1.8793e+02 有 5 位 有效数 -- 精确值:-187.93253。
近似值 3.7856e-02 有 5 位 有效数 -- 精确值:0.03785551。
- 相对误差限
- 由
x
∗
x^*
x∗ 定义, 可知
a 0 ≤ ∣ x ∗ ∣ × 1 0 − m < a 0 + 1 ε r ∗ = ε ∗ ∣ x ∗ ∣ ≤ 1 2 a 0 × 1 0 ( m − n + 1 ) − m ≤ 1 2 a 0 × 1 0 1 − n \begin{aligned}a_0 &\leq \lvert x^* \rvert \times 10^{-m} < a_0 +1 \\ \varepsilon_r^* &= \frac{\varepsilon^*}{\lvert x^*\rvert}\leq \frac{1}{2a_0}\times10^{(m-n+1)-m}\\ &\leq \frac{1}{2 a_0}\times10^{1-n}\end{aligned} a0εr∗≤∣x∗∣×10−m<a0+1=∣x∗∣ε∗≤2a01×10(m−n+1)−m≤2a01×101−n
当 x ∗ x^* x∗ 具有 n n n 位 有效数字时。 - 反之 若 x ∗ x^* x∗ 相对误差限 ε r ∗ ≤ 1 2 ( a 0 + 1 ) × 1 0 1 − n \displaystyle\varepsilon^*_r\leq \frac{1}{2 (a_0+1)}\times10^{1-n} εr∗≤2(a0+1)1×101−n, 则 x ∗ x^* x∗ 至少具有 n n n 位有效数字。
- Q: 使 1237 \sqrt{1237} 1237 的近似值相对误差小于 0.1 % 0.1\% 0.1%,那么至少要取几位有效数字?
- A:
1237
>
1225
=
35
→
a
0
=
3
\sqrt{1237} > \sqrt{1225} = 35 \to a_0 = 3
1237>1225=35→a0=3
ε ∗ ≤ 0.166... × 1 0 − 3 < 1 0 − 3 = 0.1 % \varepsilon^* \leq 0.166... \times 10^{-3} < 10^{-3} = 0.1\% ε∗≤0.166...×10−3<10−3=0.1%
答:至少要取4位有效数字。
验证:
- 由
x
∗
x^*
x∗ 定义, 可知
有效数字('35.17',np.sqrt(1237))
print(f'相对误差为 {np.abs(相对误差(35.17,np.sqrt(1237)))} < 1.0e-3')
近似值 3.517e+01 有 4 位 有效数 -- 精确值:35.17101079013795。
相对误差为 2.8740123342252667e-05 < 1.0e-3
1.3. 误差估计
- 对两个近似数 x 1 ∗ x^*_1 x1∗ 与 x 2 ∗ x^*_2 x2∗ 的误差限分别为 ε ( x 1 ∗ ) , ε ( x 2 ∗ ) \varepsilon(x_1^*), \varepsilon(x_2^*) ε(x1∗),ε(x2∗) , 对于加减乘除运算的误差限满足不等式:
ε ( x 1 ∗ ± x 2 ∗ ) ≤ ε ( x 1 ∗ ) + ε ( x 2 ∗ ) ε ( x 1 ∗ ⋅ x 2 ∗ ) ≤ ∣ x 2 ∗ ∣ ⋅ ε ( x 1 ∗ ) + ∣ x 1 ∗ ∣ ⋅ ε ( x 2 ∗ ) ε ( x 1 ∗ x 2 ∗ ) ≤ ∣ x 2 ∗ ∣ ⋅ ε ( x 1 ∗ ) + ∣ x 1 ∗ ∣ ⋅ ε ( x 2 ∗ ) ∣ x 2 ∗ ∣ 2 , x 2 ∗ ≠ 0 \begin{aligned} \varepsilon(x_1^* \pm x_2^*) &\leq \varepsilon(x^*_1)+\varepsilon(x^*_2)\\ \varepsilon(x_1^* \cdot x_2^*) &\leq \lvert x_2^*\rvert\cdot\varepsilon(x^*_1)+ \lvert x_1^*\rvert \cdot\varepsilon(x^*_2)\\ \varepsilon\Big(\frac{x_1^* }{ x_2^*}\Big) &\leq \frac{\lvert x_2^*\rvert\cdot\varepsilon(x^*_1)+ \lvert x_1^*\rvert \cdot\varepsilon(x^*_2)}{ \lvert x_2^*\rvert^2},\, x^*_2\neq0 \end{aligned} ε(x1∗±x2∗)ε(x1∗⋅x2∗)ε(x2∗x1∗)≤ε(x1∗)+ε(x2∗)≤∣x2∗∣⋅ε(x1∗)+∣x1∗∣⋅ε(x2∗)≤∣x2∗∣2∣x2∗∣⋅ε(x1∗)+∣x1∗∣⋅ε(x2∗),x2∗=0
- 对于函数的误差计算,一般用泰勒展开进行估计,若
f
(
x
)
f(x)
f(x) 为可微方程:
f ( x ) − f ( x ∗ ) = f ′ ( x ∗ ) ( x − x ∗ ) + f ′ ′ ( ξ ) ( x − x ∗ ) 2 / 2 , ξ ∈ [ x , x ∗ ] f ( x ) − f ( x ∗ ) = f ′ ( x ∗ ) e ∗ + f ′ ′ ( ξ ) e ∗ 2 / 2 ∣ f ( x ) − f ( x ∗ ) ∣ ≤ ∣ f ′ ( x ∗ ) ∣ ε ∗ + ∣ f ′ ′ ( ξ ) ∣ ε ∗ 2 / 2 \begin{aligned}f(x) - f(x^*) &= f^\prime(x^*)(x-x^*)+f^{\prime\prime}(\xi)(x-x^*)^2/2, \,\xi \in [x,x^*]\\ f(x) - f(x^*) &=f^\prime(x^*)e^*+f^{\prime\prime}(\xi){e^*}^2/2\\ \lvert f(x) - f(x^*)\rvert &\leq \lvert f^\prime(x^*)\rvert \varepsilon^*+\lvert f^{\prime\prime}(\xi)\rvert {\varepsilon^*}^2/2\end{aligned} f(x)−f(x∗)f(x)−f(x∗)∣f(x)−f(x∗)∣=f′(x∗)(x−x∗)+f′′(ξ)(x−x∗)2/2,ξ∈[x,x∗]=f′(x∗)e∗+f′′(ξ)e∗2/2≤∣f′(x∗)∣ε∗+∣f′′(ξ)∣ε∗2/2- 一般
f
′
′
(
x
∗
)
f^{\prime\prime}(x^*)
f′′(x∗) 与
f
′
(
x
∗
)
f^{\prime}(x^*)
f′(x∗) 比值相差不大,可忽略
ε
\varepsilon
ε 高阶项,计算函数的误差限 为:
ε ( f ( x ∗ ) ) ≈ ∣ f ′ ( x ∗ ) ∣ ε ( x ∗ ) \varepsilon(f(x^*))\approx \lvert f^\prime (x^*)\rvert \varepsilon(x^*) ε(f(x∗))≈∣f′(x∗)∣ε(x∗) - 拓展到多元函数
A
=
f
(
x
1
,
x
2
,
⋯
,
x
n
)
,
A
∗
=
f
(
x
1
∗
,
x
2
∗
,
⋯
,
x
n
∗
)
A = f(x_1, x_2, \cdots , x_n), A^* = f(x_1^*, x_2^*, \cdots , x_n^*)
A=f(x1,x2,⋯,xn),A∗=f(x1∗,x2∗,⋯,xn∗)
e ( A ∗ ) = A ∗ − A ≈ ∑ k = 1 n ( ∂ f ∂ x k ) ∗ ( x k ∗ − x k ) ≈ ∑ k = 1 n ( ∂ A ∗ ∂ x k ) e k ∗ ε ( A ∗ ) ≈ ∑ k = 1 n ∣ ∂ A ∗ ∂ x k ∣ ε ( x k ∗ ) ε r ( A ∗ ) = ε ( A ∗ ) ∣ A ∗ ∣ \begin{aligned}e(A^*) &= A^* - A\\ & \approx \sum^n_{k=1}\Big(\frac{\partial f}{\partial x_k}\Big)^*(x_k^* - x_k) \\ & \approx\sum^n_{k=1}\Big(\frac{\partial A^*}{\partial x_k}\Big)e^*_k\\ \varepsilon (A^*) &\approx\sum^n_{k=1}\Big\lvert\frac{\partial A^*}{\partial x_k}\Big\rvert \varepsilon(x^*_k) \\ \varepsilon_r(A^*) &= \frac{\varepsilon (A^*)}{\lvert A^*\rvert} \end{aligned} e(A∗)ε(A∗)εr(A∗)=A∗−A≈k=1∑n(∂xk∂f)∗(xk∗−xk)≈k=1∑n(∂xk∂A∗)ek∗≈k=1∑n∣∣∣∂xk∂A∗∣∣∣ε(xk∗)=∣A∗∣ε(A∗)
- 一般
f
′
′
(
x
∗
)
f^{\prime\prime}(x^*)
f′′(x∗) 与
f
′
(
x
∗
)
f^{\prime}(x^*)
f′(x∗) 比值相差不大,可忽略
ε
\varepsilon
ε 高阶项,计算函数的误差限 为:
- Q: 已测量 某操场 长宽为 l ∗ = 110 m , w ∗ = 80 m l^* = 110 m, \, w^* = 80m l∗=110m,w∗=80m, 已知它们的误差限为 ∣ l − l ∗ ∣ ≤ 0.2 m , ∣ w − w ∗ ∣ ≤ 0.1 m \lvert l - l^* \rvert \leq 0.2m, \, \lvert w - w^* \rvert \leq 0.1m ∣l−l∗∣≤0.2m,∣w−w∗∣≤0.1m,求面积的绝对误差限与相对误差限:
- A:
s = l ⋅ w ∂ s ∂ l ∗ = w ∗ = 80 m ∂ s ∂ w ∗ = l ∗ = 110 m ε ( s ∗ ) ≈ ∣ ∂ s ∂ l ∗ ∣ ε ( w ∗ ) + ∣ ∂ s ∂ w ∗ ∣ ε ( l ∗ ) ≈ 80 × 0.2 + 110 × 0.1 = 27 m 2 ε r ( s ∗ ) = ε ( s ∗ ) ∣ s ∗ ∣ ≈ 27 80 × 110 = 0.31 % \begin{aligned}s &= l\cdot w\\ \frac{\partial s}{\partial l}^* &= w^* = 80 m \\ \frac{\partial s}{\partial w}^* &= l^* = 110 m\\ \varepsilon(s^*) &\approx \Big\lvert \frac{\partial s}{\partial l}^*\Big\rvert \varepsilon(w^*)+ \Big\lvert \frac{\partial s}{\partial w}^*\Big\rvert \varepsilon(l^*) \\ & \approx 80 \times 0.2 + 110 \times 0.1 = 27m^2 \\ \varepsilon_r(s^*) &= \frac{\varepsilon(s^*)}{\lvert s^*\rvert}\approx \frac{27}{80\times 110} =0.31\%\end{aligned} s∂l∂s∗∂w∂s∗ε(s∗)εr(s∗)=l⋅w=w∗=80m=l∗=110m≈∣∣∣∂l∂s∗∣∣∣ε(w∗)+∣∣∣∂w∂s∗∣∣∣ε(l∗)≈80×0.2+110×0.1=27m2=∣s∗∣ε(s∗)≈80×11027=0.31% - 答:操场面积的绝对误差限为 27 m 2 27m^2 27m2,相对误差限为 0.31 % 0.31\% 0.31% 。