数值分析上机第四次作业

合集下载

数值分析大作业三四五六七

数值分析大作业三四五六七

数值分析大作业三四五六七数值分析大作业三四五六七Document number【SA80SAB-SAA9SYT-SAATC-SA6UT-SA18】大作业三1. 给定初值0x 及容许误差,编制牛顿法解方程f (x )=0的通用程序. 解:Matlab 程序如下:函数m 文件:fu.mfunction Fu=fu(x)Fu=x^3/3-x;end函数m 文件:dfu.mfunction Fu=dfu(x)Fu=x^2-1;end用Newton 法求根的通用程序Newton.mclear;x0=input('请输入初值x0:');ep=input('请输入容许误差:');flag=1;while flag==1x1=x0-fu(x0)/dfu(x0);if abs(x1-x0)<ep< p="">flag=0;endx0=x1;endfprintf('方程的一个近似解为:%f\n',x0);寻找最大δ值的程序:Find.mcleareps=input('请输入搜索精度:');ep=input('请输入容许误差:');flag=1;k=0;x0=0;while flag==1sigma=k*eps;x0=sigma;k=k+1;m=0;flag1=1;while flag1==1 && m<=10^3x1=x0-fu(x0)/dfu(x0);if abs(x1-x0)endm=m+1;x0=x1;endif flag1==1||abs(x0)>=epflag=0;endendfprintf('最大的sigma 值为:%f\n',sigma);2.求下列方程的非零根5130.6651()ln 05130.665114000.0918x x f x x +??=-= ?-解:Matlab 程序为:(1)主程序clearclcformat longx0=765;N=100;errorlim=10^(-5);x=x0-f(x0)/subs(df(),x0);n=1;while n<n< p="">x=x0-f(x0)/subs(df(),x0);if abs(x-x0)>errorlimn=n+1;elsebreak;endx0=x;enddisp(['迭代次数: n=',num2str(n)])disp(['所求非零根: 正根x1=',num2str(x),' 负根x2=',num2str(-x)])(2)子函数非线性函数ffunction y=f(x)y=log((513+0.6651*x)/(513-0.6651*x))-x/(1400*0.0918);end(3)子函数非线性函数的一阶导数dffunction y=df()syms x1y=log((513+0.6651*x1)/(513-0.6651*x1))-x1/(1400*0.0918);y=diff(y);end运行结果如下:迭代次数: n=5所求非零根: 正根x1=767.3861 负根x2=-767.3861大作业四试编写MATLAB 函数实现Newton 插值,要求能输出插值多项式. 对函数21()14f x x=+在区间[-5,5]上实现10次多项式插值.分析:(1)输出插值多项式。

数值分析上机作业(四)

数值分析上机作业(四)

数值分析上机作业(四)常微分方程数值解一、问题描述考虑以下问题2000()999.75()1000.25()()du u t v t dtdv u t v t dt=−++=−初始条件为(0)0,(0)2u v ==−。

其精确解为0.52000.50.52000.5() 1.4998750.4998751() 2.999750.000251t t t t u t e e v t e e −−−−=−++=−−+请分别用古典四级四阶显式Runge-Kutta 方法和隐式二级四阶Runge-Kutta 方法计算,计算区间取成[0,20],并与精确解比较。

二、方法描述2.1古典四级四阶显式Runge-Kutta 方法考虑一阶常微分方程的初值问题000'(,),[,]()y f x y x x b y x y =∈=(1)经典四级四阶Runge-Kutta 方法的计算公式为112341213243(22)6(,)(,)22(,)22(,)n n n n n n n n n n h y y K K K K K f x y h h K f x y K h h K f x y K K f x h y hK +=++++==++=++=++四阶Runge-Kutta 方法的每一步需要计算四次函数值f ,可以证明其阶段误差为5()O h 。

