《怎样避免计算误差》PPT课件.ppt
数值分析方法实际问题实际问题物理模型物理模型数学模型数学模型数值分析方法数值分析方法计算机求结果计算机求结果 数值分析实际上就是介绍在计算机上解决数学问题的数值计算方法及其理论。这门课程又称为数值计算方法.Fortran C+Matlab误差的来源和有关误差的基本概念n n一一 误差的来源和分类误差的来源和分类n n模型误差模型误差模型误差模型误差:数学模型仅是实际问题的一个近似,数学模型仅是实际问题的一个近似,它们之间的误差它们之间的误差n n观测误差:观测误差:观测误差:观测误差:模型中所含数据大都由实验或观测得模型中所含数据大都由实验或观测得到,受条件限制也会有误差到,受条件限制也会有误差n n这里,我们专门讨论数值计算中的误差,这里,我们专门讨论数值计算中的误差,不考虑不考虑不考虑不考虑上述两类误差,上述两类误差,上述两类误差,上述两类误差,即假定所利用的模型和数据是恰即假定所利用的模型和数据是恰当、合理的当、合理的n n截断误差截断误差截断误差截断误差(方法误差方法误差):求近似解求近似解n n舍入误差舍入误差舍入误差舍入误差:机器字长有限机器字长有限 误差和相对误差误差和相对误差(定义定义)设设x*是某量的准确值,是某量的准确值,x是是x*的近似值的近似值称称 x=x*-x 为为x的的误差误差或或绝对误差绝对误差。|x*-x|,称称 为为x的的(绝对绝对)误差限误差限或或精度精度,rx=(x*-x)/x*称为称为x的的相对误差相对误差|(x*-x)/x*|r,称称 r为为x的的相对误差限相对误差限。当当 r 很小时,很小时,r /|x|。准确位数和有效数字准确位数和有效数字(定义定义)设设x=0.a1 a 2an10m(m为整数为整数)(1.1)其中其中a 1an为为09中一个数字且中一个数字且a 1 0。如果如果|x*-x|10 k (1.2)即即x的误差不超过的误差不超过10-k位的位的半个半个半个半个单位单位则称近似数则称近似数x准确到第准确到第k位小数位小数,并说,并说x有有k位有效数字位有效数字。计算规则计算规则1.加减法加减法以小数点后位数最少的数据为基准,其他数据比它多保留一位,再进行加减计算,最终计算结果保留最少的位数。例:计算50.1+1.45+0.5812=?修约为:2.乘除法乘除法以有效数字最少的数据为基准,其他数据多保留一位有效数字,再进行乘除运算,计算结果仍保留最少的有效数字。例:计算0.012125.641.05728=?修约为:0.012125.641.057=?计算后结果为:,结果仍保留为三位有效数字。记录为:0.012125.641.056=0.328 例:计算2.50462.0051.52=?修约为:2.5052.0051.52=?当把1.1353210保留3个有效数字时,结果为1.1410 运算中若有、e等常数,以及等系数,其有效数字可视为无限,不影响结果有效数字的确定。(a b)=a b,r(a b)=a/(a b)ra+b/(a b)rb(近近似似数数相减不稳定相减不稳定)(ab)b a+a b r(ab)ra+rb(a/b)(1/b)a(a/b2)b(b 0不稳定不稳定)r(a/b)rarb一 避免两个大数相减例1:计算 结果为 pauseend减少计算误差的措施 例2:计算 直接计算计算 结果为 利用公式write(*,*)1.0/(sqrt(100000001.0)+)结果为 0二 避免绝对值接近于零的数做分母直接计算write(*,*)1000.0/(sqrt(1000001.0)-1000)结果为 利用write(*,*)1000.0*(sqrt(1000001.0)+1000)结果为 可见,直接计算的误差很大.例4:计算当x很小时,分子出现相近数相减,分母趋于零.结果为 write(*,*)(1.0-cos(0.0003)/sin(0.0003)将以上算式变形直接计算write(*,*)sin(0.0003)/(1.0+cos(0.0003)结果为 三 防止大数吃小数。当两个绝对值相差很大的数进行加法或减法运算时,绝对值小的数有可能被绝对值大的数吃掉.do i=1,100enddowrite(*,*)t结果为 do i=1,100enddowrite(*,*)t结果为 例5:计算 1234567加上100个1.把 一个一个直接加到 上2.先把 100 个 加在一起,然后再加到 上四 好的运算方案能控制误差的传播放大,减少计算步骤.例6:计算不良运算方案Write(*,*)a*x*3+b*x*2+c*x+d一共6次乘法,3次加法.良好运算方案Write(*,*)(a*x+b)*x+c)*x+d一共3次乘法,3次加法.(b)秦九韶算法对于一般多项式(a)直接计算每一项再求和:例7:控制误差被恶性放大的例子.do i=1,10t=1.0/i-5.0*tenddowrite(*,*)t真实值约为,计算结果却为 Why?这个算法显然不具有数值稳定性正确的算法在哪?do i=10,1,-1t=0.2*(1.0/i-t)enddowrite(*,*)t这个算法具有数值稳定性据说,美军据说,美军 1910 1910 年的一次部队的命令传递是这样的年的一次部队的命令传递是这样的:营长对值班军官营长对值班军官:明晚大约明晚大约 8 8点钟左右,哈雷彗星将可能在这个地区点钟左右,哈雷彗星将可能在这个地区看到,这种彗星每隔看到,这种彗星每隔 7676年才能看见一次。命令所有士兵着野战服在操年才能看见一次。命令所有士兵着野战服在操场上集合,我将向他们解释这一罕见的现象。如果下雨的话,就在礼场上集合,我将向他们解释这一罕见的现象。如果下雨的话,就在礼堂集合,我为他们放一部有关彗星的影片。堂集合,我为他们放一部有关彗星的影片。值班军官对连长值班军官对连长:根据营长的命令,明晚根据营长的命令,明晚8 8点哈雷彗星将在操场上空出点哈雷彗星将在操场上空出现。如果下雨的话,就让士兵穿着野战服列队前往礼堂,这一罕见的现。如果下雨的话,就让士兵穿着野战服列队前往礼堂,这一罕见的现象将在那里出现。现象将在那里出现。连长对排长连长对排长:根据营长的命令,明晚根据营长的命令,明晚8 8点,非凡的哈雷彗星将身穿野战点,非凡的哈雷彗星将身穿野战服在礼堂中出现。如果操场上下雨,营长将下达另一个命令,这种命服在礼堂中出现。如果操场上下雨,营长将下达另一个命令,这种命令每隔令每隔7676年才会出现一次。年才会出现一次。排长对班长排长对班长:明晚明晚8 8点,营长将带着哈雷彗星在礼堂中出现,这是每隔点,营长将带着哈雷彗星在礼堂中出现,这是每隔 7676年才有的事。如果下雨的话,营长将命令彗星穿上野战服到操场上年才有的事。如果下雨的话,营长将命令彗星穿上野战服到操场上去。去。班长对士兵班长对士兵:在明晚在明晚8 8点下雨的时候,著名的点下雨的时候,著名的7676岁哈雷将军将在营长的岁哈雷将军将在营长的陪同下身着野战服,开着他那陪同下身着野战服,开着他那“彗星彗星”牌汽车,经过操场前往礼堂。牌汽车,经过操场前往礼堂。思考题:用正确方法编程计算write(*,*)log(1.0000001)结果为 若用write(*,*)log(10000001.0)-log(10000000.0)结果为