第一章 概论
-
数值计算方法(数值分析):求解的数值方法及与此有关的理论。
-
实际问题的步骤:(面向计算机)
- 实际问题
- 数学模型(应用数学:数学建模)
- 数值算法(计算数学)
- 设计程序
- 出结果
-
做题步骤:
- 数值计算
- 近似结果
- 误差估计
1.1 误差基本概念
-
种类:
例题:用牛顿第二定律测量单摆周期 T = 2 π l g T=2\pi\sqrt{\dfrac{l}{g}} T=2πgl.
- 模型误差:忽视空气阻力,摩擦力
- 观测误差:重力加速度 g g g 不精确
- 截断误差: θ ≈ sin θ \theta \approx \sin\theta θ≈sinθ (无限的计算过程用有限步替代:泰勒展开)
- 舍入误差:数位太长四舍五入
-
绝对误差与相对误差:
设 x x x 是准确值 x ∗ x^* x∗ 的近似值
-
绝对误差: e ( x ) = x − x ∗ \color{red}e(x)=x-x^* e(x)=x−x∗ 为 x x x 的绝对误差,注意没有绝对值。
e ( x ) > 0 e(x)>0 e(x)>0,称 x x x 为 x ∗ x^* x∗的强近似; e ( x ) < 0 e(x)<0 e(x)<0,称 x x x 为 x ∗ x^* x∗ 的近似。
-
绝对误差限/界(用于误差估计):确定 η > 0 \eta>0 η>0,使 ∣ e ( x ) ∣ = ∣ x − x ∗ ∣ ≤ η \color{red}|e(x)|=|x-x^*|\le \eta ∣e(x)∣=∣x−x∗∣≤η ,称 η \eta η为 x x x 的绝对误差限(不唯一)。
-
相对误差: e r ( x ) = x − x ∗ x ∗ ≈ x − x ∗ x \color{red}e_r(x)=\dfrac{x-x^*}{x^*}\approx \dfrac{x-x^*}{x} er(x)=x∗x−x∗≈xx−x∗ 为 x x x 的相对误差。
e ( x ) > 0 e(x)>0 e(x)>0,称 x x x 为 x ∗ x^* x∗ 的强近似; e ( x ) < 0 e(x)<0 e(x)<0,称 x x x 为 x ∗ x^* x∗ 的弱近似
-
绝对误差限/界:若存在 η > 0 \eta>0 η>0,使 ∣ e r ( x ) ∣ ≤ η \color{red}|e_r(x)|\le \eta ∣er(x)∣≤η ,称 η \eta η 为 x x x 的相对误差限
-
-
有效数字:工程上常用有效数字,可隐含绝对误差限和相对误差限
- 简单说:若近似值 x x x 误差限是某一位上的 半个单位,该位到左边第一位非零数字共有 n n n 位,则称 x x x 具有 x x x 位有效数字。
- 设 a 1 ≠ 0 , x = ± 1 0 m × a 1 . a 2 a 3 . . . a n . . . a_1\ne0,x=\pm10^m\times a_1.a_2a_3...a_n... a1=0,x=±10m×a1.a2a3...an...,若 η ≤ 1 2 × 1 0 m − ( n − 1 ) \eta\le {1\over 2}\times 10^{m-(n-1)} η≤21×10m−(n−1),则 a n a_n an为有效数字, x x x 共有 n n n 位有效数字。
例:精确数 π 0 = 3.14159265.. \pi_0=3.14159265.. π0=3.14159265..,近似数 π = 3.1416 \pi=3.1416 π=3.1416,求有效数字
解:
e ( π ) = 3.1416 − 3.14159265.. = 0.00000734.. ≤ 0.5 × 1 0 − 4 称 π = 3.1416 准 确 到 小 数 点 后 4 位 , 共 5 位 有 效 数 字 e(\pi)=3.1416-3.14159265..=0.00000734..\le 0.5\times 10^{-4} \\ 称\pi=3.1416准确到小数点后4位,共5位有效数字 e(π)=3.1416−3.14159265..=0.00000734..≤0.5×10−4称π=3.1416准确到小数点后4位,共5位有效数字 -
定理1.1:近似数 x x x 有 n n n 位有效数字,则其相对误差限 η ≤ 1 2 a 1 × 1 0 − ( n − 1 ) \color{red}\eta\le\dfrac{1}{2a_1}\times 10^{-(n-1)} η≤2a11×10−(n−1);
反之,若 x x x 有相对误差限 η ≤ 1 2 ( a 1 + 1 ) × 1 0 − ( n − 1 ) \color{red}\eta\le\dfrac{1}{2(a_1+1)}\times 10^{-(n-1)} η≤2(a1+1)1×10−(n−1),则 x x x 至少具有 n n n 位有效数字。
表明有效数字位数越多,相对误差越小。
-
基本运算与函数运算的误差估计:
-
引入微分: { e ( x ) = x − x ∗ = d x e r ( x ) = d x x = d ln x \begin{cases}e(x)=x-x^*=dx \\e_r(x)=\dfrac{dx}{x}=d\ln{x} \end{cases} ⎩⎨⎧e(x)=x−x∗=dxer(x)=xdx=dlnx
-
四则运算:
-
加减法:
e ( x ± y ) = e ( x ) ± e ( y ) e(x\pm y)=e(x)\pm e(y) e(x±y)=e(x)±e(y) -
乘法:
{ e ( x y ) = d ( x y ) = x d ( y ) + y d ( x ) = x e ( y ) + y e ( x ) e r ( x y ) = d ln ( x y ) = d ln x + d ln y = e r ( x ) + e r ( y ) \begin{cases}e(xy)=d(xy)=xd(y)+yd(x)=xe(y)+ye(x) \\e_r(xy)=d\ln(xy)=d\ln{x}+d\ln{y}=\color{red}e_r(x)+e_r(y) \end{cases} {e(xy)=d(xy)=xd(y)+yd(x)=xe(y)+ye(x)er(xy)=dln(xy)=dlnx+dlny=er(x)+er(y) -
除法:
{ e ( x y ) = y e ( x ) − x e ( y ) y 2 e r ( x y ) = e r ( x ) − e r ( y ) \begin{cases}e(\dfrac{x}{y})=\dfrac{ye(x)-xe(y)}{y^2} \\e_r(xy)=\color{red}e_r(x)-e_r(y) \end{cases} ⎩⎨⎧e(yx)=y2ye(x)−xe(y)er(xy)=er(x)−er(y)
-
-
函数运算:
-
函数值:
{ e ( f ) = f ( x ) − f ( x ∗ ) ≈ d f ( x ) = f ′ ( x ) d x = f ′ ( x ) e ( x ) e r ( f ) ≈ d f ( x ) f ( x ) = f ′ ( x ) d x f ( x ) = x f ′ ( x ) f ( x ) e r ( x ) \begin{cases}e(f)=f(x)-f(x^*)\approx df(x)=f'(x)dx=\color{red}f'(x)e(x) \\e_r(f)\approx \dfrac{df(x)}{f(x)}= \dfrac{f'(x)dx}{f(x)} =\color{red}\dfrac{xf'(x)}{f(x)}e_r(x) \end{cases} ⎩⎨⎧e(f)=f(x)−f(x∗)≈df(x)=f′(x)dx=f′(x)e(x)er(f)≈f(x)df(x)=f(x)f′(x)dx=f(x)xf′(x)er(x) -
于是,当== ∣ f ′ ( x ) ∣ ≤ 1 |f'(x)|\le1 ∣f′(x)∣≤1且 ∣ x f ′ ( x ) f ( x ) ∣ ≤ 1 |\dfrac{xf'(x)}{f(x)}|\le1 ∣f(x)xf′(x)∣≤1==时,使 ∣ e ( f ) ∣ ≤ ∣ e ( x ) ∣ , ∣ e r ( f ) ∣ ≤ ∣ e r ( x ) ∣ |e(f)|\le|e(x)|,|e_r(f)|\le|e_r(x)| ∣e(f)∣≤∣e(x)∣,∣er(f)∣≤∣er(x)∣(函数值舍入误差不增加/可控),此时称算法是稳定的。
-
-
1.2 算法的优化与注意
-
更稳定的数值计算格式:
例: 设 计 一 个 稳 定 算 法 , 计 算 定 积 分 I n = ∫ 0 1 x n e x d x ( n = 0 , 1 , . . . , 99 ) \color{blue}设计一个稳定算法,计算定积分I_n=\int_0^1x^ne^x\,dx(n=0,1,...,99) 设计一个稳定算法,计算定积分In=∫01xnexdx(n=0,1,...,99)
解:
分 部 积 分 : I n = e − n I n − 1 若 I 0 = e − 1 = 1.71828 , 则 由 { I n = e − n I n − 1 I 0 = e − 1 ≈ 1.71828 计 算 此 时 I 99 的 误 差 是 I 1 误 差 的 99 ! 倍 , 导 致 结 果 严 重 失 真 。 取 I n − 1 = e n − I n n ∵ 1 100 = ∫ 0 1 x 99 e 0 d x ≤ I 99 ≤ ∫ 0 1 x 99 e 1 d x = e 100 ∴ I 99 ≈ 1 2 ( 1 100 + e 100 ) = 0.0185914 则 由 { I n − 1 = e n − I n n I 99 ≈ 0.0185914 计 算 , 向 下 计 算 误 差 逐 渐 减 少 分部积分:I_n=e-nI_{n-1}\\ 若I_0=e-1=1.71828,则由\begin{cases} I_n=e-nI_{n-1}\\I_0=e-1\approx 1.71828\end{cases}计算\\ 此时I_{99}的误差是I_1误差的99!倍,导致结果严重失真。\\ 取I_{n-1}=\dfrac{e}{n}-\dfrac{I_n}{n}\\ \because \dfrac{1}{100}=\int_0^1x^{99}e^0\,dx\le I_{99}\le \int_0^1x^{99}e^1\,dx=\dfrac{e}{100}\therefore I_{99}\approx {1\over 2}({1\over 100}+{e\over 100})=0.0185914\\ 则由\begin{cases} \color{red}I_{n-1}=\dfrac{e}{n}-\dfrac{I_n}{n}\\I_{99}\approx0.0185914\end{cases}计算,向下计算误差逐渐减少 分部积分:In=e−nIn−1若I0=e−1=1.71828,则由{In=e−nIn−1I0=e−1≈1.71828计算此时I99的误差是I1误差的99!倍,导致结果严重失真。取In−1=ne−nIn∵1001=∫01x99e0dx≤I99≤∫01x99e1dx=100e∴I99≈21(1001+100e)=0.0185914则由⎩⎨⎧In−1=ne−nInI99≈0.0185914计算,向下计算误差逐渐减少 -
防止“大数”吃“小数”:运算时若数字数量级差距太大,计算机运算时会造成结果失真。
例:在四位十进制计算机上计算 x = 1234 + ∑ i = 1 1000 0.02 x=1234+\sum\limits_{i=1}^{1000}0.02 x=1234+i=1∑10000.02
解:
-
计算机正常计算:
x = 0.1234 × 1 0 4 + 0.000002 × 1 0 4 + ⋯ + 0.000002 × 1 0 4 ⏞ ≈ 0.1234 × 1 0 4 ( 小 数 被 吃 掉 ) x=0.1234\times 10^4+\overbrace{0.000002\times 10^4+\cdots+0.000002\times 10^4}\approx 0.1234\times 10^4(小数被吃掉) x=0.1234×104+0.000002×104+⋯+0.000002×104 ≈0.1234×104(小数被吃掉) -
算法优先算小数:
∑ i = 1 1000 0.02 = 20 x = 0.1234 × 1 0 4 + 0.002 × 1 0 4 ≈ 0.1254 × 1 0 4 \sum\limits_{i=1}^{1000}0.02=20\\ x=0.1234\times 10^4+0.002\times 10^4\approx0.1254\times10^4 i=1∑10000.02=20x=0.1234×104+0.002×104≈0.1254×104
-
-
其他减少误差:
-
避免两个相近的数相减:
原因:两个数前几位相同的有效数字在差中消失,使得差的有效数字大大减少
例:当 x x x 很大时,应将 x + 1 − x → 1 x + 1 + x \sqrt{x+1}-\sqrt{x}\rightarrow \dfrac{1}{\sqrt{x+1}+\sqrt{x}} x+1−x→x+1+x1
例:当 x → 0 x\rightarrow 0 x→0时,应将 1 − cos x sin x → sin x 1 + cos x \dfrac{1-\cos{x}}{\sin{x}}\rightarrow \dfrac{\sin{x}}{1+\cos{x}} sinx1−cosx→1+cosxsinx
-
避免分母很小或分子很大:
原因:防止溢出(对于计算机来说)
-
-
秦九韶算法(简化步骤,减少次数):
- 介绍:对于多项式 P n ( x ) = a n x n + a n − 1 x n − 1 + . . . + a 1 x + a 0 P_n(x)=a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0 Pn(x)=anxn+an−1xn−1+...+a1x+a0,直接计算在 x x x 处的值需要 n ( n + 1 ) 2 \dfrac{n(n+1)}{2} 2n(n+1)次乘法和 n n n次加法。转化为 P n ( x ) = ( ( ( ( a n ⋅ x + a n − 1 ) ⋅ x + a n − 1 ) ⋅ x + . . . a 2 ) ⋅ x + a 1 ) ⋅ x + a 0 \color{red}P_n(x)=((((a_n\cdot x+a_{n-1})\cdot x+a_{n-1})\cdot x+...a_2)\cdot x+a_1)\cdot x+a_0 Pn(x)=((((an⋅x+an−1)⋅x+an−1)⋅x+...a2)⋅x+a1)⋅x+a0,计算在 x x x 处的值只需要 n n n次乘法和 n n n次加法。
- 算法迭代格式: { S n = a n S k = x ⋅ S k + 1 + a k P n ( x ) = S 0 \begin{cases}S_n=a_n\\ S_k=x\cdot S_{k+1}+a_k\\ P_n(x)=S_0 \end{cases} ⎩⎪⎨⎪⎧Sn=anSk=x⋅Sk+1+akPn(x)=S0