1.3 误差定性分析与避免误差危害

目录

  • 1.3.1 算法的数值稳定性
  • 1.3.2 病态问题与条件数
  • 1.3.3 避免误差伤害

1.3.1 算法的数值稳定性

为了更好的理解,先看两个例子:

#include <iostream>
#include <cmath>
using namespace std;int main(){double e =  90.1 ;for(int i = 2;i<=10;i++)cout << pow(pow(e,i),1.0/i) << endl;return 0;
}

x = 90.1
for i in range(2,1000):print(x ** i **(1.0/i))

可以看出,python与C++的算法是有一定差别的,假设真实值为90,观测值为90.1,可以看出,Python在计算过程中产生了较大误差,但随着计算次数变差,误差逐渐减小并接近90.1,C++在计算过程中值没有发生改变,但二者的算法都是稳定的,因为随着计算次数增多,误差没有变大。

定义3 一个算法如果输人数据有误差,而在计算过程中舍人误差不增长,则称此算法是数值稳定的;否则称此算法为不稳定的。

1.3.2 病态问题与条件数

对一个数值问题本身如果输人数据有微小扰动 (即误差), 引起输出数据 (即问题解) 相 对误差很大, 这就是病态问题. 例如, 计算函数值 f ( x ) f(x) f(x) 时, 若 x x x 有扰动 Δ x = x − x ∗ \Delta x=x-x^{*} Δx=x−x∗ , 其相对 误差为 Δ x x \frac{\Delta x}{x} xΔx​ , 函数值 f ( x ∗ ) f\left(x^{*}\right) f(x∗) 的相对误差为 f ( x ) − f ( x ∗ ) f ( x ) \frac{f(x)-f\left(x^{*}\right)}{f(x)} f(x)f(x)−f(x∗)​ . 二者的比值为:
∣ f ( x ) − f ( x ∗ ) f ( x ) ∣ ∣ Δ x x ∣ = ∣ f ( x ) − f ( x ∗ ) f ( x ) x x − x ∗ ∣ = ∣ f ( x ) − f ( x ∗ ) x − x ∗ x f ( x ) ∣ ≈ ∣ x f ′ ( x ) f ( x ) ∣ = C p , \frac{{|\frac{f(x)-f\left(x^{*}\right)}{f(x)}|} }{| \frac{\Delta x}{x} | }=|\frac{f(x)-f(x^*)}{f(x)} \frac{x}{x-x^*}|=|\frac{f(x)-f(x^*)}{x-x^*}\frac{x}{f(x)}| \approx\left|\frac{x f^{\prime}(x)}{f(x)}\right|=C_{p}, ∣xΔx​∣∣f(x)f(x)−f(x∗)​∣​=∣f(x)f(x)−f(x∗)​x−x∗x​∣=∣x−x∗f(x)−f(x∗)​f(x)x​∣≈∣ ∣​f(x)xf′(x)​∣ ∣​=Cp​,
C p C_{p} Cp​ 称为计算函数值问题的条件数.一般情况下, 条件数 C p ⩾ 10 C_{p} \geqslant 10 Cp​⩾10 就认为是病态, C p C_{p} Cp​ 越大病态越严重.注意病态问题不是算法引起的, 是数值问题自身固有的.

例1 f ( x ) = x 10 f(x)=x^{10} f(x)=x10,则 C p = ∣ x f ′ ( x ) f ( x ) ∣ = 10 C_p=\left|\frac{x f^{\prime}(x)}{f(x)}\right|=10 Cp​=∣ ∣​f(x)xf′(x)​∣ ∣​=10.
如果 x = 1 x=1 x=1, x ∗ = 1.02 x^*=1.02 x∗=1.02,并且已知 f ( 1.02 ) ≈ 1.24 f(1.02)\approx1.24 f(1.02)≈1.24,则 ε r ( x ∗ ) = 1.02 − 1 1 = 2 % \varepsilon_r(x^*)=\frac{1.02-1}{1}=2\% εr​(x∗)=11.02−1​=2%; ε r ( x ∗ 10 ) = 1.24 − 1 1 = 24 % \varepsilon_r(x^{*^{10}})=\frac{1.24-1}{1}=24\% εr​(x∗10)=11.24−1​=24%

1.3.3 避免误差伤害

根本方法:防止有效数字损失
如何防止:避免两相近数相减;用绝对值很小的数作除数;调整运算次序;减少运算次数。

例2(避免两相近数相减):求 x 2 − 16 x + 1 = 0 x^{2}-16 x+1=0 x2−16x+1=0 的小正根.
解: x 2 = 8 − 63 ≈ 8 − 7.94 = 0.06 = x 2 ∗ , x 2 ∗ x_{2}=8-\sqrt{63} \approx 8-7.94=0.06=x_{2}^{*}, x_{2}^{*} x2​=8−63 ​≈8−7.94=0.06=x2∗​,x2∗​ 只有一位有效数字.
若改用 x 2 = 8 − 63 = 1 8 + 63 ≈ 1 15.94 ≈ 0.0627 x_{2}=8-\sqrt{63}=\frac{1}{8+\sqrt{63}} \approx \frac{1}{15.94} \approx 0.0627 x2​=8−63 ​=8+63 ​1​≈15.941​≈0.0627,具有三位有效数字.

