数值分析上机作业最强版
- 格式:docx
- 大小:338.68 KB
- 文档页数:25
东南大学《数值分析》上机题数值分析上机题1(1) 编制按从大到小的顺序几=亠+42- -1 3~ — 1计算几的通用程序。
(2 )编制按从小到大由-走+詔E +H 计算“的通用程月(3) 按两种顺序分别计算%, %, %, 有效位数。
(编制程序时用单精度)(4) 通过本上机题,你明白了什么?程序代码(matlab 编程):clc cleara=single(1・/([2:10A 7]・ A 2-l)); Si (1)=single(0); SI (2)=1/(2A 2-1); for N=3:10A 2Sl(N)=a(l); for i=2:N-lSI (N)=S1 (N)+a(i);endendS2 (l)=single(0); S2 (2)=1/(2A 2-1); for N=3:10A 2S2(N)=a(N-l);for i=linspace(N-2,1,N-2)S2(N)=S2(N)+a(i);endend其精确值为俣怙卜N —l顺序并指出S1表示按从大到小的顺序的S NS2表示按从小到大的顺序的S N 计算结果通过本上机题,看出按两种不同的顺序计算的结果是不相同的,按从大到小的顺序计算的值与精确值有较大的误差,而按从小到大的顺序计算的值与精确值吻合。
从大到小的顺序计算得到的结果的有效位数少。
计算机在进行数值计算时会出现“大数吃小数”的现象,导致计算结果的精度有所降低,我们在计算机中进行同号数的加法时,采用绝对值较小者先加的算法,其结果的相对误差较小。
数值分析上机题220・(上机题)Newton迭代法(1)给定初值、及容许误差,,编制Newton法解方程/⑴“根的通用程序。
(2)给定方程弘—,易知其有三个根1.由Newton方法的局部收敛性可知存在5>o,当“(—恥)时,Newton迭代序列收敛于根工;。
试确定尽可能大的恥2•试取若干初始值,观察当x0 e (-00,-1)9(一1,一»), (一恥),°1),(is时Niwton序列是否收敛以及收敛于哪一个根。
数值分析上机实验一、解线性方程组直接法(教材49页14题)追赶法程序如下:function x=followup(A,b)n = rank(A);for(i=1:n)if(A(i,i)==0)disp('Error: 对角有元素为0');return;endend;d = ones(n,1);a = ones(n-1,1);c = ones(n-1);for(i=1:n-1)a(i,1)=A(i+1,i);c(i,1)=A(i,i+1);d(i,1)=A(i,i);endd(n,1) = A(n,n);for(i=2:n)d(i,1)=d(i,1) - (a(i-1,1)/d(i-1,1))*c(i-1,1);b(i,1)=b(i,1) - (a(i-1,1)/d(i-1,1))*b(i-1,1);endx(n,1) = b(n,1)/d(n,1);for(i=(n-1):-1:1)x(i,1) = (b(i,1)-c(i,1)*x(i+1,1))/d(i,1);end主程序如下:function zhunganfaA=[2 -2 0 0 0 0 0 0;-2 5 -2 0 0 0 0 0;0 -2 5 -2 0 0 0 0;0 0 -2 5 -2 0 0 0;0 0 0 -2 5 -2 0 0;0 0 0 0 -2 5 -2 0;0 0 0 0 0 -2 5 -2;0 0 0 0 0 0 -2 5];b=[220/27;0;0;0;0;0;0;0];x=followup(A,b)计算结果:x =8.14784.07372.03651.01750.50730.25060.11940.0477二、解线性方程组直接法(教材49页15题)程序如下:function tiaojianshu(n)A=zeros(n);for j=1:1:nfor i=1:1:nA(i,j)=(1+0.1*i)^(j-1);endendc=cond(A)d=rcond(A)当n=5时c =5.3615e+005d =9.4327e-007当n=10时c =8.6823e+011d =5.0894e-013当n=20时c =3.4205e+022d =8.1226e-024备注:对于病态矩阵A来说,d为接近0的数;对于非病态矩阵A来说,d为接近1的数。
数值分析上机作业(一)一、算法的设计方案1、幂法求解λ1、λ501幂法主要用于计算矩阵的按模最大的特征值和相应的特征向量,即对于|λ1|≥|λ2|≥.....≥|λn|可以采用幂法直接求出λ1,但在本题中λ1≤λ2≤……≤λ501,我们无法判断按模最大的特征值。
但是由矩阵A的特征值条件可知|λ1|和|λ501|之间必然有一个是最大的,通过对矩阵A使用幂法迭代一定次数后得到满足精度ε=10−12的特征值λ0,然后在对矩阵A做如下的平移:B=A-λ0I由线性代数(A-PI)x=(λ-p)x可得矩阵B的特征值为:λ1-λ0、λ2-λ0…….λ501-λ0。
对B矩阵采用幂法求出B矩阵按模最大的特征值为λ∗=λ501-λ0,所以λ501=λ∗+λ0,比较λ0与λ501的大小,若λ0>λ501则λ1=λ501,λ501=λ0;若λ0<λ501,则令t=λ501,λ1=λ0,λ501=t。
求矩阵M按模最大的特征值λ的具体算法如下:任取非零向量u0∈R nηk−1=u T(k−1)∗u k−1y k−1=u k−1ηk−1u k=Ay k−1βk=y Tk−1u k(k=1,2,3……)当|βk−βk−1||βk|≤ε=10−12时,迭终终止,并且令λ1=βk2、反幂法计算λs和λik由已知条件可知λs是矩阵A 按模最小的特征值,可以应用反幂法直接求解出λs。
使用带偏移量的反幂法求解λik,其中偏移量为μk=λ1+kλ501−λ140(k=1,2,3…39),构造矩阵C=A-μk I,矩阵C的特征值为λik−μk,对矩阵C使用反幂法求得按模最小特征值λ0,则有λik=1λ0+μk。
求解矩阵M按模最小特征值的具体算法如下:任取非零向量u 0∈R n ηk−1= u T (k−1)∗u k−1y k−1=u k−1ηk−1 Au k =y k−1βk =y T k−1u k (k=1,2,3……)在反幂法中每一次迭代都要求解线性方程组Au k =y k−1,当K 足够大时,取λn =1βk 。
实用标准文案文档大全上机作业题报告2015.1.9 USER1.Chapter 11.1题目设S N =∑1j 2−1N j=2,其精确值为)11123(21+--N N 。
(1)编制按从大到小的顺序11131121222-+⋯⋯+-+-=N S N ,计算S N 的通用程序。
(2)编制按从小到大的顺序1211)1(111222-+⋯⋯+--+-=N N S N ,计算S N 的通用程序。
(3)按两种顺序分别计算64210,10,10S S S ,并指出有效位数。
(编制程序时用单精度) (4)通过本次上机题,你明白了什么?1.2程序1.3运行结果1.4结果分析按从大到小的顺序,有效位数分别为:6,4,3。
按从小到大的顺序,有效位数分别为:5,6,6。
可以看出,不同的算法造成的误差限是不同的,好的算法可以让结果更加精确。
当采用从大到小的顺序累加的算法时,误差限随着N 的增大而增大,可见在累加的过程中,误差在放大,造成结果的误差较大。
因此,采取从小到大的顺序累加得到的结果更加精确。
2.Chapter 22.1题目(1)给定初值0x 及容许误差ε,编制牛顿法解方程f(x)=0的通用程序。
(2)给定方程03)(3=-=x xx f ,易知其有三个根3,0,3321=*=*-=*x x x○1由牛顿方法的局部收敛性可知存在,0>δ当),(0δδ+-∈x 时,Newton 迭代序列收敛于根x2*。
试确定尽可能大的δ。
○2试取若干初始值,观察当),1(),1,(),,(),,1(),1,(0+∞+-----∞∈δδδδx 时Newton 序列的收敛性以及收敛于哪一个根。
(3)通过本上机题,你明白了什么?2.2程序2.3运行结果(1)寻找最大的δ值。
算法为:将初值x0在从0开始不断累加搜索精度eps,带入Newton迭代公式,直到求得的根不再收敛于0为止,此时的x0值即为最大的sigma值。
运行Find.m,得到在不同的搜索精度下的最大sigma值。
东南⼤学数值分析上机题答案数值分析上机题第⼀章17.(上机题)舍⼊误差与有效数设∑=-=Nj N j S 2211,其精确值为)111-23(21+-N N 。
(1)编制按从⼤到⼩的顺序1-1···1-311-21222N S N +++=,计算N S 的通⽤程序;(2)编制按从⼩到⼤的顺序121···1)1(111222-++--+-=N N S N ,计算NS 的通⽤程序;(3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数(编制程序时⽤单精度);(4)通过本上机题,你明⽩了什么?解:程序:(1)从⼤到⼩的顺序计算1-1···1-311-21222N S N +++=:function sn1=fromlarge(n) %从⼤到⼩计算sn1format long ; sn1=single(0); for m=2:1:nsn1=sn1+1/(m^2-1); end end(2)从⼩到⼤计算121···1)1(111222-++--+-=N N S N function sn2=fromsmall(n) %从⼩到⼤计算sn2format long ; sn2=single(0); for m=n:-1:2sn2=sn2+1/(m^2-1); end end(3)总的编程程序为: function p203()clear allformat long;n=input('please enter a number as the n:') sn=1/2*(3/2-1/n-1/(n+1));%精确值为sn fprintf('精确值为%f\n',sn);sn1=fromlarge(n);fprintf('从⼤到⼩计算的值为%f\n',sn1);sn2=fromsmall(n);fprintf('从⼩到⼤计算的值为%f\n',sn2);function sn1=fromlarge(n) %从⼤到⼩计算sn1 format long;sn1=single(0);for m=2:1:nsn1=sn1+1/(m^2-1);endendfunction sn2=fromsmall(n) %从⼩到⼤计算sn2 format long;sn2=single(0);for m=n:-1:2sn2=sn2+1/(m^2-1);endendend运⾏结果:从⽽可以得到N值真值顺序值有效位数2 100.740050 从⼤到⼩0.740049 5从⼩到⼤0.740050 64 100.749900 从⼤到⼩0.749852 3从⼩到⼤0.749900 66 100.749999 从⼤到⼩0.749852 3从⼩到⼤0.749999 6(4)感想:通过本上机题,我明⽩了,从⼩到⼤计算数值的精确位数⽐较⾼⽽且与真值较为接近,⽽从⼤到⼩计算数值的精确位数⽐较低。
第一章第二题(1) 截断误差为104-时:k=1;n=0;m=0;x=0;e=1e-4;while k==1x1=x+(-1)^n/(2*n+1);if abs(x-x1)<ey=4*x1;m=n+1;break;endx=x1;k=1;n=n+1;endformat longy,my =3.141792613595791m =5001(2)截断误差为108-时:k=1;n=0;m=0;x=0;e=1e-8;while k==1x1=x+(-1)^n/(2*n+1);if abs(x-x1)<ey=4*x1;m=n+1;break;endx=x1;k=1;n=n+1;endformat longy,my =3.141592673590250m =50000001由以上计算可知,截断误差小于104-时,应取5001项求和,π=3.141792613595791;截断误差小于108-时,应取50000001项求和,π=3.141592673590250。
第二章第二题a=[0 -2 -2 -2 -2 -2 -2 -2];b=[2 5 5 5 5 5 5 5];c=[-2 -2 -2 -2 -2 -2 -2 0];v=220;r=27;d=[v/r 0 0 0 0 0 0 0];n=8;for i=2:na(i)=a(i)/b(i-1);b(i)=b(i)-c(n-1)*a(i);d(i)=d(i)-a(i)*d(i-1);end;d(n)=d(n)/b(n);for i=n-1:-1:1d(i)=(d(i)-c(i)*d(i+1));end;I=d'I =1.0e+002 *1.490717294184090.704617906351300.311568212434910.128623612390290.049496991380330.017168822994210.004772412363470.00047741598598第三章第一题(1)Jacobi迭代法:b=[12;-27;14;-17;12]x = [0;0;0;0;0;]k = 0;r = 1;e=0.000001A=[10,1,2,3,4;1,9,-1,2,-3;2,-1,7,3,-5;3,2,3,12,-1;4,-3,-5,-1,15;] D = diag(diag(A));B = inv(D)*(D-A);f = inv(D)*b;p = max(abs(eig(B)));if p >= 1'迭代法不收敛'returnendwhile r >ex0 = x;x = B*x0 + f;k = k + 1;r = norm (x-x0,inf);endxk计算结果:x =1.0000-2.00003.0000-2.00001.0000k =65(2) 高斯赛德尔迭代:A=[10,1,2,3,4;1,9,-1,2,-3;2,-1,7,3,-5;3,2,3,12,-1;4,-3,-5,-1,15;]x=[0;0;0;0;0];b=[12;-27;14;-17;12]c=0.000001L=-tril(A,-1)U=-triu(A,1)D=(diag(diag(A)))X=inv(D-L)*U*x+inv(D-L)*b;k=1;while norm(X-x,inf)>= cx=X;X=inv(D-L)*U*x+inv(D-L)*b;k=k+1;endXk计算结果:X =1.0000-2.00003.0000-2.00001.0000k =37(3) SOR:A=[10,1,2,3,4;1,9,-1,2,-3;2,-1,7,3,-5;3,2,3,12,-1;4,-3,-5,-1,15] x=[0;0;0;0;0];b=[12;-27;14;-17;12]e=0.000001w=1.44;L=-tril(A,-1)U=-triu(A,1)D=(diag(diag(A)))X=inv(D-w*L)*((1-w)*D+w*U)*x+w*inv(D-w*L)*bn=1;while norm(X-x,inf)>=ex=X;X=inv(D-w*L)*((1-w)*D+w*U)*x+w*inv(D-w*L)*b;n=n+1;endXn计算结果:X =1.0000-2.00003.0000-2.00001.0000n =22由以上可知,共轭梯度法收敛速度明显快于Jacobi法和G-S法。
数值分析上机题作业电器学院交通信息工程及控制罗宁20050290010110第一章源程序:REAL SS=1DO I=1,71S=S*29/IEND DOWRITE(*,*) "Y=",SEND结果:Y=79.5416第三章源程序:REAL X,Y,N,K,DX,NEWTON,NE,S,XKDIMENSION X(6),Y(6),NE(6,6),NEWTON(21)DATA X/0.2,0.24,0.28,0.32,0.36,0.4/DATA Y/0.1987,0.2377,0.2764,0.3146,0.3523,0.3894/!计算差商表:DX=0.04DO I=1,6NE(I,1)=Y(I)END DODO J=2,6DO I=J,6NE(I,J)=(NE(I,J-1)-NE(I-1,J-1))/(DX*(J-1))END DOEND DODO I=1,21XK=0.2+(I-1)*0.01NEWTON(I)=NE(1,1)S=1DO J=2,6S=S*(XK-X(J-1))NEWTON(I)=NEWTON(I)+S*NE(J,J)END DOEND DOWRITE(*,*) "NEWTON=",NEWTONEND结果:NEWTON=0.198700 0.208451 0.218209 0.227962 0.2377000.2474170.257108 0.266770 0.276400 0.285998 0.2955640.305097 0.3146000.324072 0.333513 0.342923 0.352300 0.3616420.370943 0.3801990.389400第四章源程序:REAL A,B,ANS,DDIMENSION A(4,4),B(4),ANS(4),D(4,5)DATA A/4197,6.8,88.6,1.45,305,71.3,76.4,5.9,-206,&&-47.4,-10.8,6.13,-840,52,802,36.5/DATA B/136,11.5,25.7,6.6/CALL LGAUS(A,B,4,D)CALL GAUSQ(D,4,ANS)WRITE(*,*) 'ANS=',ANSEND结果:ANS=3.226190E-02 0.322386 0.291290 -1.684955E-02第五章源程序:REAL A1,B1,A2,B2,E1,E2A1=0;A2=0B1=3.141592654/2;B2=1E1=0.000001;E2=0.001CALL SIMPB1(A1,B1,E1,S)WRITE(*,*) '第一题simpson:',SCALL SIMPB2(A2,B2,E1,S)WRITE(*,*) '第二题simpson:',SCALL ROMBERG1(A1,B1,E2,R)WRITE(*,*) '第一题ROMBERG',RCALL ROMBERG2(A2,B2,E2,R)WRITE(*,*) '第二题ROMBERG',RENDSUBROUTINE SIMPB1(A,B,E,S)F(X)=SIN(X)/XH=(B-A)/2S2=0;N=1S0=1+F(B)S1=F(A+H)S=(S0+4.0*S1)*H/3.060 N=2*N;H=H/2.0S2=S2+S1S1=0.0X=A+HDO I=1,NS1=S1+F(X)X=X+H+HEND DOS2N=(S0+2.0*S2+4.0*S1)*H/3.0IF(ABS(S2N-S)>E)THENS=S2NGOTO 60END IFEND SUBROUTINESUBROUTINE SIMPB2(A,B,E,S)F(X)=LOG(1+X)/XH=(B-A)/2S2=0;N=1S0=1+F(B)S1=F(A+H)S=(S0+4.0*S1)*H/3.060 N=2*N;H=H/2.0S2=S2+S1S1=0.0X=A+HDO I=1,NS1=S1+F(X)X=X+H+HEND DOS2N=(S0+2.0*S2+4.0*S1)*H/3.0IF(ABS(S2N-S)>E)THENS=S2NGOTO 60END IFEND SUBROUTINESUBROUTINE ROMBERG1(A,B,E,R)F(X)=SIN(X)/XREAL S,DS,TINTEGER K,UDIMENSION S(100,100)S(1,1)=(B-A)*(F(B)+1)/2K=1T=0100 K=K+1S(K,1)= 1/2*S((K-1),1)U=2**(K-2)-1DO J=0,UT=T+F(A+(2*J+1)*(B-A)/(2**(K-1)))END DOS(K,1)=S(K,1)+T*(B-A)/2**(K-1)DO J=2,KS((K-J+1),J)=(4**(J-1)*S((K-J+2),(J-1))+S((K-J+1),(J-1)))/&&(4**(J-1)-1)END DODS=S(1,K)-S(1,K-1)IF(ABS(DS).GT.E)THENR=S(1,K)ELSEGOTO 100END IFEND SUBROUTINESUBROUTINE ROMBERG2(A,B,E,R)F(X)=LOG(X+1)/XREAL S,DS,TINTEGER K,UDIMENSION S(100,100)S(1,1)=(B-A)*(F(B)+1)/2K=1T=0100 K=K+1S(K,1)= 1/2*S((K-1),1)U=2**(K-2)-1DO J=0,UT=T+F(A+(2*J+1)*(B-A)/(2**(K-1)))END DOS(K,1)=S(K,1)+T*(B-A)/2**(K-1)DO J=2,KS((K-J+1),J)=(4**(J-1)*S((K-J+2),(J-1))+S((K-J+1),(J-1)))/&&(4**(J-1)-1)END DODS=S(1,K)-S(1,K-1)IF(ABS(DS).GT.E)THENR=S(1,K)ELSEGOTO 100END IFEND SUBROUTINE结果:第一题simpson: 1.37076第二题simpson: 0.822467第一题ROMBERG 1.37128第二题ROMBERG 0.822811第六章第一题源程序:REAL X0,E,X1,X2,XXXX=1.55X0=1.5E=0.00005CALL SUPPO(X0,E,X1)WRITE(*,*) "X1=",X1CALL SUPPO1(X0,E,X2)WRITE(*,*) "X2=",X2CALL NTSP1(X0,XX,E,X4)WRITE(*,*) "X4=",X4CALL NTQX(X0,E,X3)WRITE(*,*) "X3=",X3END!简单迭代SUBROUTINE SUPPO(X0,E,X1)G(X)=1+1/x**2I=1X1=X0100 X2=X1X1=G(X1)I=I+1Y=X1-X2IF(ABS(Y)>E) THENGOTO 100ENDIFEND SUBROUTINE SUPPO!加速迭代SUBROUTINE SUPPO1(X0,E,X2) G(X)=1+1/X**2G1(X)=-2/X**3I=1X=X0200 X2=G(X)Q=G1(X2)X2=(X2+Q*X)/(1-Q)I=I+1Y=X2**3-X2**2-1X=X2IF(ABS(Y)>E) THENGOTO 200ENDIFEND SUBROUTINE SUPPO1!NEWTONSUBROUTINE NTQX(X0,E,X2)G(X)=X**3-X**2-1G1(X)=3*X**2-2*XX1=X0300 F=G(X1)F1=G1(X1)X2=X1-F/F1X1=X2I=I+1U=X2**3-X2**2-1IF(ABS(U)>E)THENGOTO 300END IFEND SUBROUTINE NTQXSUBROUTINE NTSP1(X0,XX,E,X4)G(X)=X**3-X**2-1I=1X1=XXF1=G(X0)400 F=G(X1)X4=X1-F*(X1-X0)/(F-F1)I=I+1Y=X4**3-X4**2-1X1=X4IF(ABS(Y)>E) THENGOTO 400END IFEND SUBROUTINE NTSP1结果:X1= 1.46556X2= 1.46558X3= 1.46667X4= 1.46557第二题源程序:REAL A,B,E,XDIMENSION A(3,3),B(3),X(3)DATA A/-8,1,1,1,-5,1,1,1,-4/DATA B/1,16,7/E=0.0001CALL YACOBI(A,B,3,E,X)WRITE(*,*) "方程的解为:",XCALL GAUSEI(A,B,3,E,X)WRITE(*,*) "方程的解为:",XENDSUBROUTINE YACOBI(A,B,N,E,X)REAL A,B,X,YDIMENSION A(N,N),B(N),X(N),Y(N)DO I=1,NX(I)=0END DO60 D=0DO I=1,NY(I)=B(I)DO J=1,NIF(I.NE.J)THENY(I)=Y(I)-A(I,J)*X(J)END IFEND DOY(I)=Y(I)/A(I,I)IF(ABS(X(I)-Y(I))>D)THEND=ABS(X(I)-Y(I))ENDIFEND DODO I=1,NX(I)=Y(I)ENDDOIF(D>E)THENGO TO 60END IFEND SUBROUTINE YACOBISUBROUTINE GAUSEI(A,B,N,E,X)DIMENSION A(N,N),B(N),X(N)DO I=1,NX(I)=0END DO100 D=0DO I=1,NY=B(I)DO J=1,NIF(I.NE.J) THENY=Y-A(I,J)*X(J)ENDIFEND DOY=Y/A(I,I)IF(ABS(X(I)-Y)>D)THEND=ABS(X(I)-Y)END IFX(I)=YEND DOIF(D>E)THENGOTO 100END IFEND SUBROUTINE GAUSEI结果:方程的解为:-0.999985 -3.99998 -2.99998 方程的解为:-0.999988 -3.99999 -2.99999第七章第一题源程序:REAL A,B,Y0,YY,Y,XINTEGER N1,N2,N3A=0.0;B=1.0Y0=1.0N1=10;N2=100;N3=1000CALL RKUTTA(A,B,N1,Y0,YY)WRITE(*,*) '步长为0.1,y(1)=',YYCALL RKUTTA(A,B,N2,Y0,YY)WRITE(*,*) '步长为0.01,y(1)=',YYCALL RKUTTA(A,B,N3,Y0,YY)WRITE(*,*) '步长为0.001,y(1)=',YYENDSUBROUTINE RKUTTA(A,B,M,Y0,YY)F(X,Y)=EXP(X)*Y**2-2*YREAL X0,A,B,Y0,YY,HHDIMENSION HH(5)X0=A;Y=Y0H=(B-A)/MHH(1)=H/2;HH(2)=HH(1);HH(3)=H;HH(4)=H;HH(5)=H/2DO I=1,MX1=X0;Y1=Y;YY=YDO J=1,4X=X1+HH(J)AA=F(X,Y)YY=YY+AA*HH(J+1)/3Y=Y1+AA*HH(J)END DOY=YYEND DOEND SUBROUTINE RKUTTA结果:步长为0.1,y(1)= 0.253325步长为0.01,y(1)= 0.239780步长为0.001,y(1)= 0.238542第二题源程序:REAL A,B,Y,YYINTEGER N,MDIMENSION Y(3),YY(3)DATA Y/1,-1,0/N=5/0.25A=0.0;B=5.0M=3CALL HRKUTTA(A,B,N,M,Y,YY)WRITE(*,*) '方程的解为:',YYENDSUBROUTINE HRKUTTA(A,B,N,M,Y,YY)REAL X0DIMENSION HH(5),Y(M),Y1(M),F(M),YY(M)X0=AH=(B-A)/NHH(1)=H/2;HH(2)=HH(1);HH(3)=H;HH(4)=H;HH(5)=H/2DO I=1,NX1=X0+(I-1)*HX=X1DO J=1,MY1(J)=Y(J);YY(J)=Y(J)END DODO K=1,4CALL FUN(X,Y,F)X=X1+HH(K)DO L=1,MYY(L)=YY(L)+F(L)*HH(K+1)/3Y(L)=Y1(L)+F(L)*HH(K)END DOEND DODO J=1,MY(J)=YY(J)END DOEND DOEND SUBROUTINE HRKUTTASUBROUTINE FUN(X,Y,F)REAL X,Y,FDIMENSION Y(3),F(3)F(1)=-Y(1)+2*Y(2)+6*Y(3)F(2)=-1*Y(2)+3*Y(3)+2*SIN(X)F(3)=-1*Y(3)+X**2*EXP(-1*X)+COS(X)END SUBROUTINE FUN结果:方程的解为:-1.42051 -1.67879 -6.023698E-02。
数值分析上机作业2实验一:(1) ①用不动点迭代法求()013=--=x x x f 的根,至少设计两种迭代格式,一个收敛一个发散,1210-=ε。
(2) ②对迭代格式使用Aitken 加速,观察敛散性变化。
1取递推公式31)1(+=x x ,可以得到收敛时的迭代结果为:x=(2)^(1/3); t=1; while(1)if(abs(x-(x+1)^(1/3))<10^-12) break; endx=(x+1)^(1/3);t=t+1;end t xtemp=x^3-x-1 %带回来验证下 t = 16 x =1.324717957243755 temp =-4.225952920933196e-12 加速后代码如下 x=1;x=(x*((x+1)^(1/3)+1)^(1/3)-(x+1)^(2/3))/(x-2*(x+1)^(1/3)+((x+1)^(1/3)+1)^(1/3)) t=1; while(1)if(abs(x-(x*((x+1)^(1/3)+1)^(1/3)-(x+1)^(2/3))/(x-2*(x+1)^(1/3)+((x+1)^(1/3)+1)^(1/3)))<10^-10) break; endx=(x*((x+1)^(1/3)+1)^(1/3)-(x+1)^(2/3))/(x-2*(x+1)^(1/3)+((x+1)^(1/3)+1)^(1/3)); t=t+1; if (t>100000)break; %防止运算次数过多 end endfprintf('需要%d 次',t);输出需要670次>>此处取10^10-=ε,若到10^-12次方则可能需要运行更多次取13-=x x 则迭代发散。
使用aitken 加速计算结果如下 x=2; t=1; while(1)if( abs(x-((x*((x^3-1)^3-1))-(x^3-1)^2)/(x-2*(x^3-1)+(x^3-1)^3-1))<10^-10) break; end t=t+1;x=((x*((x^3-1)^3-1))-(x^3-1)^2)/(x-2*(x^3-1)+(x^3-1)^3-1); if (t>100000)break; %防止运算次数过多 end end t xt = 108x = 1.324717956244172由此可见经过aitken 加速以后,原来发散的迭代格式收敛了。
数值分析上机实验报告选题:曲线拟合的最小二乘法指导老师:专业:学号:姓名:课题八 曲线拟合的最小二乘法一、问题提出从随机的数据中找出其规律性,给出其近似表达式的问题,在生产实践和科学实验中大量存在,通常利用数据的最小二乘法求得拟合曲线。
在某冶炼过程中,根据统计数据的含碳量与时间关系,试求含碳量y 与时间t 的拟合曲线。
二、要求1、用最小二乘法进行曲线拟合;2、近似解析表达式为()33221t a t a t a t ++=ϕ;3、打印出拟合函数()t ϕ,并打印出()j t ϕ与()j t y 的误差,12,,2,1Λ=j ;4、另外选取一个近似表达式,尝试拟合效果的比较;5、*绘制出曲线拟合图*。
三、目的和意义1、掌握曲线拟合的最小二乘法;2、最小二乘法亦可用于解超定线代数方程组;3、探索拟合函数的选择与拟合精度间的关系。
四、计算公式对于给定的测量数据(x i ,f i )(i=1,2,…,n ),设函数分布为 特别的,取)(x j ϕ为多项式j j x x =)(ϕ (j=0, 1,…,m )则根据最小二乘法原理,可以构造泛函令0=∂∂ka H (k=0, 1,…,m ) 则可以得到法方程求该解方程组,则可以得到解m a a a ,,,10Λ,因此可得到数据的最小二乘解曲线拟合:实际工作中,变量间未必都有线性关系,如服药后血药浓度与时间的关系;疾病疗效与疗程长短的关系;毒物剂量与致死率的关系等常呈曲线关系。
曲线拟合是指选择适当的曲线类型来拟合观测数据,并用拟合的曲线方程分析两变量间的关系。
五、结构程序设计在程序结构方面主要是按照顺序结构进行设计,在进行曲线的拟合时,为了进行比较,在程序设计中,直接调用了最小二乘法的拟合函数polyfit ,并且依次调用了plot 、figure 、hold on 函数进行图象的绘制,最后调用了一个绝对值函数abs 用于计算拟合函数与原有数据的误差,进行拟合效果的比较。
《数值分析》上机习题1.用Newton法求方程X7 - 28X4 + 14=0在(0.1,1.9)中的近似根(初始近似值取为区间端点,迭代6次或误差小于0.00001)。
#include<stdio.h>#include<math.h>int main(){ float x1,x,f1,f2;static int count=0;x1=0.1 ;//定义初始值do{x=x1;f1=x*(x*x*x*x*x*x-28*x*x*x)+14;f2=7*x*x*x*x*x*x-4*28*x*x*x;//对函数f1求导x1=x-f1/f2; count++; }while(fabs(x1-x)>=1e-5);printf("%8.7f\n",x1); printf("%d\n",count);return 0;}2.已知函数值如下表:试用三次样条插值求f(4.563)及f’(4.563)的近似值。
include <stdio.h>#include <math.h>#define N 11main(){double B[N+1][N+1],m,x,u[N+1],y[N+1],c[N+1],d[N+1];double e[N+1]={2,0,4.15888308,6.5916738,8.3177664,9.6566268,10.750557,11.675460 6,12.47667,13.1833476,13.8155106,14.0155106};int i;x=4.563;B[0][0]=-2;B[0][1]=-4;B[N][N-1]=4;B[N][N]=2;for(i=1;i<N;i++){B[i][i-1]=1;B[i][i]=4;B[i][i+1]=1;}u[0]=B[0][0];y[0]=e[0];for(i=1;i<N;i++){m=B[i][i-1]/u[i-1];u[i]=B[i][i]-m*B[i-1][i];y[i]=e[i]-m*y[i-1];}c[N]=y[N]/u[N];for(i=N-1;i>=0;i--)c[i]=(y[i]-B[i][i+1]*c[i+1])/u[i];for(i=0;i<12;i++){m=fabs(x-i);if(m>=2)d[i]=0;else if(m<=1)d[i]=0.5*fabs(pow(m,3))-m*m+2.0/3;elsed[i]=(-1.0/6.0)*fabs(pow(m,3))+m*m-2*fabs(m)+4/3.0;} m=0;for(i=0;i<12;i++) m=m+c[i]*d[i];printf("f(%4.3f)=%f\n",x,m);printf("f'(4.563)=%lf\n",(c[4]-c[2])/2); }3.用Romberg 算法求)00001.0(sin )75(32314.1=+⎰ε允许误差dx x x x x . #include "stdafx.h" #include<stdio.h> #include<math.h> float f(float x) {float f=0.0;f=pow(3.0,x)*pow(x,1.4)*(5*x+7)*sin(x*x); return (f); } main() {int i=1,j,k,n=12;float T[12],a=1.0,b=3.0,s=0.0; T[0]=0.5*(b-a)*(f(a)+f(b));for(j=1;j<n-1;j++){ for(k=1;k<=pow(2,j-1);k++) s+=f(a+(2*k-1)*(b-a)/pow(2,j)); T[j]=0.5*(T[j-1]+(b-a)*s/pow(2,j-1)); s=0.0; }T[11]=(4*T[1]-T[0])/(float)3;for(;fabs(T[11]-T[0])>0.00001;i++) {T[0]=T[11];for(j=1;j<n-1-i;j++) T[j]=(pow(4,i)*T[j+1]-T[j])/(pow(4,i)-1); T[11]=(pow(4,i+1)*T[1]-T[0])/(pow(4,i+1)-1); }printf("%f\n",T[11]); }4. 用定步长四阶Runge-Kutta 求解一、程序要求用定步长四阶法求解 y1’=1y2’=y3 y3’=1000-1000y2-100y3(y1(0)=y2(0)=y3(0)=0) h=0.0005,打印yi(0.025),yi(0.045),yi(0.085),yi(0.1),(i=1,2,3)h =0.0005,打印y i (0.025) ,⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧===--===0)0(0)0(0)0(10010001000//1/321323321y y y y y dt dy ydt dy dt dyy i(0.045) ,y i(0.085) ,y i(0.1) ,(i=1,2,3)#include "stdafx.h"#include <stdio.h>#include <math.h>double F(double x,double y[4],double f[4]){f[1]=0*x+0*y[1]+0*y[2]+0*y[3]+1;f[2]=0*x+0*y[1]+0*y[2]+1*y[3]+0;f[3]=0*x+0*y[1]-1000*y[2]-100*y[3]+1000;return(1);}void main(){double F(double x,double y[4],double f[4]);doubleh=0.0005,x=0,Y[4],k[5][4],s[4],f[4],det,m[4]={0.025,0.045,0.085,0.1};int i,j,t; for(t=0;t<=3;t++)/*龙格-库塔算法*/{for(j=0;j<=3;j++)Y[j]=0; //每求一组值后将初值条件还原为0 for(i=1;i<=int(m[t]/h);i++){for(j=1;j<=3;j++)s[j]=Y[j];det=F(x,s,f);for(j=1;j<=3;j++)k[1][j]=h*f[j]; /*四阶古典公式中的k值和求和的计算*/ for(j=1;j<=3;j++)s[j]=Y[j]+0.5*k[1][j];det=F(x+0.5*h,s,f);for(j=1;j<=3;j++)k[2][j]=h*f[j];for(j=1;j<=3;j++)s[j]=Y[j]+0.5*k[2][j];det=F(x+0.5*h,s,f);for(j=1;j<=3;j++)k[3][j]=h*f[j];for(j=1;j<=3;j++)s[j]=Y[j]+k[3][j];det=F(x+h,s,f);for(j=1;j<=3;j++)k[4][j]=h*f[j];for(j=1;j<=3;j++)Y[j]=Y[j]+(k[1][j]+2*k[2][j]+2*k[3][j]+k[4][j])/6;x+=h;} for(j=1;j<=3;j++)printf("y[%d](%f)=%f ",j,m[t],Y[j]); printf("\n"); } } 5.⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=40.00001 4.446782 2.213474- 0.238417 1.784317 0.037585- 1.010103- 3.123124 2.031743- 4.446782 30.719334 3.123789 1.103456- 2.121314 0.71828- 0.336993 1.112348 3.067813 2.213474- 3.123789 14.7138465 0.103458- 3.111223- 2.101023 1.056781- 0.784165- 1.7423820.238417 1.103456- 0.103458- 9.789365 0.431637 3.741856- 1.836742 1.563849 0.718719 1.7843172.1213143.111223- 0.431637 19.8979184.101011 2.031454 2.189736 0.113584-0.037585- 0.71828- 2.101023 3.741856- 4.101011 27.108437 3.123848 1.012345- 1.112336 1.010103- 0.336993 1.056781- 1.836742 2.031454 3.123848 15.567914 3.125432- 1.061074- 3.123124 1.112348 0.784165- 1.563849 2.189736 1.012345- 3.125432- 19.141823 2.115237 2.031743- 3.067813 1.742382 0.718719 0.113584- 1.112336 1.061074- 2.115237 12.38412A Tb )5.6784392- 4.719345 1.1101230 86.612343- 1.784317 0.84671695 25.173417- 33.992318 2.1874369(= 用列主元消去法求解Ax=b 。
数值分析上机作业姓名:唐皓学号:142460专业:道路与铁道工程院系:交通学院授课教师:吴宏伟日期:2015年1月习题一1 题目17.(上机题)舍入误差与有效数 设2211NN j S j ==-∑,其精确值为1311221N N ⎛⎫-- ⎪+⎝⎭。
(1)编制按从大到小的顺序22211121311N S N =+++---,计算N S 的通用程序; (2)编制按从小到大的顺序2221111(1)121N S N N =+++----,计算N S 的通用程序; (3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数。
(编制程序时用单精度);(4)通过本上机题你明白了什么?2 通用程序代码2.1 按从小到大的顺序计算N Svoid AscendSum(unsigned long int N)// 计算从大到小的总和 {for (unsigned long int j=2;j<=N;j++) ascendSum+=(float )1.0/(j*j-1);cout<<"Sum From 1 to N (Ascend) is: "<<ascendSum<<endl; Error(ascendSum); Delimiter();} 2.2 按从大到小的顺序计算N Svoid DescendSum(unsigned long int N)//计算从小到大的总和 {for (unsigned long int j=N;j>=2;j--) descendSum+=(float )1.0/(j*j-1);cout<<"Sum From N to 1 (Descend) is: "<<descendSum<<endl; Error(descendSum); Delimiter();}3计算结果展示图1 N=100时的计算结果图2 N=10000时的计算结果图3 N=1000000时的计算结果表1-1 计算结果汇总N S 精确值按从小到大按从大到小N S 值有效位数 N S 值有效位数210S 0.7400494814 0.7400494814 10 0.740049541 6 410S 0.7498999834 0.7498521209 4 0.7498999834 10 610S0.74999898670.75185602920.752992510824 计算结果分析(1)如果采用单精度数据结构进行计算,则相较于双精度的数据结果,由于数据存储字长的限制导致计算机存在较大的舍入误差,因此本程序采用的是双精度数据存储方式。
一、数值求解如下正方形域上的Poisson 方程边值问题 2222(,)1,0,1(0,)(1,)(1),01(,0)(,1)0,01u u f x y x y x y u y u y y y y u x u x x ⎧⎛⎫∂∂-+==<<⎪ ⎪∂∂⎪⎝⎭⎨==-≤≤⎪⎪==≤≤⎩二、用椭圆型第一边值问题的五点差分格式得到线性方程组为2,1,1,,1,10,1,,0,141,?,?,?,?0,1i j i j i j i j i j ijj N j i i N u u u u u h f i j N u u u u i j N -+-+++----=≤≤====≤≤+, 写成矩阵形式Au=f 。
其中1.三 、编写求解线性方程组Au=f 的算法程序, 用下列方法编程计算, 并比较计算速度。
2.用Jacobi 迭代法求解线性方程组Au=f 。
3.用块Jacobi 迭代法求解线性方程组Au=f 。
4. 用SOR 迭代法求解线性方程组Au=f,用试算法确定最佳松弛因子。
1122N N v b v b u f v b ⎛⎫⎛⎫ ⎪ ⎪ ⎪ ⎪== ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭4114114ii A -⎛⎫ ⎪- ⎪= ⎪- ⎪-⎝⎭11,12,1,121,22,2,21,2,,2211,12,1,121,22,2,221,2,,(,,...,),(,,...,),......,(,,...,)(,,...,)?,(,,...,)?,......,(,,...,)?1,999,0.10.011T T N N TN N N N N T T N N T N N N N N v u u u v u u u v u u u b h f f f b h f f f b h f f f h N h N ====+=+=+===+取或则或,1,,1,2,...,i j f i j N== 1122NN A I I A A I I A -⎛⎫ ⎪- ⎪= ⎪- ⎪-⎝⎭5.用块SOR 迭代法求解线性方程组Au=f,用试算法确定最佳松弛因子。
数值分析上机题答案【篇一:数值分析上机试题对应参考答案】么是近似值x* 有效数字?若近似值x*的误差限是某一位的半个单位,该位到x*的第一位非零数字共有n位,就说x*有n位有效数字。
它可表示为2、数值计算应该避免采用不稳定的算法,防止有效数字的损失. 因此,在进行数值运算算法设计过程中主要注意什么?(1)简化计算过程,减少运算次数;(2)避免两个相近的数相减;(3)避免除数的绝对值远小于被除数的绝对值;(4)防止大数“吃掉”小数的现象;(5)使用数值稳定的算法,设法控制误差的传播。
3、写出“n 阶阵a 具有n 个不相等的特征值”的等价条件(至少写3 个)(1)|a|不为零(2)n阶矩阵a的列或行向量组线性无关(3)矩阵a为满秩矩阵(4)n阶矩阵a与n阶可逆矩阵b等价4、迭代法的基本思想是什么?就是用某种极限过程去逐步逼近线性方程组精确解得方法。
其基本思想为:先任取一组近似解初值x0,然后按照某种迭代原则,由x0计算新的近似解x1,以此类推,可计算出x2,x3,…xk,。
,如果{x}收敛,则取为原方程组的解。
5、病态线性方程组的主要判断方法有哪些?(1)系数矩阵的某两行(列)几乎近似相关(2)系数矩阵的行列式的值很小(3)用主元消去法解线性方程组时出现小主元(4)近似解x*已使残差向量r=b-ax*的范数很小,但该近似解仍不符合问题要求。
6、lagrange 插值的前提条件是什么?并写出二次lagrange 插值的基函数。
1,j?i?(x)? 前提条件是:l i ,j?0,1,2?,n.?ij0,j?i?二次lagrange 插值的基函数: (x?x)(x?x)12??lx0(xx)(xx) 0?10?2 (x?x)(x?x)02?? lx1(xx)(xx)1?01?2(x?x)(x?x)01?? lx2(x?x)(x?x)20217、什么是数值积分的代数精度?如果某一个求积公式对于次数不超过m的多项式均能准确地成立,但对于m+1次多项式就不准确成立,则称该求积公式具有m次代数精度(或代数精确度)。
1.已知矩阵A=1078775658610975910⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦,B=2345644567036780028900010⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦,错误!未找到引用源。
=11/21/31/41/51/6 1/21/31/41/51/61/7 1/31/41/51/61/71/8 1/41/51/61/71/81/9 1/51/61/71/81/91/10 1/61/71/81/91/101/11⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦(1)用MATLAB函数“eig”求矩阵全部特征值。
(2)用基本QR算法求全部特征值(可用MA TLAB函数“qr”实现矩阵的QR分解)。
解:MATLAB程序如下:求矩阵A的特征值:clear;A=[10 7 8 7;7 5 6 5;8 6 10 9;7 5 9 10];E=eig(A)输出结果:求矩阵B的特征值:clear;B=[2 3 4 5 6;4 4 5 6 7;0 3 6 7 8;0 0 2 8 9;0 0 0 1 0];E=eig(B)输出结果:求矩阵错误!未找到引用源。
的特征值:clear;错误!未找到引用源。
=[1 1/2 1/3 1/4 1/5 1/6; 1/2 1/3 1/4 1/5 1/6 1/7; 1/3 1/4 1/5 1/6 1/7 1/8; 1/4 1/5 1/6 1/7 1/8 1/9;1/5 1/6 1/7 1/8 1/9 1/10; 1/6 1/7 1/8 1/9 1/10 1/11]; E=eig(错误!未找到引用源。
)输出结果:(2)A=1078775658610975910第一步:A0=hess(A);[Q0,R0]=qr(A0);A1=R0*Q0 返回得到:第二部:[Q1,R1]=qr(A1);A2=R1*Q1第三部:[Q2,R2]=qr(A2);A3=R2*Q2现在收缩,继续对A3的子矩阵错误!未找到引用源。
一. 上机作业任务一: 用五点差分格式求解Poisson 方程边值问题,P124-------3、4(任选一题)。
二. 上机作业任务二:用Simpson 求积法计算定积分()baf x dx ⎰。
下面两种方法任选一。
(1)变步长复化Simpson 求积法。
(2)自适应Simpson 求积法三. 上机作业任务三:用MATLAB 语言编写连续函数最佳平方逼近的算法程序(函数式M 文件)。
要求算法程序可以适应不同的具体函数,具有一定的通用性。
并用此程序进行数值试验,写出计算实习报告。
所编程序具有以下功能:1. 用Lengendre 多项式做基,并适合于构造任意次数的最佳平方逼近多项式。
可利用递推关系 0112()1,()()(21)()(1)()/2,3,.....n n n P x P x xP x n xP x n P x n n --===---⎡⎤⎣⎦=2. 被逼近函数f(x)用M 文件建立数学函数。
这样,此程序可通过修改建立数学函数的M 文件以适用不同的被逼近函数(要学会用函数句柄)。
3. 要考虑一般的情况]1,1[],[)(+-≠∈b a x f 。
因此,程序中要有变量代换的功能。
4. 计算组合系数时,计算函数的积分采用数值积分的方法。
5. 程序中应包括帮助文本和必要的注释语句。
另外,程序中也要有必要的反馈信息。
6. 程序输入:(1)待求的被逼近函数值的数据点0x (可以是一个数值或向量)(2)区间端点:a,b 。
7. 程序输出:(1)拟合系数:012,,,...,n c c c c(2)待求的被逼近函数值00001102200()()()()()n n s x c P x c P x c P x c P x =++++ 8. 试验函数:()cos ,[0,4]f x x x x =∈+;也可自选其它的试验函数。
9. 用所编程序直接进行计算,检测程序的正确性,并理解算法。
10. 分别求二次、三次、。
数值分析上机作业**:**学号:******专业:道路与铁道工程院系:交通学院****:***日期:2015年1月习题一1 题目17.(上机题)舍入误差与有效数 设2211NN j S j ==-∑,其精确值为1311221N N ⎛⎫-- ⎪+⎝⎭。
(1)编制按从大到小的顺序22211121311N S N =+++---,计算N S 的通用程序; (2)编制按从小到大的顺序2221111(1)121N S N N =+++----,计算N S 的通用程序; (3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数。
(编制程序时用单精度);(4)通过本上机题你明白了什么?2 通用程序代码2.1 按从小到大的顺序计算N Svoid AscendSum(unsigned long int N)// 计算从大到小的总和 {for (unsigned long int j=2;j<=N;j++) ascendSum+=(float )1.0/(j*j-1);cout<<"Sum From 1 to N (Ascend) is: "<<ascendSum<<endl; Error(ascendSum); Delimiter();} 2.2 按从大到小的顺序计算N Svoid DescendSum(unsigned long int N)//计算从小到大的总和 {for (unsigned long int j=N;j>=2;j--) descendSum+=(float )1.0/(j*j-1);cout<<"Sum From N to 1 (Descend) is: "<<descendSum<<endl; Error(descendSum); Delimiter();}3计算结果展示图1 N=100时的计算结果图2 N=10000时的计算结果图3 N=1000000时的计算结果表1-1 计算结果汇总N S精确值按从小到大按从大到小N S 值有效位数 N S 值有效位数210S 0.7400494814 0.7400494814 10 0.740049541 6 410S 0.7498999834 0.7498521209 4 0.7498999834 10 610S0.74999898670.75185602920.752992510824 计算结果分析(1)如果采用单精度数据结构进行计算,则相较于双精度的数据结果,由于数据存储字长的限制导致计算机存在较大的舍入误差,因此本程序采用的是双精度数据存储方式。
(2)由计算结果可知,正序计算和逆序计算的精度是不稳定的。
由计算结果可以发现,当N=100时,正序计算(1-N )的精度较高;当N=10000时,逆序计算(N-1)的精度较高;当N=1000000时,正序计算和逆序计算的精度一样。
当然,和其他同学做出来的结果对比,结论并不一致。
我个人分析这是因为电脑的硬件、软件(位数)不同等原因导致的。
但总体而言,在N 较小时,正序计算精度高于逆序计算的精度。
当N 较大时,正序和逆序计算的精度接近。
(3)由于计算机的实际计算过程是一种舍入机制,故对于我们计算所采用的加法交换律是不成立的。
计算机中若干数相加时,先要进行对阶操作,即将两数的阶数统一为绝对值较大的数的阶数。
这样一来将导致绝对值较小的数的有效数字可能会大量损失,增大舍入误差,即所谓的“大数吃小数”现象。
为了避免这种现象的出现,在进行加减法的时候应该先将绝对值较小的数相加,再与绝对值较大的数相加这样按阶逐步递增的相加。
5 完整代码#include <iostream> #include <iomanip> #include <math.h> using namespace std;float accurateSum=0,ascendSum=0,descendSum=0;void Delimiter()//输出一系列星号以间隔 {for (int i=1;i<=50;i++) cout<<"*";cout<<endl;}void Error(float Sum)//计算绝对误差{float error;error=fabs(Sum-accurateSum);int flag;for(flag=0;flag<10;flag++){error=error*10;if (error>0.5)break;}cout<<"There are "<<flag<<" Valid numbers."<<"\n";}void AccurateSum(unsigned long int N)//计算精确值{accurateSum=0.5*(1.5-(float)1/N-(float)1/(N+1));cout<<"Accurate sum is: "<<setprecision(10)<<accurateSum<<endl;Delimiter();}void AscendSum(unsigned long int N)//计算从大到小的总和{for(unsigned long int j=2;j<=N;j++)ascendSum+=(float)1.0/(j*j-1);cout<<"Sum From 1 to N (Ascend) is: "<<ascendSum<<endl;Error(ascendSum);Delimiter();}void DescendSum(unsigned long int N)//计算从小到大的总和{for(unsigned long int j=N;j>=2;j--)descendSum+=(float)1.0/(j*j-1);cout<<"Sum From N to 1 (Descend) is: "<<descendSum<<endl;Error(descendSum);Delimiter();}void main()//主程序{long int N;while(1){cout<<"Input an integer N (N>=2):";cin>>N;if (N<2)cout<<"Invalid input, Please try it again!\n";elsebreak;}AccurateSum(N);AscendSum(N);DescendSum(N);}习题二1 题目20.(上机题)Newton 迭代法(1)给定初值0x 及容许误差ε,编制Newton 法解方程()0f x =根的通用程序。
(2)给定方程3()/30f x x x =-=,易知其有三个根1x *=20x *=,3x *=。
①由Newton 方法的局部收敛性可知存在0δ>,当0(,)x δδ∈-时,Newton 迭代序列收敛于根2x *。
试确定尽可能大的δ。
②试取若干初始值,观察当0(,1)x ∈-∞-,(1,)δ--,(,)δδ-,(,1)δ,(1,)∞时Newton 序列是否收敛以及收敛于哪一个根。
(3) 通过本上机题,你明白了什么?2 通用程序代码2.1 Newton 法解方程通用程序double NewtonIteration(double x0,double eps)//Newton 迭代法求解子程序 {double x1,x2; x1=x0;x2=x1-f(x1)/df(x1);while (fabs(x1-x2)>=eps) {x1=x2;x2=x1-f(x1)/df(x1); }return x1; }2.2 求解尽可能大δdouble MaximalDeviateRange() //求解尽可能大的范围 {double step=1e-5; //step length int cnt=1; //step count double delta;cout<<"**********************Newton Iteration(eps=1e*5)**********************"<<endl;while(fabs(NewtonIteration(step*cnt,eps))<=eps){cnt++;}delta=step*cnt;cout<<"The maximal deviate range for x converging to x2*=0 is (-"<<delta<<","<<delta<<")"<<endl;return delta;}3计算结果展示图2-4 计算结果在取步长为10−5的情况下,允许误差eps=10−5时有x轴上的一个小区间 (−0.7746,0.7746)为Newton迭代序列在x2∗=0处的尽可能大的局部收敛区间。
当x0=(−∞,1),(−1,−δ),(−δ,δ),(δ,1),(1,∞)时牛顿迭代序列分别收敛于−1.732051,1.732051,0,−1.732051,1.732051。
4计算结果分析(1)通过本次上机编程并通过多次的调试,可以发现运行结果很好的验证了教材上牛顿迭代法具有局部收敛性这一重要性质。
(2)选择不同的初值区间,迭代序列会收敛于不同的根。
所以为了收敛到需要的计算结果,就需要选择合适的牛顿迭代法大范围收敛区间。
(3)产生上述结果的原因是所选取的部分区间不满足大范围收敛的条件,导致并没有收敛到理想的结果。
5完整代码#include<iostream>#include<iomanip>#include<math.h>using namespace std;double eps=1e-5;double f(double x)//函数f(x)的录入{return (x*x*x)/3-x;}double df(double x)//函数f(x)的导数{return (x*x)-1;}double NewtonIteration(double x0,double eps)//Newton迭代法求解子程序{double x1,x2;x1=x0;x2=x1-f(x1)/df(x1);while (fabs(x1-x2)>=eps){x1=x2;x2=x1-f(x1)/df(x1);}return x1;}double MaximalDeviateRange() //求解尽可能大的范围{double step=1e-5; //step lengthint cnt=1; //step countdouble delta;cout<<"**********************Newton Iteration(eps=1e*5)**********************"<<endl;while(fabs(NewtonIteration(step*cnt,eps))<=eps){cnt++;}delta=step*cnt;cout<<"The maximal deviate range for x converging to x2*=0 is (-"<<delta<<","<<delta<<")"<<endl;return delta;}void Calculate(double x0)//计算Newton迭代法和相应的子程序{printf("If x0=% 11.4f, x converges to the value of: % 8.6f\n",x0,NewtonIteration(x0,eps));}void main()//主程序{double delta=MaximalDeviateRange();Calculate(-10000);Calculate((-1-delta)/2);Calculate(-delta/2);Calculate(delta/2);Calculate((1+delta)/2);Calculate(10000);}习题三1 题目39.(上机题)列主元Guass 消去法对于某电路的分析,归结为求解线性方程组RI =V 。