数值分析 笔记(一)数值计算中的误差

数值分析

专栏目录


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=xx
    • x x x 为 准确值
    • x ∗ x^* x 为 近似值
  • 误差限: 误差绝对值的一个上限,该值总为正数
    • ε ∗ \varepsilon^* ε 为 近似值的误差限 ∣ x ∗ − x ∣ ≤ ε ∗ \lvert x^* - x \rvert \leq \varepsilon^* xxε
    • x ∗ − ε ∗ ≤ x ≤ x ∗ + ε ∗ x^* - \varepsilon^* \leq x \leq x^* + \varepsilon^* xεxx+ε
    • 有时 使用 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=xxx
    • 在实际计算中 准确值 总是未知,通常取
      e r ∗ = x ∗ x ∗ = x ∗ − x x ∗ \displaystyle e^*_r = \frac{x^*}{x^*} = \frac{x^* -x}{x^*} er=xx=xxx
    • 假设误差不大时,两公式 取得 相对误差 相差极小,故忽略不计。
  • 相对误差限: 相对误差的绝对值 上界
    • ε r ∗ = ε ∗ ∣ x ∗ ∣ ≥ ∣ x ∗ − x x ∗ ∣ \displaystyle\varepsilon^*_r = \frac{\varepsilon^*}{\lvert x^* \rvert} \geq \lvert \frac{x^* -x}{x^*} \rvert εr=xεxxx
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×101++an1×10(n1))×10mai(0i<n)I[0,9],a0=0i,mI
    ∣ x − x ∗ ∣ ≤ 1 2 × 1 0 m − n + 1 \lvert x - x^* \rvert \leq \frac{1}{2} \times 10^{m-n+1} xx21×10mn+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εrx×10m<a0+1=xε2a01×10(mn+1)m2a01×101n
      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} εr2(a0+1)1×101n, 则 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 =35a0=3
      ε ∗ ≤ 0.166... × 1 0 − 3 < 1 0 − 3 = 0.1 % \varepsilon^* \leq 0.166... \times 10^{-3} < 10^{-3} = 0.1\% ε0.166...×103<103=0.1%
      答:至少要取4位有效数字。
      验证:
有效数字('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)ε(x1x2)ε(x2x1)ε(x1)+ε(x2)x2ε(x1)+x1ε(x2)x22x2ε(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)(xx)+f(ξ)(xx)2/2,ξ[x,x]=f(x)e+f(ξ)e2/2f(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)=AAk=1n(xkf)(xkxk)k=1n(xkA)ekk=1nxkAε(xk)=Aε(A)
  • 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 ll0.2m,ww0.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} slswsε(s)εr(s)=lw=w=80m=l=110mlsε(w)+wsε(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%
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数值分析是一门研究数值计算方法及其应用的学科。Matlab作为一个强大的数值计算工具,可以帮助我们更好地学习和理解数值分析。下面是一些Matlab数值分析学习笔记,供您参考: 1. 数值计算基础 - Matlab的数值计算基础包括基本的数学函数、变量定义、矩阵运算等。 - 常用的数学函数包括sin、cos、exp、log等。 - 变量定义和赋值可以使用等号“=”,例如a=2。 - 矩阵运算可以使用“*”表示矩阵乘法,使用“\”表示矩阵求解线性方程组。 2. 数值解法 - 数值解法包括数值积分、数值微分、插值法、最小二乘法等。 - Matlab数值积分函数包括quad、quadl、quadgk等。 - Matlab数值微分函数包括diff、gradient、jacobian等。 - 插值法可以使用interp1函数实现。 - 最小二乘法可以使用polyfit函数实现。 3. 常微分方程(ODE) - 常微分方程是数值分析的重要内容之一,Matlab提供了ode45、ode23等函数实现常微分方程的数值解法。 - ode45函数是最常用的常微分方程数值解法之一,可以处理刚性和非刚性方程。 4. 偏微分方程(PDE) - 偏微分方程是数值分析的另一个重要内容,Matlab提供了pdepe、pde23等函数实现偏微分方程的数值解法。 - pdepe函数可以处理二阶线性偏微分方程,pde23函数可以处理一般的偏微分方程。 5. 数值优化 - 数值优化是数值分析的一个重要分支,Matlab提供了fminsearch、fmincon等函数实现数值优化。 - fminsearch函数可以用于无约束优化问题,fmincon函数可以用于有约束优化问题。 以上是一些Matlab数值分析学习笔记,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值