第2章+误差引论.ppt_第1页
第2章+误差引论.ppt_第2页
第2章+误差引论.ppt_第3页
第2章+误差引论.ppt_第4页
第2章+误差引论.ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章误差引论,2.1引论,由于科学技术的发展,提出了将科学家从繁琐的计算工作中解放出来的要求,而实际上有些复杂的计算问题根本无法用人工计算完成,为解决这样的计算任务,人们开始研究妥善解决计算机数值计算问题的方式。,2.2计算机数值计算方法,随着科学技术的发展,出现了许多复杂的科学技术问题。为了解决这些问题,先要根据提出的问题和条件建立数学模型,然后进行解算。从数学模型求解的角度看,有解析法、数值解法和图解法等。通常把求数值解的问题称为数值计算问题,把求数值解的方法称为数值计算方法。有些数值计算问题由于其计算工作量极大,人工计算无法完成,由此产生了使用计算机解决数值计算问题的方法,这就是计算机数值计算方法。,图2.1计算机进行数值计算的基本过程,2.3误差及有关概念,2.3.1误差及其来源科学计算中所处理的数据和计算的结果通常都是在一定范围内的近似值,它们与实际的真实值之间存在着误差。也就是说,一个物理量的真实值和我们算出的值往往不相等,其差值称为误差。假设为准确值(又称精确值),是的一个近似值,则误差可以表示为(2.2),注:为了便于表示,在本书中,若无特殊说明,右上角带“*”的变量均为准确量,右上角不带“*”的变量为近似值。,误差的来源有下面几种:1)模型误差2)测量误差(观测误差)3)截断误差(方法误差)4)舍入误差,1)模型误差我们在解决实际问题时,通常需要将实际问题转化为数学问题,然后加以求解。这样的转化过程就是建立数学模型的过程。建立数学模型时,为便于分析或计算,往往需要对实际问题进行抽象和合理的简化,忽略一些次要因素。这样,建立的数学模型虽然“精确”,但其实只是客观现象的一种近似。这种实际问题与数学模型之间产生的误差称为模型误差。,2)测量误差(观测误差)在建立的数学模型中,一般都含有从测量、实验,并加以记录而得到的数据,比如温度、时间、速度、长度、电流、电压等等。在测量或实验过程中由于所使用的测量仪器的精密性、实验手段的局限性、某些偶然的客观因素,不可避免地会引入一定的误差,这种误差称为测量误差。,3)截断误差(方法误差)在使用无穷级数求和时,只能取前面有限项的和来近似作为该级数的和,于是就产生了有限过程代替无限过程的误差。这种在计算过程中通过有限过程的计算结果代替无限过程的结果而造成的误差,称为截断误差,这是计算方法本身出现的误差,故又称为方法误差。截断误差的大小,直接影响数值计算的精度,所以它是数值计算中必须十分重视的一类误差。,4)舍入误差在计算中由于四舍五入而产生的误差,称为舍入误差。这种误差的产生是由于在计算机中遇到的数据可能位数很多,也可能是无穷小数(例如1/3=0.33333等),但计算机在计算时,都只能用有限位小数来代替或用位数较少的小数来代替位数较多的有限小数,即必须进行四舍五入。少量的舍入误差可能微不足道,但要进行千百万次四则运算后,经过积累的舍入误差,有时对精度会有非常大的影响。所以,做数值计算时,对舍入误差应予以足够的重视。,2.3.2误差限通常误差也不可能准确地确定,只能根据具体测量或计算的情况估计它的大小的范围,由此引入了误差限的概念。设是准确值的一个近似值,若存在一个小正数e,能够使得不等式(2.3)成立,则e称为近似值的绝对误差限,简称误差限。,2.3.3绝对误差和相对误差,以上计算表明,的误差限虽然较大,但与其本身的值相比则不算大。的误差限较小,但与其本身相比却显得较大。,虽然误差限从某种角度上表示出一个近似值近似的程度,但误差限的大小还不能够完全表达出近似值的准确程度。,l和5分别为和的误差限。,为了精确地描述每个单位上误差大小的概念,于是引入了相对误差的概念。,绝对误差与准确值之比为相对误差。,绝对误差:,2.3.4有效数字为了给出一种近似数,使之既能表示其大小,又能表示其精确程度,需要引进有效数字的概念。设是准确值的一个近似值,若将值的表示方式改写为:其中是09中的数字,且,是正整数,是整数,若其绝对误差限满足:则称近似值具有位有效数字。,(2.5),例如,具有3位有效数字,取近似数由可知,具有一位有效数字。在数值计算中,一般都认为所有原始数据都是有效数字。计算值具有有效数字位数的多少,是评定计算方法好坏的主要标准。,2.3.5约束误差1)选择收敛的稳定的方法对同一个问题选择不同的数值计算方法,可能得到不同的计算结果。在计算方法中,除了给出方法的数值计算公式,还要讨论计算公式的收敛性、稳定性和截断误差的特性。选择收敛性要求低、稳定性好的方法是约束误差扩张最重要的措施。例如,样条插值函数比高次多项式的效果好得多,是构造插值函数的首选方法。,)提高数值计算精度数值在计算机中存放的位数称为字长。有限位的字长是带来舍入误差和控制数值计算精度的根源。对同一种方法,在字长大的计算机上的计算效果要比在字长小的计算机上优越。在计算机上,用同一种数值计算方法对数据选用不同的数值类型,有时会直接影响到计算效果。例如,对病态的线性方程组,采用单精度数据使用消元方法,其数值解大大失真,而用双精度数据有时却可达到满意的数值解。,2.4数值计算中应注意的一些原则,计算机在运算过程中,由于不可避免的要产生误差,因而为保证运算结果的可靠性与高精度,防止误差危害现象的产生,在分析运算误差时,应注意如下一些原则。1)尽量避免两个相近的数相减。2)两个相差很大的数之间进行运算时,防止大数“吃掉”小数。3)注意简化计算步骤,减少运算次数,避免误差积累。4)尽可能避免绝对值很小的数做分母。5)设法控制误差的传播。,1)尽量避免两个相近的数相减在数值计算中,两个相近的数作减法时,有效数字会有损失。由相对误差的定义(2.6)当时,即两者很接近时,和都变得很大,由式(2.6)知,相对误差也随之变得很大。从而可能超出规定的误差而导致计算失败。因此,在计算过程中,应避免数值相近的两个数相减。,例2.1当值较大时,计算。可化为下列等价的公式来计算按此公式避免了两相近数相减。例2.2当值接近于0时,计算。可化为下列等价的公式来计算。,2)两个相差很大的数之间进行运算时,防止大数“吃掉”小数。在数值计算中,参加计算的数有时数量级相差很大,而计算机的位数有限,如不注意就有可能出现大数“吃掉”小数的现象,影响计算结果的可靠性。,例如,某计算机允许表示具有七位有效数字的十进制数,计算333.3333+0.0002222222若计算时没有位数的限制,则计算结果应当是333.3335222222。而现在的问题是,计算机由于字长位数的限制,只能表示七位有效数字,于是只得将小数点后的七个数字全部删掉,而仅保留其整数部分,得到和值333.3335。这样,在相加的过程中,大数就把小数“吃掉”了。,3)注意简化计算步骤,减少运算次数,避免误差积累。在数值计算中,对于同一个计算问题,必须要考虑尽量简化计算步骤和减少运算次数,这样一方面可以减少计算量,提高计算速度,另一方面,由于减少了运算次数,从而减少了产生误差的机会,也使误差积累有可能减小。,例2.3计算下列多项式的值。如果先计算各项然后相加,需做十次乘法和四次加法,但若改用下式计算则只需做四次乘法和四次加法。如计算,如果逐个相乘,要作254次乘法,再但若改变成只要做14次乘法运算即可。,4)尽可能避免绝对值很小的数做分母。用绝对值很小的数做除数,舍入误差会增大,而且当很小的除数稍有一点误差时,对计算结果影响很大。例2.4。如分母变为0.00011,即分母只有0.00001的变化时,计算结果却有了很大的变化。,5)设法控制误差的传播。许多算法常常具有递推性,如求方程根的牛顿递代法等。利用递推关系进行计算时,运算过程比较规律,相当方便,但多次递推,必须注意误差的积累。如果递推过程中误差增大,多次递推会得到错误的结果;如果递推过程中误差减小,则得出的结果比较准确。,2.5不同字节的数在计算机中的表示形式,下面在32位计算机环境中,根据程序运行的结果来表示,不同字节的各种类型的数据的运行结果和数值范围。,/*int(shortint:INTEGER*2)的负的最小值*/#includemain()inti=-1,j;/*i的初始值0 xffff*/clrscr();printf(n*int型的负的最小值*nn);for(j=1;j=20;j+)printf(%8d%8d0 x%.4xn,j,i,i);i+=i;/*2倍*/,2.5.12个字节的整数的最小值例2.5使用整型变量,表示2个字节的整数的最小值,以及超出最小值范围时的情况。,*int型的负的最小值*1-10 xffff2-20 xfffe3-40 xfffc4-80 xfff85-160 xfff06-320 xffe07-640 xffc08-1280 xff809-2560 xff0010-5120 xfe0011-10240 xfc0012-20480 xf80013-40960 xf00014-81920 xe00015-163840 xc00016-327680 x80001700 x00001800 x00001900 x00002000 x0000,程序运行结果:,2.5.22个字节的整数的最大值例2.6使用整型变量,表示2个字节的整数的最大值,以及超出最大值范围时的情况。/*int(shortint:INTEGER*2)的正的最大值*/#includemain()inti=1,j;clrscr();printf(n*int型的正的最大值*nn);for(j=1;j=20;j+)printf(%8d%8d0 x%.4xn,j,i,i);i+=i+1;/*2倍后再加1*/,*int型的正的最大值*110 x0001230 x0003370 x00074150 x000f5310 x001f6630 x003f71270 x007f82550 x00ff95110 x01ff1010230 x03ff1120470 x07ff1240950 x0fff1381910 x1fff14163830 x3fff15327670 x7fff16-10 xffff17-10 xffff18-10 xffff19-10 xffff20-10 xffff,程序运行结果:,2.5.34个字节的整数的最小值例2.7使用整型变量,表示4个字节的整数的最小值,以及超出最小值范围时的情况。/*longint(INTEGER*4)的负的最小值*/#includemain()longi=-1;/*i的初始值0 xffffffff*/intj;clrscr();printf(n*longint的负的最小值*nn);for(j=1;j=35;j+)printf(%8d%16ld0 x%.8lxn,j,i,i);i+=i;/*2倍*/,*longint型的负的最小值*1-10 xffffffff2-20 xfffffffe3-40 xfffffffc4-80 xfffffff85-160 xfffffff06-320 xffffffe07-640 xffffffc08-1280 xffffff809-2560 xffffff0010-5120 xfffffe0011-10240 xfffffc0012-20480 xfffff80013-40960 xfffff00014-81920 xffffe00015-163840 xffffc00016-327680 xffff800017-655360 xffff000018-1310720 xfffe000019-2621440 xfffc000020-5242880 xfff80000,程序运行结果:,21-10485760 xfff0000022-20971520 xffe0000023-41943040 xffc0000024-83886080 xff80000025-167772160 xff00000026-335544320 xfe00000027-671088640 xfc00000028-1342177280 xf800000029-2684354560 xf000000030-5368709120 xe000000031-10737418240 xc000000032-21474836480 x800000003300 x000000003400 x000000003500 x00000000,2.5.44个字节的整数的最大值例2.8使用整型变量,表示4个字节的整数的最大值,以及超出最大值范围时的情况。/*longint(INTEGER*4)的正的最大值*/#includemain()longi=1;intj;clrscr();printf(n*longint型的正的最大值*nn);for(j=1;j=35;j+)printf(%8d%16ld0 x%.8lxn,j,i,i);i+=i+1;/*2倍后再加1*/,*longint型的正的最大值*110 x00000001230 x00000003370 x000000074150 x0000000f5310 x0000001f6630 x0000003f71270 x0000007f82550 x000000ff95110 x000001ff1010230 x000003ff3010737418230 x3fffffff3121474836470 x7fffffff32-10 xffffffff33-10 xffffffff34-10 xffffffff35-10 xffffffff,程序运行结果:,2.5.54个字节的实数的正的最大值例2.9使用实型变量,表示4个字节的实数的最大值,以及超出最大值范围时的情况。/*float(REAL*4)的正的最大值*/#includemain()floata=(float)1.0,b;inti;clrscr();printf(n*float型的正的最大值*nn);for(i=1;i=128;i+)printf(%8d%16en,i,a);a+=a;/*2倍*/b=a+1.0;if(b-a=(float)1.0)/*只有正确时*/a=b;,*float型的正的最大值*11.00000e+0023.00000e+0037.00000e+0041.50000e+0153.10000e+0166.30000e+0171.27000e+0282.55000e+021231.06338e+371242.12676e+371254.25353e+371268.50706e+371271.70141e+381283.40282e+38Floatingpointerror:Overflow.,程序运行结果:,2.5.64个字节的实数的正的最小值例2.10使用实型变量,表示4个字节的实数的最小值,以及超出最小值范围时的情况。/*float(REAL*4)的正的最小值*/#includemain()floata=(float)1.0;inti;clrscr();printf(n*float型的正的最小值*nn);for(i=1;i=155;i+)printf(%8d%16en,i,a);a*=0.5;,*float型的正的最小值*11.00000e+0025.00000e-0132.50000e-0141.25000e-0156.25000e-0263.12500e-0271.56250e-0287.81250e-0393.90625e-03101.95312e-031501.40130e-451510.00000e+001520.00000e+001530.00000e+001540.00000e+001550.00000e+00,程序运行结果:,2.5.78个字节的实数的正的最大值例2.11使用实型变量,表示8个字节的实数的最大值,以及超出最大值范围时的情况。/*double(REAL*8)的正的最大值*/#includemain()doublea=1.0,b;inti;clrscr();printf(n*double型的正的最大值*nn);for(i=1;i=0)for(;i0;i-)p*=10.0;elsefor(;i0;i+)p/=10.0;return(p);,*实数运算产生误差的程序一例*xSQRT(x+1)-1x/(SQRT(x+1)+1)x/21.00000e+109.99990e+049.99990e+045.00000e+091.00000e+093.16218e+043.16218e+045.00000e+081.00000e+089.99900e+039.99900e+035.00000e+071.00000e+073.16218e+033.16218e+035.00000e+061.00000e+069.99900e+029.99900e+025.00000e+051.00000e+053.15229e+023.16218e+025.00000e+041.00000e+049.90050e+019.90050e+015.00000e+031.00000e+033.06386e+013.06386e+015.00000e+021.00000e+029.04988e+009.04988e+005.00000e+011.00000e+012.31662e+002.31662e+005.00000e+001.00000e+004.14214e-014.14214e-015.00000e011.00000e+033.06386e+013.06386e+015.00000e+021.00000e+029.04988e+009.04988e+005.00000e+011.00000e+012.31662e+002.31662e+005.00000e+001.00000e+004.14214e-014.14214e-015.00000e011.00000e014.88088e024.88088e025.00000e021.00000e024.98756e034.98756e035.00000e031.00000e034.99875e044.99875e045.00000e04,1.00000e044.99988e054.99988e055.00000e051.00000e054.99999e064.99999e065.00000e061.00000e065.00000e075.00000e075.00000e071.00000e075.00000e085.00000e085.00000e081.00000e085.00000e095.00000e095.00000e091.00000e095.00000e105.00000e105.00000e101.00000e105.00000e115.00000e115.00000e111.00000e115.00000e125.00000e125.00000e121.00000e125.00044e135.00000e135.00000e131.00000e134.99600e145.00000e145.00000e141.00000e144.99600e155.00000e155.00000e151.00000e155.55112e165.00000e165.00000e161.00000e160.00000e+005.00000e175.00000e171.00000e170.00000e+005.00000e185.00000e181.00000e180.00000e+005.00000e195.00000e191.00000e190.00000e+005.00000e205.00000e201.00000e200.00000e+005.00000e215.00000e21,2.6.2使用单精度和双精度计算产生的误差在进行计算时,即使是对同一个函数,根据使用单精度和双精度类型的变量进行计算,也会产生计算误差。例2.15编程计算调和级数前n项的和。,/*使用单精度和双精度计算产生的误差*/#includedoublef2(longintn)longi;doubley=0.0;for(i=1;i=n;i+)y+=1.0/i;return(y);floatf1(longintn)longi;floaty=0.0;for(i=1;i=n;i+)y+=1.0/i;return(y);,main()longinti=10;clrscr();printf(nnfloatdouble);doprintf(n%8ld%13.7f%21.15f,i,f1(i),f2(i);i=10*i;while(i10000001);,程序运行结果:n值float型double型102.92896842.9289682539682541005.18737795.18737751763962110007.48547847.485470860550343100009.78761299.78760603604434510000012.090850812.090146129863282100000014.357358014.3927267228647811000000015.403682716.695311365856710,2.6.3使用的位数不同所产生的计算误差在进行计算时,参与计算的科学常数或一些特定的常数的位数不同,也会产生计算误差。例2.16编程计算取不同的近似值时tan(/4)的值。,/*取不同位数的近似值对tan(/4)的影响*/#include#includemain()inti;clrscr();doublea=3.14,3.142,3.1416,3.14159,3.14159265,3.1415926536,33.141592653510,3.1415926535898,3.14159265358910;printf(n%15s%25s,tan(/4);for(i=0;i10;i+)printf(n%21.13f%21.13f,ai,tan(ai/4);,程序运行结果:tan(/4)3.14000000000000.99920399010503.14200000000001.000203693

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论