1、计算方法上机作业1.对以下和式计算: ,要求:0142188566nSn (1)若只需保留 11 个有效数字,该如何进行计算;(2)若要保留 30 个有效数字,则又将如何进行计算;(1)解题思想和算法实现:根据保留有效位数的要求,可以由公式 得出计算精度要求。只需要很少内存,时间复杂度和 d 呈线性,不需要高浮点支持。先根据 while 语句求出符合精度要求的 n 值的大小,然后利用 for 语句对这 n 项进行求和,输出计算结果及 n 值大小即可。(2)matlab 源程序:保留11位有效数字时;clearclcformat longn=0;sum=1/(16n)*(4/(8*n+1)-2/
2、(8*n+4)-1/(8*n+5)-1/(8*n+6);while sum=5*10(-11);n=n+1;sum=1/(16n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6);endfor i=0:n-1;sum=sum+1/(16i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6);endvpa(sum,11)n保留30位有效数字时;clearclcformat longn=0;sum=1/(16n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6);while sum=5*10(-30)
3、;n=n+1;sum=1/(16n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6);endfor i=0:n-1;sum=sum+1/(16i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6);endvpa(sum,30)n(3)实验结果分析图 1.1 保留 11 位有效数字的 n 值及计算结果图 图 1.2 保留 30 位有效数字的 n 值及计算结果图由计算结果可知,通过合理的误差控制,分别通过 7 次和 22 次循环,可以实现题目所要求的精确度。2.某通信公司在一次施工中,需要在水面宽度为 20 米的河沟底部沿直线走向铺
4、设一条沟底光缆。在铺设光缆之前需要对沟底的地形进行初步探测,从而估计所需光缆的长度,为工程预算提供依据。已探测到一组等分点位置的深度数据(单位:米)如下表所示:分点 0 1 2 3 4 5 6深度 9.01 8.96 7.96 7.97 8.02 9.05 10.13分点 7 8 9 10 11 12 13深度 11.18 12.26 13.28 13.32 12.61 11.29 10.22分点 14 15 16 17 18 19 20深度 9.15 7.90 7.95 8.86 9.81 10.80 10.93(1)请用合适的曲线拟合所测数据点;(2)预测所需光缆长度的近似值,并作出铺设河
5、底光缆的曲线图;(1)解题思想和算法原理 给定区间a, b一个分划:a=x 0ei=i+1;x0=x;x=x0-(6*x0.5-45*x0.2+20)/(30*x0.4-90*x0);%迭代enddisplay(方程的根)xdisplay(迭代的次数)i(3)实验结果分析:图 4.2 运行结果对于 Newton 迭代法,三个初值 x0 都使得迭代收敛,这是非常重要的。考虑 Newton 法迭代的收敛性条件:(1)存在一个区间,满足。由曲线和所选的三个区间可知这一条件满足。(2)f(x)是a,b上的单调函数,即对一切不变号。经验证所选的三个区间满足这一条件。(3)f(x)的凹向在a,b上不变,即
6、在a,b上不改变符号。经验证所选的三个区间满足这一条件。(4)-1 1 1.50 0 0另外,可以看出 Newton 迭代法收敛速度也很快,且很快达到很高的精度,源于它一般是超线性收敛的。5.编写程序实现大规模方程组的列主元高斯消去法程序,并对所附的方程组进行求解。针对本专业中所碰到的实际问题,提炼一个使用方程组进行求解的例子,并对求解过程进行分析、求解。解:(1)算法原理 由于一般线性方程在使用 Gauss 消去法求解时,从求解的过程中可以看到,若 =0,则必须进行行交换,才能使消去过程进行下去。有的时候即使)1(ka0,但是其绝对值非常小,由于机器舍入误差的影响,消去过程也会出)(k现不稳
7、定得现象,导致结果不正确。因此有必要进行列主元技术,以最大可能的消除这种现象。这一技术要寻找行 r,使得)1()1(max| kiikr并将第 r 行和第 k 行的元素进行交换,以使得当前的 的数值比 0 要大的多。)1(ka这种列主元的消去法的主要步骤如下:1. 消元过程对 k=1,2,n-1,进行如下步骤。1) 选主元,记 ikirkamx|很小,这说明方程的系数矩阵严重病态,给出警告,提示结果可能不|rka对。2) 交换增广阵 A 的 r,k 两行的元素。(j=k,n+1)kjja3)计算消元 (i=k+1,n; j=k+1,n+1)kjiijija/2. 回代过程对 k= n, n-1
8、,1,进行如下计算 )/(1,nkjkjkaxax至此,完成了整个方程组的求解。(2)matlab 源程序:%非压缩,dat51.dat、dat53.datclear;clcfp=fopen(dat53.dat,rb);id=fread(fp,1,int32);ver=fread(fp,1,int32);N=fread(fp,1,int32);q=fread(fp,1,int32);p=fread(fp,1,int32);for i=1:NA(i,:)=fread(fp,N,float);endfor i=1:Nd(i)=fread(fp,1,float);end%正向消去过程for i=1:
9、N-qfor k=1:pll=A(i+k,i)/A(i,i);for j=i:i+qA(i+k,j)=A(i+k,j)-ll*A(i,j);endd(i+k)=d(i+k)-ll*d(i);endendfor i=N-q+1:Nfor k=1:N-ill=A(i+k,i)/A(i,i);for j=i:NA(i+k,j)=A(i+k,j)-ll*A(i,j);endd(i+k)=d(i+k)-ll*d(i);endend%回代过程x(N)=d(N)/A(N,N);for i=N-1:-1:1S=0;if i+qNcv=N;%cv-critical valueelse cv=i+q;endfor
10、 j=i+1:cvS=S+A(i,j)*x(j);endx(i)=(d(i)-S)/A(i,i);endx%压缩,dat52.dat、dat54.datclear;clcfp=fopen(dat54.dat,rb);id=fread(fp,1,int32);ver=fread(fp,1,int32);N=fread(fp,1,int32);q=fread(fp,1,int32);p=fread(fp,1,int32);for i=1:NA(i,:)=fread(fp,p+q+1,float);endfor i=1:Nd(i)=fread(fp,1,float);end%正向消去过程for i=
11、1:Nif i+pNcv=p;%cv-critical valueelsecv=N-i;endfor k=1:cvll=A(i+k,p+1-k)/A(i,p+1);for j=p+1:p+q+1A(i+k,j-k)=A(i+k,j-k)-ll*A(i,j);endd(i+k)=d(i+k)-ll*d(i);endend%回代过程x(N)=d(N)/A(N,p+1);for i=N-1:-1:1;S=0;ii=i+1;jj=p+2;while (ii=N)ii=ii+1;jj=jj+1;endx(i)=(d(i)-S)/A(i,p+1);end x(3)实验结果:非压缩矩阵求解结果(部分)压缩矩
12、阵求解结果(部分)(4)分析心得:采用 Gauss 消去法时,如果在消元时对角线上的元素始终较大,那么本方法不需要进行列主元计算,计算结果一般就可以达到要求,否则必须进行列主元这一步,以减少机器误差带来的影响,使方法得出的结果正确。(5)实例化学反应方程式严格遵守质量守恒定律,书写化学反应方程式写出反应物和生成物后,往往左右两边各原子数目不相等,不满足质量守恒定律,这就需要通过计算配平来解决。对于化学反应方程式X1KMnO4+x2MnSO4+x3H2O=x4MnO2+x5K2SO4+x6H2SO4 ,可按以下方式配平:上述化学反应式中包含 5 种不同的原子(钾、锰、氧、硫、氢) ,按照原子守恒
13、有:K: x1=2x5Mn: x1+x2=x4O: 4x1+4x2+x3=2x4+4x5+4x6S: x2=x5+x6H: 3x2=2x6上述方程组中有 5 个方程,6 个未知量,因此有无数解。可先令 x6=1,于是形成方程组。使用 Gauss 消去法求解此方程组得:x =1.0000,1.5000,1.0000,2.5000,0.5000,1.0000;由于化学方程式通常取最简的正整数,因此将 x 乘 2 得配平的化学方程式:2KMnO4+3MnSO4+2H2O=5MnO2+K2SO4+2H2SO4 程序如下:clear;clc;a=1 0 0 0 -2 0;1 1 0 -1 0 0;4 4
14、 1 -2 -4 -4;0 1 0 0 -1 -1;0 0 2 0 0 -2;0 0 0 0 0 -1;b=0 0 0 0 0 -1;n=length(b);for k=1:n-1if a(k,k)=0disp(error);return;endfor i=k+1:na(i,k)=a(i,k)/a(k,k);for j=k+1:na(i,j)=a(i,j)-a(i,k)*a(k,j);endb(i)=b(i)-a(i,k)*b(k);endendx(n)=b(n)/a(n,n);for k=n-1:-1:1S=b(k);for j=k+1:nS=S-a(k,j)*x(j);endx(k)=S/a(k,k);endx