例3 (避免两相近数相减):计算 A = 1 0 7 ( 1 − cos ⁡ 2 ∘ ) A=10^{7}\left(1-\cos 2^{\circ}\right. ) A=107(1−cos2∘),其中 cos ⁡ 2 ∘ = 0.9994 \cos 2^{\circ}=0.9994 cos2∘=0.9994
直接计算 A = 1 0 7 ( 1 − cos ⁡ 2 ∘ ) = 1 0 7 ( 1 − 0.9994 ) = 6 × 1 0 3 A=10^{7}\left(1-\cos 2^{\circ}\right)=10^{7}(1-0.9994)=6 \times 10^{3} A=107(1−cos2∘)=107(1−0.9994)=6×103.只有一位有效数字.
若利用 1 − cos ⁡ x = 2 sin ⁡ 2 x 2 1-\cos x=2 \sin ^{2} \frac{x}{2} 1−cosx=2sin22x​ , 则 A = 1 0 7 ( 1 − cos ⁡ 2 ∘ ) = 2 × ( sin ⁡ 1 ∘ ) 2 × 1 0 7 = 6.13 × 1 0 3 A=10^{7}\left(1-\cos 2^{\circ}\right)=2 \times\left(\sin 1^{\circ}\right)^{2} \times 10^{7}=6.13 \times 10^{3} A=107(1−cos2∘)=2×(sin1∘)2×107=6.13×103,具有两位有效数字.

类似地, x 1 x_1 x1​与 x 2 x_2 x2​很接近时,应使用: l g x 1 − l g x 2 = l g x 1 x 2 ( 避免两相近数相减) lgx_1-lgx_2=lg\frac{x_1}{x_2} \text{( 避免两相近数相减)} lgx1​−lgx2​=lgx2​x1​​( 避免两相近数相减)
x x x很大时,应使用: x + 1 − x = 1 x + 1 + x ( 避免两相近数相减) \sqrt{x+1}-\sqrt x=\frac{1}{\sqrt{x+1}+\sqrt x}\text{( 避免两相近数相减)} x+1 ​−x ​=x+1 ​+x ​1​( 避免两相近数相减)
一般地,当 f(x) \approx f\left(x^{*}\right) 时,可用泰勒展开进行更精确的近似
f ( x ) − f ( x ∗ ) = f ′ ( x ∗ ) ( x − x ∗ ) + f ′ ′ ( x ∗ ) 2 ( x − x ∗ ) 2 + ⋯ f(x)-f\left(x^{*}\right)=f^{\prime}\left(x^{*}\right)\left(x-x^{*}\right)+\frac{f^{\prime \prime}\left(x^{*}\right)}{2}\left(x-x^{*}\right)^{2}+\cdots f(x)−f(x∗)=f′(x∗)(x−x∗)+2f′′(x∗)​(x−x∗)2+⋯

例4 计算 1 + 2 + 3 + ⋯ + 100 + 1 0 9 1 + 2 + 3 + \dots +100 +10^{9} 1+2+3+⋯+100+109,求和时应从小到大相加,可以避免“大数吃小数”,使误差减小。

#include <iostream>
#include <cmath>
using namespace std;int main(){float sum_small_to_big = 0.0 ;float sum_big_to_small = 1000000000.0 ;for(int i = 1;i<=100 ; i++){sum_small_to_big += i;sum_big_to_small += (101-i);}sum_small_to_big += 1000000000;cout << fixed << sum_small_to_big << endl;cout << sum_big_to_small << endl;
}

例5 (减少运算次数) 一般来说, 计算机处理下列运算的速度为 ( + , − ) > ( × , ÷ ) > ( e x ) (+,-)>(\times, \div)>(e^x ) (+,−)>(×,÷)>(ex)
P 5 ( x ) = a 5 x 5 + a 4 x 4 + a 3 x 3 + a 2 x 2 + a 1 x 1 + a 0 P_{5}(x)=a_{5} x^{5}+a_{4} x^{4}+a_{3} x^{3}+a_{2} x^{2}+a_{1} x^{1}+a_{0} P5​(x)=a5​x5+a4​x4+a3​x3+a2​x2+a1​x1+a0​
直接计算一共需 5 + 4 + 3 + 2 + 1 5+4+3+2+1 5+4+3+2+1 次乘法,和 5 5 5次加法. 若利用公式
P 5 ( x ) = ( ( ( a 5 x + a 4 ) x + a 3 ) x + a 2 ) x + a 1 ) x + a 0 \left.P_{5}(x)=\left(\left(\left(a_{5} x+a_{4}\right) x+a_{3}\right) x+a_{2}\right) x+a_{1}\right) x+a_{0} P5​(x)=(((a5​x+a4​)x+a3​)x+a2​)x+a1​)x+a0​
则只须5次乘法和 5 次加法。

