东南大学数值分析上机题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析上机题
第一章
17.(上机题)舍入误差与有效数 设∑=-=
N
j N j S 2
2
11
,其精确值为)111-23(21+-N N 。 (1)编制按从大到小的顺序1
-1
···1-311-21222N S N +
++=,计算N S 的通用程序;
(2)编制按从小到大的顺序1
21
···1)1(111
222-++--+
-=N N S N ,计算N
S 的通用程序;
(3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数(编制程序时用单精度); (4)通过本上机题,你明白了什么?
解: 程序:
(1)从大到小的顺序计算1
-1
···1-311-21222N S N +++=
:
function sn1=fromlarge(n) %从大到小计算sn1
format long ; sn1=single(0); for m=2:1:n
sn1=sn1+1/(m^2-1); end end
(2)从小到大计算1
21
···1)1(111
2
22
-++--+-=
N N S N function sn2=fromsmall(n) %从小到大计算sn2
format long ; sn2=single(0); for m=n:-1:2
sn2=sn2+1/(m^2-1); end end (3)
总的编程程序为: function p203()
clear all
format long;
n=input('please enter a number as the n:') sn=1/2*(3/2-1/n-1/(n+1));%精确值为sn
fprintf('精确值为%f\n',sn);
sn1=fromlarge(n);
fprintf('从大到小计算的值为%f\n',sn1);
sn2=fromsmall(n);
fprintf('从小到大计算的值为%f\n',sn2); function sn1=fromlarge(n) %从大到小计算sn1 format long;
sn1=single(0);
for m=2:1:n
sn1=sn1+1/(m^2-1);
end
end
function sn2=fromsmall(n) %从小到大计算sn2 format long;
sn2=single(0);
for m=n:-1:2
sn2=sn2+1/(m^2-1);
end
end
end
运行结果:
从而可以得到
N值真值顺序值有效位数
2 100.740050 从大到小0.740049 5
从小到大0.740050 6
4 100.749900 从大到小0.749852 3
从小到大0.749900 6
6 100.749999 从大到小0.749852 3
从小到大0.749999 6
(4)感想:
通过本上机题,我明白了,从小到大计算数值的精确位数比较高而且与真值较为接近,而从大到小计算数值的精确位数比较低。机器数在进行加法运算时,用从大到小的顺序容易出现
大数吃小数的情况,容易产生较大的误差,是因为对于相加的两个数值,计算机首先提供与大数相一致的位数,此时将小数的尾数向右移位,并进行四舍五入,之后对尾数进行依次相加。从大到小时,越往后计算,相加的数越小,从而出现大数吃小数的情况。相比之下。从小到大计算时,每次小数与大数相加,都会增加位数,从而精确度比较高。
第二章
20.(上机题)Newton 迭代法
(1)给定初值0x 及容许误差ε,编制Newton 法解方程)(x f =0根的通用程序。
(2)给定方程x x x f -=3/)(3
,易知其有三个根*1x =-3,*2x =0,*
3x =3。
①有Newton 方法的局部收敛性可知存在δ>0,当0x ∈(-δ,δ)时Newton 迭代序列收敛于根*
2x ,试确定尽可能大的δ;
②试取若干初始值,观察当0x ∈(-∞,-1),(-1,-δ),(-δ,δ),(δ,1),(1,+∞)时Newton 序列是否收敛以及收敛于哪一个根。 (3)通过本上机题,你明白了什么? 解:
(1)程序
先编写函数function 文件: 文件fx.m
%定义函数f(x) function Fx=fx(x) Fx=x^3/3-x;
文件dfx.m
%定义导函数df(x)% function fx=dfx(x) fx=x^2-1;
接下来是具体步骤
文件newton1.m 求尽可能大的delta 值
%%课本56页计算最大delta 值 clear flag=1; k=1; x0=0;
while flag==1
delta=k*10^-6;
x0=delta;
k=k+1;
m=0;
flag1=1;
while flag1==1&&m<=10^3
x1=x0-fx(x0)/dfx(x0);
if abs(x1-x0)<10^-6
flag1=0;
end
m=m+1;
x0=x1;
end
if flag1==1||abs(x0)>=10^-6
flag=0;
end
end
fprintf('%f\n',delta);
文件newton2.m求方程的根
%%课本56页newton法求方程的根,确定收敛于哪个根
format long;
ef=1e-6;
k=0;
x0=input('please enter the initial number as the x0:'); while k<1000
x1=x0-fx(x0)/dfx(x0);
if abs(x1-x0) break end x0=x1; k=k+1; end fprintf('方程的根为%f\n',x0);