东南大学数值分析上机解剖

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档