东南大学数值分析上机解剖
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章
一、题目
设∑
=-=N
j N j S 22
1
1,其精确值为)11
123(21+--N N 。 (1)编制按从大到小的顺序1
1
131121222-+
⋯⋯+-+-=N S N ,计算SN 的通用程序。
(2)编制按从小到大的顺序1
21
1)1(111222-+
⋯⋯+--+-=N N S N ,计算SN 的通用程序。
(3)按两种顺序分别计算64210,10,10S S S ,并指出有效位数。(编制程序时用单精度) (4)通过本次上机题,你明白了什么? 二、MATLAB 程序
N=input('请输入N(N>1):');
AccurateValue=single((0-1/(N+1)-1/N+3/2)/2); %single 使其为单精度 Sn1=single(0); %从小到大的顺序 for a=2:N; Sn1=Sn1+1/(a^2-1); end
Sn2=single(0); %从大到小的顺序 for a=2:N; Sn2=Sn2+1/((N-a+2)^2-1); end
fprintf('Sn 的值 (N=%d)\n',N);
disp('____________________________________________________') fprintf('精确值 %f\n',AccurateValue); fprintf('从大到小计算的结果 %f\n',Sn1); fprintf('从小到大计算的结果 %f\n',Sn2);
disp('____________________________________________________')
三、结果
请输入N(N>1):100
Sn的值(N=100)
____________________________________________________
精确值0.740049
从大到小计算的结果0.740049
从小到大计算的结果0.740050
____________________________________________________
请输入N(N>1):10000
Sn的值(N=10000)
____________________________________________________
精确值0.749900
从大到小计算的结果0.749852
从小到大计算的结果0.749900
____________________________________________________
请输入N(N>1):1000000
Sn的值(N=1000000)
____________________________________________________
精确值0.749999
从大到小计算的结果0.749852
从小到大计算的结果0.749999
____________________________________________________
四、结果分析
可以得出,算法对误差的传播又一定的影响,在计算时选一种好的算法可以使结果更为精确。从以上的结果可以看到从大到小的顺序导致大数吃小数的现象,容易产生较大的误差,求和运算从小数到大数算所得到的结果才比较准确。
第二章
一、题目
(1)给定初值0x 及容许误差ε,编制牛顿法解方程f(x)=0的通用程序。
(2)给定方程03
)(3
=-=x x x f ,易知其有三个根3,0,3321=*=*-
=*x x x
①由牛顿方法的局部收敛性可知存在,0>δ当),(0δδ+-∈x 时,Newton 迭代序列收敛于根x 2*。试确定尽可能大的δ。
②试取若干初始值,观察当),1(),1,(),,(),,1(),1,(0+∞+-----∞∈δδδδx 时Newton 序列的收敛性以及收敛于哪一个根。 (3)通过本上机题,你明白了什么?
二、MATLAB 程序
文件fx.m
function Fx=fx(x) %% 定义函数f(x) Fx=x^3/3-x;
文件dfx.m
function Fx=dfx(x) %% 定义导函数df(x) Fx=x^2-1;
%% Newton 法求方程的根%% clear
ef=10^-6; %这里取容许误差10^-6 k=0;
x0=input('请输入 Xo 的值:');
disp('k Xk'); %使用空格将其分隔开 fprintf('0 %f\n',x0); flag=1;
while flag==1 && k<=10^3 x1=x0-fx(x0)/dfx(x0); if abs(x1-x0) flag=0; end k=k+1; x0=x1; fprintf('%d %f\n',k,x0); end %%寻找最大的delta值%% clear %% flag=1; k=1; x0=0; while flag==1 delta=k*10^-6; %delta与k有关 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(' delta 的最大值是%f\n',delta);