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