第一章 1.3误差定性分析与避免误差危害相关推荐

  1. 数值计算方法 第一章 数值计算中的误差 笔记

    数值计算中的误差 (1)误差的基本概念 误差的基本概念 实际问题的精确解与数值计算所得的近似解之间的差别称为误差 误差来源 (1)模型误差 实际问题与数学模型之差 (2)观测误差 观测所的 (3)截断 ...

  2. 机器学习理论入门:第一章 监督学习与非监督学习介绍

    第一章 监督学习与非监督学习简介 一.机器学习基本概念 概念:研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有 的知识结构使之不断改善自身的性能 输入 基本概念 –特征向量: ...

  3. 周志华《机器学习》课后习题解析(第一章)绪论

    周志华老师的<机器学习>(西瓜书)一书,没有公布答案,于是我们从网上搜集了各题目的答案,供大家参考. 参考答案 第一章 绪论 1.1.表1.1中若只包含编号为1,4的两个样例,试给出相应的 ...

  4. 期末复习、化学反应工程科目(第一章)

    @Author:Runsen @Date:2020/6/25 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  5. 【原】概率论——第一章第1节

    第一章 随机事件与概率 1.1 随机事件及其运算 一 随机事件的几个相关概念 1 随机现象:在一定的条件下,并不总是出现相同结果的现象.如:抛一枚硬币与掷一颗骰子. 随机现象的特点: 结果不止一个,只 ...

  6. 数值分析(第五版) 第一章知识点总结

    仅供大致参考,有许多定义存在不严谨的地方:不同学校的考察重点自然是不同的 第一章 绪论 舍入误差 由于计算机字长是有限的,因此在存储数据时便可能不可避免地丢失部分信息,这便是舍入误差. 截断误差 由于 ...

  7. 【sklearn-cookbook-zh】第一章 模型预处理

    第一章 模型预处理 作者:Trent Hauck 译者:muxuezi 协议:CC BY-NC-SA 4.0 本章包括以下主题: 目录 第一章 模型预处理 简介 1.1 从外部源获取样本数据 Gett ...

  8. 数学:确定性的丧失--第一章 数学真理的起源

    发信人: paradax (秀树*冬眠中...), 信区: Philosophy 标  题: 数学:确定性的丧失(2) 发信站: 北大未名站 (2002年10月23日22:32:42 星期三), 转信 ...

  9. 清华大学数据挖掘课程幕课习题(第一章)

    第一章第二节 1."教育不是灌输,而是点燃火焰" 这一思想出自于:苏格拉底. 2.如何学好数据挖掘技术?认真学习幕课视频:充分利用课后阅读材料:勤于动手,实践出真知:主动思考,知其 ...

最新文章

  1. Bootstrap 表格 笔记
  2. 如何使用SAP Intelligent Robotic Process Automation自动操作Excel
  3. IntentService用法
  4. ASP.NET中共有哪几种类型的控件?其中,HTML控件、HTML服务器控件和WEB服务器控件之间有什么区别
  5. WCF-001:WCF的发布
  6. vs code使用问题
  7. python自定义排序规则_python自定义排序
  8. 【转】TreeList 选中节点时图标状态和背景色
  9. 探索python--Robert J. Brunner
  10. java崩溃停在崩溃代码上_通过编写Java代码让Jvm崩溃
  11. Sentaurus Process Device
  12. windows10插入耳机没有反应的问题
  13. Python课程第二天作业
  14. 北航计算机组成实验课,北航计算机组成实验Project5
  15. day04,字典的操作
  16. 上传照片显示服务器繁忙怎么回事,解决WordPress上传图片“图像后期处理失败,可能是服务器忙或没有足够的资源”问题...
  17. C# 类对象数据存储(Object自定义序列化)
  18. fock join 列子
  19. C0216:输入矩形的长和宽,输出周长和面积
  20. 高性能数据库引擎 CoolHash 产品宣言 Fourinone4.0版新特性(转)

热门文章

  1. oracle查询不走索引的一些情况(索引失效)
  2. 做人,该善良时就善良,该勇敢时就要有勇气去对应
  3. 顺序表的基本操作C++
  4. [Python] 相关性分析
  5. Doc2Vec句向量模型PV-DM与PV-DBOW的理解
  6. hexo 利用 Markdown 语法画 mermaid 流程图
  7. php高级工程师面试题,行不行对照看下自己的实力
  8. 【论文翻译】3461 AdderSR Towards Energy Efficient Image Super-Resolution(个人粗略翻译)
  9. matlab导入origin,matlab导入origin
  10. Leetcode 题解-59题