东南大学数值分析上机报告完整版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析上机实验报告
目录
1.chapter1舍入误差及有效数 (1)
2.chapter2Newton迭代法 (3)
3.chapter3线性代数方程组数值解法-列主元Gauss消去法 (7)
4.chapter3线性代数方程组数值解法-逐次超松弛迭代法 (8)
5.chapter4多项式插值与函数最佳逼近 (10)
1.chapter1舍入误差及有效数
1.1题目
设S N =∑1
j 2−1
N j=2
,其精确值为
)1
1
123(21+--N N 。 (1)编制按从大到小的顺序11
13112122
2-+⋯⋯+-+-=N S N ,计算S N 的通用程序。 (2)编制按从小到大的顺序1
21
1)1(1112
22-+⋯⋯+--+-=
N N S N ,计算S N 的通用程序。 (3)按两种顺序分别计算64210,10,10S S S ,并指出有效位数。(编制程序时用单精度)
(4)通过本次上机题,你明白了什么? 1.2编写相应的matlab 程序 clear;
N=input('please input N:'); AValue=((3/2-1/N-1/(N+1))/2); sn1=single(0); sn2=single(0); for i=2:N
sn1=sn1+1/(i*i-1); %从大到小相加的通用程序% end
ep1=abs(sn1-AValue); for j=N:-1:2
sn2=sn2+1/(j*j-1); %从小到大相加的通用程序% end
ep2=abs(sn2-AValue);
fprintf('精确值为:%f\n',AValue);
fprintf('从大到小的顺序累加得sn=%f\n',sn1); fprintf('从大到小相加的误差ep1=%f\n',ep1); fprintf('从小到大的顺序累加得sn=%f\n',sn2); fprintf('从小到大相加的误差ep2=%f\n',ep2); disp('================================='); 1.3matlab 运行程序结果 >> chaper1
please input N:100 精确值为:0.740050
从大到小的顺序累加得sn=0.740049 从大到小相加的误差ep1=0.000001 从小到大的顺序累加得sn=0.740050 从小到大相加的误差ep2=0.000000 >> chaper1
please input N:10000 精确值为:0.749900
从大到小的顺序累加得sn=0.749852 从大到小相加的误差ep1=0.000048 从小到大的顺序累加得sn=0.749900 从小到大相加的误差ep2=0.000000
please input N:1000000
精确值为:0.749999
从大到小的顺序累加得sn=0.749852 从大到小相加的误差ep1=0.000147 从小到大的顺序累加得sn=0.749999 从小到大相加的误差ep2=0.000000
1.4结果分析以及感悟
按照从大到小顺序相加的有效位数为:5,4,3。按照从小到大顺序相加的和的有效位数为:6,6,6。 从程序的输出误差结果可以看出,按照不同的顺序相加造成的误差限是不同的,按照从大到小相加的顺序就是一个病态问题,而按照从小到大顺序相加的误差很小,并且在从大到小顺序相加的误差随着n 的增大而增大。因此,采取从小到大的顺序累加得到的结果更加精确。
2.chapter2Newton 迭代法
2.1题目
(1)给定初值0x 及容许误差ε,编制牛顿法解方程f(x)=0的通用程序。
(2)给定方程03
)(3
=-=x x
x f ,易知其有三个根3,0,3321=
*=*-=*x x x
○1由牛顿方法的局部收敛性可知存在,0>δ当),(0δδ+-∈x 时,Newton 迭代序列收敛于根x2*。试确定尽可能大的δ。
○2试取若干初始值,观察当),1(),1,(),,(),,1(),1,(0+∞+-----∞∈δδδδx 时Newton 序列的收敛性以及收敛于哪一个根。
(3)通过本上机题,你明白了什么? 2.2编写相应的matlab 程序 定义f(x)函数 function F=fu(x) F=x^3/3-x; end
定义f(x)的导函数 function F=dfu(x) F=x*x-1; end
求根的通用程序 clear;
x0=input('请输入初始值x0:'); ep=input('请输入容许误差:'); flag=1;
while flag==1
x1=x0-fu(x0)/dfu(x0); if abs(x1-x0)<=ep flag=0; end
end
fprintf('方程的一个近似解为:%f\n',x0);
求sigma的通用程序
clear;
eps=input('请输入搜索精度:');
ep=input('请输入容许误差:');
flag=1;
k=0;
x0=0;
while flag==1;
sigma=k*eps;
x0=sigma;
k=k+1;
m=0;
flag1=1;
while flag1==1&&m<=10^3
x1=x0-fu(x0)/dfu(x0);
if abs(x1-x0) flag1=0; end m=m+1; x0=x1; end if flag1==1||abs(x0)>=ep flag=0; end end fprintf('最大的sigma值为:%f\n',sigma); 2.3运行结果 寻找最大的sigma值 主要是在0的基础上,不断的增加步长,带入Newton公式,验证该值是否收敛于0,不断的循环,最后得到最小的不收敛于0的sigma值,此时也为最大满足收敛于0的最大的sigma值。改变不同的步长,分别得到不同的sigma值,取其中的最小值,即为满足条件的最大的sigma值。 程序相应的运行结果如下: >> chapter2_2 请输入搜索精度:10^-6 请输入容许误差:10^-6 最大的sigma值为:0.774597 >> chapter2_2 请输入搜索精度:10^-4 请输入容许误差:10^-6 最大的sigma值为:0.774600 >> chapter2_2 请输入搜索精度:10^-2 请输入容许误差:10^-6 最大的sigma值为:0.780000