东南大学数值分析上机作业汇总-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII数值分析上机报告院系:学号:姓名:目录作业1、舍入误差与有效数 (1)1、函数文件cxdd.m (1)2、函数文件cddx.m (1)3、两种方法有效位数对比 (1)4、心得 (2)作业2、Newton迭代法 (2)1、通用程序函数文件 (3)2、局部收敛性 (4)(1)最大δ值文件 (4)(2)验证局部收敛性 (4)3、心得 (6)作业3、列主元素Gauss消去法 (7)1、列主元Gauss消去法的通用程序 (7)2、解题中线性方程组 (7)3、心得 (9)作业4、三次样条插值函数 (10)1、第一型三次样条插值函数通用程序: (10)2、数据输入及计算结果 (12)作业1、舍入误差与有效数设∑=-=Nj N j S 2211,其精确值为⎪⎭⎫ ⎝⎛---1112321N N . (1)编制按从小到大的顺序11131121222-⋅⋅⋅+-+-=N S N ,计算N S 的通用程序;(2)编制按从大到小的顺序()12111111222-⋅⋅⋅+--+-=N N S N ,计算N S 的通用程序;(3)按两种顺序分别计算642101010,,S S S ,并指出有效位数; (4)通过本上机你明白了什么? 程序:1、函数文件cxdd.mfunction S=cxdd(N) S=0; i=2.0;while (i<=N) S=S+1.0/(i*i-1); i=i+1;endscript 运行结果(省略>>):S=cxdd(80) S=0.7375772、函数文件cddx.mfunction S=cddx (N) S=0; for i=N:-1:2 S=S+1/(i*i-1); endscript 运行结果(省略>>): S=cddx(80) S=0.7375773、两种方法有效位数对比精确值函数:function S=jqz(N)S=0.5*(1.5-1.0/N-1.0/(N+1));script运行结果(省略>>)4、心得本题重点体现了数值计算中“大数吃小数”的问题,由于计算机计算的截断特点,从大到小的计算会导致小数的有效数被忽略掉。
从题中可以看出,看出按不同的顺序计算的结果是不相同的,按从小到大的顺序计算的值与精确值吻合,而按从大到小的顺序计算的值与精确值有较大的误差。
计算机在进行数值计算时会出现“大数吃小数”的现象,导致计算结果的精度有所降低。
作业2、Newton迭代法(1)给定初值x0及容许误差ε,编制Newton法解方程f(x)=0根的通用程序。
-,x2※=0,x3※=3。
(2)给定方程f(x)=x3/3-x=0,易知其有三个根x1※=3①由Newton方法的局部收敛性可知存在δ>0,当x0∈(δ-,δ),Newton 迭代序列收敛于根x2※,试确定尽可能大的δ;②试取若干个初始值,观察当x0∈(-∞,-1),(-1,δ-,δ),-),(δ(δ,1),(1,+∞)时,Newton序列是否收敛以及收敛于哪一个根。
(3)通过本上机题,你明白了什么?1、通用程序函数文件定义f(x)函数function f=fun(x)f=x^3/3-x;end定义f(x)导函数function f=dfun(x)f=x*x-1;end定义求近似解函数function [f,n]=newton(x0,ep)flag=1;n=0;while(flag==1)x1=x0-fun(x0)/dfun(x0);n=n+1;if(abs(x1-x0)<=ep||n>100000)flag=0;endx0=x1;endf=x1;endscript运行结果clear;x0=input('请输入初始值x0:');ep=input('请输入容许误差:');[f,n]=newton(x0,ep);fprintf('方程的一个近似解为:%f\n',x1);2、局部收敛性(1)最大δ值文件flag=1;k=1;x0=0;while flag==1sigma=k*10^-6;x0=sigma;k=k+1;m=0;flag1=1;while flag1==1 && m<=10^3x1=x0-fun(x0)/dfun(x0);if abs(x1-x0)<10^-6flag1=0;endm=m+1;x0=x1;endif (flag1==1||abs(x0)>=10^-6)flag=0;endendfprintf('最大值为: %f\n',sigma);运行结果为:最大值为:0.774597x=0的最大区间为即得最大的δ为0.774597,Newton迭代序列收敛于根*2(-0.774597,0.774597)。
(2)验证局部收敛性在x0∈(-∞,-1)区间,取以下初值,分别调用newton.m函数文件,得到结果如下:x。
结果显示,以上初值迭代序列均收敛于-1.732051,即根*1显然,迭代格式初值的选择对于迭代的收敛速度是至关重要的,当初值接近真实值的时候,迭代次数减少。
●在x0∈(-1,δ-)区间,取以下初值,分别调用newton.m函数文件,得到结果如下:x。
计算结果显示,迭代序列局部收敛于1.730251,即根*3●在x0∈(δ-,δ)区间,取以下初值,分别调用newton.m函数文件,得到结果如下:x。
由newton1.m的运行过程表明,在整个区间上均收敛于0,即根*2●在x0∈(δ,1)区间,取以下初值,分别调用newton.m函数文件,得到结果如下:x。
计算结果显示,迭代序列局部收敛于-1.732051,即根*1在x0∈(1,+∞)区间,取以下初值,分别调用newton.m函数文件,得到结果如下:x。
结果显示,以上初值迭代序列均收敛于1.732051,即根*3综上所述:(-∞,-1)区间收敛于-1.73205,(-1,δ)区间局部收敛于1.73205,局部收敛于-1.73205,(-δ,δ)区间收敛于0,(δ,1)区间类似于(-1,δ)区间,(1,∞)收敛于1.73205。
3、心得牛顿迭代法对于初值的选择要求较高,因此,在牛顿迭代时可现通过简单迭代法寻找相对准确一些的值来进行牛顿迭代。
对于方程有多解的问题,Newton法求方程根时,牛顿迭代要考虑局部收敛的问题,迭代序列收敛于某一个根有一定的区间限制,在一个区间上,可能会局部收敛于不同的根。
作业3、列主元素Gauss消去法对于某电路的分析,归结为求解线性方程组RI=V。
32 -13 0 0 0 -10 0 0 0-13 35 -9 0 -11 0 0 0 00 -9 31 -10 0 0 0 0 0R= 0 0 0 -30 57 -7 0 -5 00 0 0 0 -7 47 -30 0 00 0 0 0 0 -30 41 0 00 0 0 0 -5 0 0 27 -20 0 0 -9 0 0 0 -2 29V T=[-15,27,-23,0,-20,12,-7,7,10]T(1)编制解n阶线性方程组Ax=b的列主元Gauss消去法的通用程序;(2)用所编程序解线性方程组RI=V,并打印出解向量,保留5位有效数字;(3)在本编程之中,你提高了那些编程能力。
1、列主元Gauss消去法的通用程序函数:找每列的主元的函数function B=zhuyuan(B,t,N,M)for i=0:N-1-tif B(N-i,t)>B(N-i-1,t)c=zeros(1,M);for j=1:Mc(j)=B(N-i,j);B(N-i,j)=B(N-i-1,j);B(N-i-1,j)=c(j);endendend进行列消去的函数function B=xiaoqu(B,t,N,M)for i=t+1:Nl=B(i,t)/B(t,t);for j=t:MB(i,j)=B(i,j)-l*B(t,j);endend进行三角矩阵下的解函数function X=jie(X,B,N,M)for i=1:N-1s=B(N-i,M);for j=N-i+1:Ns=s-B(N-i,j)*X(j);endX(N-i)=s/B(N-i,N-i);end执行主程序:N=input('请输入线性方程组的阶数: N=');M=input('请输入增广矩阵阶数: M=');b=zeros(1,N);A=zeros(N,N);A=input('请输入系数矩阵:');b(1,:)=input('请输入方程组的右端向量:');b=b';B=[A,b];for t=1:N-1 B=zhuyuan(B,t,N,M);B=xiaoqu(B,t,N,M);endX=zeros(N,1);X(N)=B(N,M)/B(N,N);X=jie(X,B,N,M);X2、解题中线性方程组执行程序,输入矩阵A(即题中的矩阵R)和列向量b(即题中的V),如下:请输入线性方程组的阶数: n=9请输入增广矩阵阶数: m=10请输入系数矩阵A:A=[31,-13,0,0,0,-10,0,0,0,-15;-13,35,-9,0,-11,0,0,0,0,27;0,-9,31,-10,0,0,0,0,0,-23;0,0,-10,79,-30,0,0,0,-9,0;0,0,0,-30,57,-7,0,-5,0,-20;0,0,0,0,-7,47,-30,0,0,12;0,0,0,0,0,-30,41,0,0,-7;0,0,0,0,-5,0,0,27,-2,7;0,0,0,-9,0,0,0,-2,29,10];请输入方程组的右端向量b:[-15 27 -23 0 -20 12 -7 7 10]得到如下结果:A =31 -13 0 0 0 -10 0 0 0 -15-13 35 -9 0 -11 0 0 0 0 270 -9 31 -10 0 0 0 0 0 -230 0 -10 79 -30 0 0 0 -9 00 0 0 -30 57 -7 0 -5 0 -200 0 0 0 -7 47 -30 0 0 120 0 0 0 0 -30 41 0 0 -70 0 0 0 -5 0 0 27 -2 70 0 0 -9 0 0 0 -2 29 10x =-0.289230.34544-0.71281-0.22061-0.430400.15431-0.0578230.201050.290233、心得列主元Gauss最重要的就是如何通过找到最大主元,并交换行,如何进行消去,这需要很细心的循环,和很复杂的嵌套,通过本题的编程,感觉个人对于这种多层嵌套循环的处理能力提高了很多。