计算方法的稳定性 | 误差来源之舍入误差 | 数值计算基本原则

本文主要是介绍计算方法的稳定性 | 误差来源之舍入误差 | 数值计算基本原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计算方法的稳定性

在实际数值计算过程中,由于不可避免地存在和不断产生各种误差,因此计算结果不是绝对精确的。如果误差使得计算结果和实际情况有较大差别或者出现错误的结果,则数值 计算便失去了价值和意义。因此,分析数值计算过程中误差的来源和传递规律,设法控制和减小误差。

1.误差的来源

来源:固有误差(模型误差、观测误差)和计算误差(截断误差、舍入误差)

舍入误差

设s是r进制数,p是r进制正负整数或零,则形如
x = s × r p x=s\times r^p x=s×rp
并满足
− 1 < s < 1 -1<s<1 1<s<1
的数x,称为r进制浮点数,且s和p分别称为浮点数的尾数和阶数。

任何一种计算机只能用有限的位数来表示浮点数的尾数和阶数。设
− m ≤ p ≤ M -m\leq p\leq M mpM
其中 m , M m,M m,M为正整数,它们主要由计算机用多少位数来表示阶数而决定。如果尾数的小数尾数为t(t一般比m,M的位数大若干倍),则计算机的数系由一切阶数满足 − 1 < s < 1 -1<s<1 1<s<1的t位r进制浮点数的集合F组成。可见,在计算机数系中,数的个数有限,数系中的每一个数都是有理数,且阶数相等的数以相等的距离分布在数轴的某一段上。

由于计算机数系是有限集,不仅无理数 e , π e,\pi e,π等不属于计算机数系,而且一些有理数(如 1 / 3 1/3 1/3)也属于计算机数系,因此常常用计算机数系中和它们接近的数来表示它们。同时,在利用计算机进行计算时,由于字长限制,参与计算的数的长度也是有限的,而由此产生的误差,称为舍入误差

例1

浮点数F的集合可以用以下4个参数来描述:
{ F } ≡ { β , t , L , U } \{F\}\equiv \{\beta,t,L,U\} {F}{β,t,L,U}
其中, β \beta β为基数,t是精度参数,整数L与U是阶码E(范围)的下限和上限 [ L , U ] [L,U] [L,U]

这样,F中的每一个浮点数x的值可表示为:
x = ± ( d 1 β + d 2 β 2 + ⋯ + d t β t ) ⋅ β E x=\pm(\frac{d_1}{\beta}+\frac{d_2}{\beta^2}+\cdots+\frac{d_t}{\beta^t})·\beta^E x=±(βd1+β2d2++βtdt)βE
式中的整数 d 1 , ⋯ , d t d_1,\cdots,d_t d1,dt满足 0 ≤ d t ≤ β − 1 , ( i = 1 , ⋯ , t ) 0\leq d_t\leq \beta-1,(i=1,\cdots,t) 0dtβ1,(i=1,,t),同时又 L ≤ E ≤ U L\leq E\leq U LEU(E是整数)。

如果对F中每个非零的x,有 d 1 ≠ 0 d_1\neq 0 d1=0,则称浮点数系F为规格化浮点数系。括号中的部分 f = ( d 1 / β + d 2 / β 2 + ⋯ + d t / β t ) f=(d_1/\beta+d_2/\beta^2+\cdots +d_t/\beta^t) f=(d1/β+d2/β2++dt/βt)称为尾数。我们知道,一个实数常用【整数+小数点+尾数】的形式表示,它们在计算机中对应的浮点数 [ β t ⋅ f ] [\beta^t·f] [βtf]则常用某种整数表示方式(例如以原码、反码或补码的形式)存储。

例2:求十进制数系与计算机采用的二进制数系之间的差别

:以在许多算法中常被选作步长的十进制0.1为例。在 β = 2 \beta=2 β=2或者为2的幂的浮点数系中,10个0.1的步长并不刚好等于一个1.0的步长。事实上,当把 1 10 \frac{1}{10} 101转换成为以 1 2 \frac{1}{2} 21为底的幂的有限项展开式时,有:
1 10 = 0 2 1 + 0 2 2 + 0 2 3 + 1 2 4 + 1 2 5 + 0 2 6 + 0 2 7 + ⋯ \frac{1}{10}=\frac{0}{2^1}+\frac{0}{2^2}+\frac{0}{2^3}+\frac{1}{2^4}+\frac{1}{2^5}+\frac{0}{2^6}+\frac{0}{2^7}+\cdots 101=210+220+230+241+251+260+270+
用下标表示数基,如果 β = 2 \beta=2 β=2,则有:
( 0.1 ) = ( 0.000110011001100 ⋯ ) z (0.1)=(0.000110011001100\cdots)_z (0.1)=(0.000110011001100)z
如果 β = 8 \beta=8 β=8,则
( 0.1 ) = ( 0.063146314 ⋯ ) s (0.1)=(0.063146314\cdots)_s (0.1)=(0.063146314)s
由于字长限制,等号右边的值只能取7位。很明显,当把10个这样的数相加时,其结果并不正好是1.0。这就是舍入误差造成的。所以,在计算机上进行的浮点运算(四则运算)只能是近似计算。

观测误差和数据的舍入误差虽然来源不同,但对计算结果的影响完全一样。在数值计算中涉及的误差一般指舍入误差(包含初始数据误差)和截断误差。

2 计算方法的稳定性

计算方法的稳定性是指数值计算中是否稳定的问题。在数值计算过程中,数值解是逐步计算出来的。由于计算机的字长有限,每一步计算都有误差存在,且前一步的舍入误差必然要影响下一步的近似解。如果运算序列的舍入误差不增长。误差的积累或传递对计算结果的影响是可控的,则该算法是数值稳定的,否则是数值不稳定的。

3. 数值计算的基本原则

评价一个数值计算方法优劣的标准:

  • 计算时间复杂度(运算次数或计算时间),包括收敛性问题
  • 计算空间复杂度(占用计算机存储空间)
  • 计算结果精确度(包括稳定性问题)

构造和选择一个好的计算方法:

  1. 避免两个相近的数相减

在数值计算过程中,两个相近的数相减,会严重损失有效数字,从而使相对误差变大。

如果两个相近的数相减,常采用变换的公式进行计算。如果计算公式不能改变,则采用增加有效数字位数的方法。

  1. 避免使用绝对值很小的数作分母

  2. 两个相差很大的数进行运算时,防止大数“吃掉”小数

  3. 简化计算步骤,减少运算次数

这篇关于计算方法的稳定性 | 误差来源之舍入误差 | 数值计算基本原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310442

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如