再考虑一阶常微分方程组的初值问题0000'(,(),())'(,(),())()()x f t x t y t y g t x t y t x t x y t y ====(2)四阶Runge-Kutta 公式为1123411234(22)6(22)6n n n n h x x f f f f h y y g g g g ++=++++=++++其中11211211322322433433(,,)(,,)(,,)222(,,)222(,,)222(,,)222(,,)(,,)n n n n n n n n n n n n n n n n n n n n n n n n f f t x y g g t x y h h h f f t x f y g h h h g g t x f y g h h h f f t x f y g h h h g g t x f y g f f t h x hf y hg g g t h x hf y hg ===+++=+++=+++=+++=+++=+++2.2隐式二级四阶Runge-Kutta 方法考虑一阶常微分方程的初值问题(1),其计算公式为112112212()2111((,()244111((,()244m m m m m m h y y K K K f x h y hK hK K f x h y hK hK +=++=+++=++++再考虑一阶常微分方程组的初值问题(2),其计算公式为112112()2()2n n n n h x x f f h y y g g ++=++=++112121121221212211111((,(,()2444411111((,(,()2444411111((,(,()2444411((,(24m m m m m m m m m m m f f t h x hf hf y hg hg g g t h x hf hf y hg hg f f t h x hf hf y hg hg g g t h x hf =+++++−=+++++−=++++++=+++1212111,()444m hf y hg hg +++三、方案设计3.1给定函数将给定的初值问题写成通用形式,即编写函数将这个函数保存为f.m。

数值分析上机作业

数值分析上机作业

第一章第二题(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法。

数值分析上机作业

数值分析上机作业

第一章(1)按从大到小的顺序计算S的程序为:N#include<stdio.h>void main(){float n,j,s=0;printf("请输入n:");scanf("%f",&n);for(j=2;j<=n;j++)s=s+1/(j*j-1);printf("s=%f\n",s);}(2)按从小到大的顺序计算S的程序为:N#include<stdio.h>void main(){float n,j,s=0;printf("请输入n:");scanf("%f",&n);for(j=n;j>=2;j--)s=s+1/(j*j-1);printf("s=%f\n",s);}(3)精确值,从大到小,从小到大的计算程序为:#include<stdio.h>void main(){float n,j,s1,s2=0,s3=0;printf("请输入n:");scanf("%f",&n);s1=(3.0/2-1/n-1/(n+1))/2;for(j=2;j<=n;j++)s2=s2+1/(j*j-1);for(j=n;j>=2;j--)s3=s3+1/(j*j-1);printf("精确算法的结果为:%f\n",s1);printf("从大到小顺序的结果为:%f\n",s2); printf("从小到大顺序的结果为:%f\n",s3); }结果如下:精确值从大到小的值从小到大的值有效位数从大到小从小到大210S0.740049 0.740049 0.74005 6 5410S0.7499 0.749852 0.7499 4 4610S0.749999 0.749852 0.749999 3 6(4)通过本上机题,我们可以看出:当n较小时,两种算法的结果都很接近精确值,而当n较大时,两种算法的结果差别较大,按从大到小的顺序计算的值与精确值有较大的误差,而按从小到大的顺序计算的值与精确值吻合。

数值分析上机第四次作业

数值分析上机第四次作业

数值分析上机第四次作业实验项目:共轭梯度法求解对称正定的线性方程组实验内容:用共轭梯度法求解下面方程组(1) 123421003131020141100155x x x x -⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪--- ⎪ ⎪ ⎪= ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪-⎝⎭⎝⎭⎝⎭ 迭代20次或满足()(1)1110k k x x --∞-<时停止计算。

(2) Ax b =,A 是1000阶的Hilbert 矩阵或如下的三对角矩阵,A[i,i]=4,A[i,i-1]=A[i-1,i]=-1,i=2,3,..,nb[1]=3, b[n]=3, b[i]=2,i=2,3,…,n-1迭代10000次或满足()()710k k r b Ax -=-≤时停止计算。

(3)*考虑模型问题,方程为222222(),(,)(0,1)(0,1)(0,)1,(1,),01(,0)1,(,1),01xy y x u u x y e x y D x yu y u y e y u x u x e x ∂∂+=+∈=⨯∂∂==≤≤==≤≤用正方形网格离散化,若取1/,10h N N ==,得到100n =的线性方程组,并用共轭梯度法(CG 法)求解,并对解作图。

实验要求:迭代初值可以取01(,1,...,)ij u i j N ==,计算到32||||10k r -≤停止.本题有精确解(,)xy u x y e =,这里k u 表示以k ij u 为分量的向量,u 表示在相应点(,)i j 上取值作为分量的向量.实验一:(1)编制函数子程序CGmethod 。

function [x,k]=CGmethod(A,b)n=length(A);x=zeros(n,1);r=b-A*x;rho=r'*r;k=0;while rho>10^(-12) & k<20k=k+1;if k==1p=r;elsebeta=rho/rho1;p=r+beta*p;endw=A*p;alpha=rho/(p'*w);x=x+alpha*p;r=r-alpha*w;rho1=rho;rho=r'*r;end编制主程序shiyan1_1:clear,clcA=[2,-1,0,0;-1,3,-1,0;0,-1,4,1;0,0,-1,5]; b=[3,-2,1,5]';[x,k]=CGmethod(A,b)运行结果为:x =1.3882-0.2855-0.02220.9367k =20(2)编制函数子程序CGmethod_1function [x,k]=CGmethod_1(A,b)n=length(A);x(1:n,1)=0;r=b-A*x;r1=r;k=0;while norm(r1,1)>=10^(-7)&k<10^4k=k+1;if k==1p=r;elsebeta=(r1'*r1)/(r'*r);p=r1+beta*p;endr=r1;w=A*p;alpha=(r'*r)/(p'*w);x=x+alpha*p;r1=r-alpha*w;end编制主程序shiyan1_2:clear,clcn=1000;A=hilb(n);b=sum(A')';[x,k]=CGmethod_1(A,b)运行结果为:x 的值,均接近1,迭代次数k=32实验二实验目的:用复化Simpson 方法、自适应复化梯形方法和Romberg 方法求数值积分。

东南大学数值分析上机

东南大学数值分析上机

第一章一、题目设∑=-=Nj N j S 2211,其精确值为)11123(21+--N N 。

(1)编制按从大到小的顺序11131121222-+⋯⋯+-+-=N S N ,计算SN 的通用程序。

(2)编制按从小到大的顺序1211)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); endSn2=single(0); %从大到小的顺序 for a=2:N; Sn2=Sn2+1/((N-a+2)^2-1); endfprintf('Sn 的值 (N=%d)\n',N);disp('____________________________________________________') fprintf('精确值 %f\n',AccurateValue); fprintf('从大到小计算的结果 %f\n',Sn1); fprintf('从小到大计算的结果 %f\n',Sn2);disp('____________________________________________________')三、结果请输入N(N>1):100Sn的值(N=100)____________________________________________________精确值0.740049从大到小计算的结果0.740049从小到大计算的结果0.740050____________________________________________________请输入N(N>1):10000Sn的值(N=10000)____________________________________________________精确值0.749900从大到小计算的结果0.749852从小到大计算的结果0.749900____________________________________________________请输入N(N>1):1000000Sn的值(N=1000000)____________________________________________________精确值0.749999从大到小计算的结果0.749852从小到大计算的结果0.749999____________________________________________________四、结果分析可以得出,算法对误差的传播又一定的影响,在计算时选一种好的算法可以使结果更为精确。

数值分析上机作业

数值分析上机作业

数值分析上机作业(1、2、3、4、6章)第一章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)通过本上机题你明白了什么?运行结果:按从大到小的顺序计算得:N N S误差e有效位数2⨯8 100.7400495 94.95049501392230710-4⨯ 4 100.7498521 54.79049995000258010-6⨯ 3 100.7498521 41.46900000499994310-按从小到大的顺序计算得:N N S误差e有效位数2⨯84.95049501392230710-100.7400495 944.99950003618465610-⨯8 100.7499000 965.00044450291170510-⨯11 100.7499990 13(4)通过本题可以看出,不同算法造成的误差是不同的,好的算法可以让计算结果精度更高。

对于本题,当采用从大到小的顺序累加计算时,计算误差随着N的增大而增大;当采用从小到大的顺序累加计算时,计算误差随着N的增大而减小。

因此在N比较大时宜采用从小到达的顺序累加计算。

第二章20.Newton 迭代法(1)给定初值0x 及容许误差ε,编制Newton 法解方程()0f x =根的通用程序;(2)给定方程3()03x f x x =-=,易知其有三个根*1x =,*20x =,*3x =①由Newton 方法的局部收敛性可知存在0δ>,当0(,)x δδ∈-时Newton 迭代序列收敛于根*2x ,试确定尽可能大的δ;②试取若干初始值,观察当0(,1)x ∈-∞-,(1,)δ--,(,)δδ-,(,1)δ,(1,)+∞时Newton 序列是否收敛以及收敛于哪一个根;(3)通过本上机题,你明白了什么?本实验取610ε-=,找到的最大的0.774597δ=②当0(,1)x ∈-∞-时,计算结果如下:x0 xend -1000 -1.732051 -500 -1.732051 -100 -1.732051 -10 -1.732051 -1.5-1.732051Newton 序列收敛于-1.732051当0(1,)xδ∈--时,计算结果如下:x0 xend-0.95 1.732051-0.90 1.732051-0.85 1.732051-0.80 -1.732051-0.78 -1.732051 Newton序列收敛于1.732051或-1.732051当0(,)xδδ∈-时,计算结果如下:x0 xend-0.77 0.000000-0.5 0.000000-0.1 0.0000000.3 0.0000000.77 0.000000 Newton序列收敛于0当0(,1)xδ∈时,计算结果如下:x0 xend0.78 1.7320510.80 1.7320510.85 -1.7320510.90 -1.7320510.95 -1.732051 Newton序列收敛于1.732051或-1.732051当0(1,)x∈+∞时,计算结果如下:x0 xend1.5 1.73205110 1.732051100 1.732051500 1.7320511000 1.732051Newton序列收敛于1.732051(3)通过本题发现,Newton迭代法解方程初始值的选取非常重要,不同的初始值会收敛于方程不同的根,且有些区间是全局收敛,有些区间是局部收敛。

《数值分析》上机习题

《数值分析》上机习题

《数值分析》上机习题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 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析上机第四次作业实验项目:共轭梯度法求解对称正定的线性方程组实验内容:用共轭梯度法求解下面方程组(1) 123421003131020141100155x x x x -⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪--- ⎪ ⎪ ⎪= ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪-⎝⎭⎝⎭⎝⎭ 迭代20次或满足()(1)1110k k x x --∞-<时停止计算。

(2) Ax b =,A 是1000阶的Hilbert 矩阵或如下的三对角矩阵,A[i,i]=4,A[i,i-1]=A[i-1,i]=-1,i=2,3,..,nb[1]=3, b[n]=3, b[i]=2,i=2,3,…,n-1迭代10000次或满足()()710k k r b Ax -=-≤时停止计算。

(3)*考虑模型问题,方程为 222222(),(,)(0,1)(0,1)(0,)1,(1,),01(,0)1,(,1),01xy y x u u x y e x y D x yu y u y e y u x u x e x ∂∂+=+∈=⨯∂∂==≤≤==≤≤用正方形网格离散化,若取1/,10h N N ==,得到100n =的线性方程组,并用共轭梯度法(CG 法)求解,并对解作图。

实验要求:迭代初值可以取01(,1,...,)ij u i j N ==,计算到32||||10k r -≤停止.本题有精确解(,)xy u x y e =,这里k u 表示以k ij u 为分量的向量,u 表示在相应点(,)i j 上取值作为分量的向量.实验一:(1)编制函数子程序CGmethod 。

function [x,k]=CGmethod(A,b)n=length(A);x=zeros(n,1);r=b-A*x;rho=r'*r;k=0;while rho>10^(-12) & k<20k=k+1;if k==1p=r;elsebeta=rho/rho1;p=r+beta*p;endw=A*p;alpha=rho/(p'*w);x=x+alpha*p;r=r-alpha*w;rho1=rho;rho=r'*r;end编制主程序shiyan1_1:clear,clcA=[2,-1,0,0;-1,3,-1,0;0,-1,4,1;0,0,-1,5]; b=[3,-2,1,5]';[x,k]=CGmethod(A,b)运行结果为:x =k =20(2)编制函数子程序CGmethod_1function [x,k]=CGmethod_1(A,b)n=length(A);x(1:n,1)=0;r=b-A*x;r1=r;k=0;while norm(r1,1)>=10^(-7)&k<10^4k=k+1;if k==1p=r;elsebeta=(r1'*r1)/(r'*r);p=r1+beta*p;endr=r1;w=A*p;alpha=(r'*r)/(p'*w);x=x+alpha*p;r1=r-alpha*w;end编制主程序shiyan1_2:clear,clcn=1000;A=hilb(n);b=sum(A')';[x,k]=CGmethod_1(A,b)运行结果为:x 的值,均接近1,迭代次数k=32实验二实验目的:用复化Simpson 方法、自适应复化梯形方法和Romberg 方法求数值积分。

实验内容:计算下列定积分 (1) dx x x x ⎰⎪⎪⎭⎫ ⎝⎛+-202610 (2)⎰10dx x x (3) ⎰20051dx x 实验要求:(1)分别用复化Simpson 公式、自适应复化梯形公式计算要求绝对误差限为71021-⨯=ε,输出每种方法所需的节点数和积分近似值,对于自适应方法,显示实际计算节点上离散函数值的分布图;(2)分析比较计算结果。

2、实验目的:高斯数值积分方法用于积分方程求解。

实验内容:线性的积分方程的数值求解,可以被转化为线性代数方程组的求解问题。

而线性代数方程组所含未知数的个数,与用来离散积分的数值方法的节点个数相同。

在节点数相同的前提下,高斯数值积分方法有较高的代数精度,用它通常会得到较好的结果。

对第二类Fredholm 积分方程b t a t f ds s y s t k t y ba ≤≤+=⎰),()(),()( 首先将积分区间[a,b]等分成n 份,在每个子区间上离散方程中的积分就得到线性代数方程组。

实验要求:分别使用如下方法,离散积分方程中的积分1.复化梯形方法;2.复化辛甫森方法;3.复化高斯方法。

求解如下的积分方程t t e ds s y e e t y --=⎰10)(12)(,方程的准确解为t e , 并比较各算法的优劣。

实验二1、复化Simpson 方法)输入积分区间下限0输入积分区间上限2输入等分份数20输入被积函数(以x 为自变量)x^6/10-x^2+xS =输入积分区间下限0输入积分区间上限1输入等分份数20输入被积函数(以x为自变量)x*sqrt(x)S =输入积分区间下限5输入积分区间上限200输入等分份数20输入被积函数(以x为自变量)1/sqrt(x)S =2、自动变步长Simpson方法函数1:输入积分区间下限0输入积分区间上限2输入为课本的第几个函数(第一个这输入1):1S =(过程省略)i =19函数2:输入积分区间下限0输入积分区间上限1输入为课本的第几个函数(第一个这输入1):2S =(过程省略)i =17函数3:输入积分区间下限5输入积分区间上限200输入为课本的第几个函数(第一个这输入1):3S=(过程省略)i =111编制程序如下:Clear,clcsyms xa=input('输入积分区间下限');b=input('输入积分区间上限');n=input('输入等分份数');ff=input('输入被积函数(以x为自变量)');h=(b-a)/n;f=inline(ff,'x');sum1=0;for i=0:n-1sum1=sum1+f(a+i*h+*h);endfor i=1:n-1sum2=sum2+f(a+i*h);endfor i=0:2*nX(i+1,1)=f((b-a)*i/(n*2)+a); endS=h/6*(f(a)+4*sum1+2*sum2+f(b))function S = zdsps( n )a=0;b=1;h=(b-a)/4;f=inline('x^(3/2)','x');sum1=0;sum2=0;for i=0:n-1sum1=sum1+f(a+i*h+*h);endfor i=1:n-1sum2=sum2+f(a+i*h);endfor i=0:2*nx(i+1,1)=f((b-a)*i/(n*2)+a); endS=h/6*(f(a)+4*sum1+2*sum2+f(b)); endfunction S = zpsgs(a,b,n,ff )h=(b-a)/n;sum1=0;sum2=0;sum3=0;sum4=0;if ff==1f=inline('x^6/10-x^2+x','x'); endif ff==2f=inline('x^(3/2)','x');endif ff==3f=inline('1/sqrt(x)','x');for i=0:n-1sum1=sum1+f(a+i*h+*h);sum2=sum2+f(a+i*h+*h);sum4=sum4+f(a+i*h+*h);endfor i=1:n-1sum3=sum3+f(a+i*h);endfor i=0:4*nx(i+1,1)=f((b-a)*i/(n*4)+a);endS=h/(6*2)*(f(a)+4*sum1+4*sum2+2*(sum3+sum4)+f(b));endclear , clca=input('输入积分区间下限');b=input('输入积分区间上限');ff=input('输入为课本的第几个函数(第一个这输入1):');for i=2:300S(i)=zpsgs(a,b,(i),ff);S(i+1)=zpsgs(a,b,(i+1),ff);if abs(S(i+1)-S(i))<*10^(-7)breakendendS %所求积分值i %所分份数实验三1、对常微分方程初值问题2cos (0)1y y x y '=-+⎧⎨=⎩(0)x π<< 分别使用Euler 显示方法、改进的Euler 方法和经典RK 法和四阶Adams 预测-校正算法,求解常微分方程数值解,并与其精确解cos sin y x x =+进行作图比较。

其中多步法需要的初值由经典RK 法提供。

2、实验目的:Lorenz 问题与混沌实验内容:考虑着名的Lorenz 方程⎪⎪⎪⎩⎪⎪⎪⎨⎧-=--=-=)1.8()(bz xy dtdz xz y rx dtdy x y s dt dx其中s, r, b 为变化区域有一定限制的实参数。

该方程形式简单,表面上看并无惊人之处,但由该方程揭示出的许多现象,促使“混沌”成为数学研究的崭新领域,在实际应用中也产生了巨大的影响。

实验方法:先取定初值Y0=(x, y, z)=(0, 0, 0),参数s=10, r=28, b=8/3,用MATLAB 编程数值求解,并与MATLAB 函数ods45的计算结果进行对比。

实验要求:(1)对目前取定的参数值s, r 和b ,选取不同的初值Y0进行运算,观察计算的结果有什么特点?解的曲线是否有界?解的曲线是不是周期的或趋于某个固定点?(2)在问题允许的范围内适当改变其中的参数值s, r, b ,再选取不同的初始值Y0进行试算,观察并记录计算的结果有什么特点?是否发现什么不同的现象?3、定义函数子程序为:function z=f(x,y)z=-y+2*cos(x);return主程序为:clear,clcb=pi;a=0;n=100;y(1)=1;h=(b-a)/n;x=a:h:b;for i=1:ny(i+1)=y(i)+h*f(x(i),y(i));endt1=plot(x,y,'r-')hold onfor i=1:nK1=f(x(i),y(i));K2=f(x(i+1),y(i)+h*K1);y(i+1)=y(i)+h*(K1+K2)/2;endt2=plot(x,y,'b+')for i=1:nK1=f(x(i),y(i));K2=f(x(i)+*h,y(i)+*h*K1);K3=f(x(i)+*h,y(i)+*h*K2);K4=f(x(i),y(i)+h*K3);y(i+1)=y(i)+h*(K1+2*K2+2*K3+K4)/6;endt3=plot(x,y,'ko')for i=1:3K1=f(x(i),y(i));K2=f(x(i)+*h,y(i)+*h*K1);K3=f(x(i)+*h,y(i)+*h*K2);K4=f(x(i),y(i)+h*K3);y(i+1)=y(i)+h*(K1+2*K2+2*K3+K4)/6;endfor i=4:nz=y(i)+h/24*(55*f(x(i),y(i))-59*f(x(i-1),y(i-1))...+37*f(x(i-2),y(i-2))-9*f(x(i-3),y(i-3)));y(i+1)=y(i)+h/24*(9*f(x(i+1),z)+19*f(x(i),y(i))...-5*f(x(i-1),y(i-1))+f(x(i-2),y(i-2)));endt4=plot(x,y,'g*')t5=ezplot('sin(x)+cos(x)',[0,pi])xlabel('x轴','FontWeight','bold')ylabel('y轴', 'FontWeight','bold')legend([t1,t2,t3,t4,t5],'向前Euler法','?改进的Euler法','经典四阶Runge-Kutta法','四阶Adams公式','精确解')原图为:局部放大图为:由图可得:四阶Adams公式及改进的欧拉法将为精确。

相关文档
最新文档