数值计算误差

时间:2021-07-18 16:08:30

补充题

在MATLAB上执行>> 5.1-5-0.1和>> 1.5-1-0.5,给出执行结果,并简要分析一下产生现象的原因

代码:

>> x1=5.1-5-0.1
x1 =
-3.608224830031759e-16
>> x2=1.5-1-0.5
x12=
0

原因:
浮点数表示时数字时位数有限,以双精度浮点数为例,共64位。
对于5.1,符号位一位,指数位11,整数部分占3位,小数部分0.1不能精确表示只能近似用49位表示。5.1-5-0.1,5被精确表示,0.1则用52位近似表示。故5.1中的小数部分0.1在计算机中比0.1小,最后结果为负。而x2=1.5-1-0.5中,所有的数都被精确表示了,故其结果为0.

p.153第1题

(1)

(一)程序设计

1.算法

In=5In1+1n    (n=1,2,3,...,20)

2.说明事项

1)I0必须取得精确值,利用 In=10xn5+xdx 计算I0时,会得到ln6-ln5,此处两数相近不宜相减,应换成ln(6/5)
2)计算出I0后利用循环即可计算出I20

(二)源程序

function [ y ] = test1_1( n )
y=log(1.2);
for i=1:1:n
   y=-5*y+1/i;
end

(三)实验结果

>> test1_1(20)
ans =
    4.242637044921560e-03

(2)

(一)程序设计

1.算法

In1=15In+15n    (n=20,19,...,1)

2.说明事项

1)将上一题中的结果去除尾数变为4.0e-03,得到I20粗糙估计值
2)计算出I20后利用循环即可计算出I0

(二)源程序

function [ y ] = test1_2
y=4.0e-03;
for i=20:-1:1;
    y=y/(-5)+1/(5*i);
end

(三)实验结果

>> test1_2
ans =
    1.823215567939546e-01

与log(1.2)的值相同

(3)结果分析

对于第一个公式
In=5In1+1n    (n=1,2,3,...,20)
分析其误差传递
ε(In)=|InIn|=5|In1In1|=(5)20ε(I0)
20次之后其误差惊人,其结果不可取
对于第二个公式
In1=15In+15n    (n=20,19,...,1)
分析其误差传递
ε(In1)=|In1In1|=15|InIn|=(15)20ε(IN)
20次之后误差很小