1实验一实验项目:共轭梯度法求解对称正定的线性方程组实验内容:用共轭梯度法求解下面方程组(1)123421003131020141100155xxxx迭代20次或满足()(1)1110kkxx时停止计算。编制程序:储存m文件function[x,k]=CGmethod(A,b)n=length(A);x=2*ones(n,1);r=b-A*x;rho=r'*r;k=0;whilerho10^(-11)&k1000k=k+1;ifk==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运行程序:clear,clcA=[2-100;-13-10;0-14-1;00-15];b=[3-215]';[x,k]=CGmethod(A,b)运行结果:x=1.5058823529411760.0117647058823530.5294117647058821.105882352941177(2)Axb,A是1000阶的Hilbert矩阵或如下的三对角矩阵,2A[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次或满足()()710kkrbAx时停止计算。编制程序:储存m文件function[x,k]=CGmethod_1(A,b)n=length(A);x(1:n,1)=0;r=b-A*x;r1=r;k=0;whilenorm(r1,1)10^(-7)&k10^4k=k+1;ifk==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运行程序:clear,clcn=1000;A=hilb(n);b=sum(A')';[x,k]=CGmethod(A,b)实验二1、实验目的:用复化Simpson方法、自适应复化梯形方法和Romberg方法求数值积分。实验内容:计算下列定积分(1)dxxxx202610(2)10dxxx(3)20051dxx实验要求:(1)分别用复化Simpson公式、自适应复化梯形公式计算要求绝对误差限为71021,输出每种方法所需的节点数和积分近似值,对于自适应方法,显示实际计算节点上离散函数值的分布图;(2)分析比较计算结果。程序:symsxf=x^6/10-x^2+x%定义函数f(x)n=input('输入所求导数阶数:')f2=diff(f,x,n)%求f(x)的n阶导数(1)复化梯形3clcclearsymsx%定义自变量xf=inline('x^6/10-x^2+x','x')%定义函数f(x)=x*exp(x),换函数时只需换该函数表达式即可f2=inline('3*x^4-2','x')%定义f(x)的二阶导数,输入程序1里求出的f2即可。f3='-(3*x^4-2)'%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,以便求最大值e=0.5*10^(-7)%精度要求值a=0%积分下限b=2%积分上限x1=fminbnd(f3,1,2)%求负的二阶导数的最小值点,也就是求二阶导数的最大值点对应的x值forn=2:1000000%求等分数nRn=-(b-a)/12*((b-a)/n)^2*f2(x1)%计算余项ifabs(Rn)e%用余项进行判断break%符合要求时结束endendh=(b-a)/n%求hTn1=0fork=1:n-1%求连加和xk=a+k*hTn1=Tn1+f(xk)endTn=h/2*((f(a)+2*Tn1+f(b)))z=exp(2)R=Tn-z%求已知值与计算值的差stem(xk,Tn1);fprintf('用复化梯形算法计算的结果Tn=')disp(Tn)fprintf('等分数n=')disp(n)%输出等分数fprintf('已知值与计算值的误差R=')disp(R)(2)复化Simpsonclcclearsymsx%定义自变量xf=inline('x^6/10-x^2+x','x')%定义函数f(x)=x*exp(x),换函数时只需换该函数表达式即可f2=inline('36*x^2','x')%定义f(x)的四阶导数,输入程序1里求出的f2即可f3='-(36*x^2)'%因fminbnd()函数求的是表达式的最小值,且要求表达式带引号,故取负号,一边求最大值e=5*10^(-8)%精度要求值a=0%积分下限b=2%积分上限x1=fminbnd(f3,1,2)%求负的四阶导数的最小值点,也就是求四阶导数的最大值点对应的x值forn=2:1000000%求等分数n4Rn=-(b-a)/180*((b-a)/(2*n))^4*f2(x1)%计算余项ifabs(Rn)e%用余项进行判断break%符合要求时结束endendh=(b-a)/n%求hSn1=0Sn2=0fork=0:n-1%求两组连加和xk=a+k*hxk1=xk+h/2Sn1=Sn1+f(xk1)Sn2=Sn2+f(xk)endSn=h/6*(f(a)+4*Sn1+2*(Sn2-f(a))+f(b))%因Sn2多加了k=0时的值,故减去f(a)z=exp(2)R=Sn-z%求已知值与计算值的差fprintf('用Simpson公式计算的结果Sn=')disp(Sn)fprintf('等分数n=')disp(n)fprintf('已知值与计算值的误差R=')disp(R)结果:dxxxx202610用复化梯形算法计算的结果Tn=1.161904770166674等分数n=24764已知值与计算值的误差R=-6.227151328763976用Simpson公式计算的结果Sn=1.161904777890434等分数n=76已知值与计算值的误差R=-6.22715132104021610dxxx用复化梯形算法计算的结果Tn=0.400000099218985等分数n=1119已知值与计算值的误差R=-6.9890559997116655用Simpson公式计算的结果Sn=0.400013713469406等分数n=8已知值与计算值的误差R=-6.98904238546124520051dxx用复化梯形算法计算的结果Tn=23.812135292602353等分数n=1000000已知值与计算值的误差R=16.423079193671704用Simpson公式计算的结果Sn=23.812135292462617等分数n=10647已知值与计算值的误差R=16.423079193531969分析:在处理问题时,复化Simpson要比复化梯度计算速度要快很多。2、实验目的:高斯数值积分方法用于积分方程求解。实验内容:线性的积分方程的数值求解,可以被转化为线性代数方程组的求解问题。而线性代数方程组所含未知数的个数,与用来离散积分的数值方法的节点个数相同。在节点数相同的前提下,高斯数值积分方法有较高的代数精度,用它通常会得到较好的结果。对第二类Fredholm积分方程btatfdssystktyba),()(),()(首先将积分区间[a,b]等分成n份,在每个子区间上离散方程中的积分就得到线性代数方程组。实验要求:分别使用如下方法,离散积分方程中的积分1.复化梯形方法;2.复化辛甫森方法;3.复化高斯方法。求解如下的积分方程ttedssyeety10)(12)(,方程的准确解为te,并比较各算法的优劣。程序结果:当迭代次数n=1时精确解1.00001.28401.64872.11702.7183复化梯形方法0.85911.10321.41651.81882.3354复化辛甫森方法0.99931.28321.64762.11562.7165复化高斯方法1.00041.28461.64952.11802.7195复化梯形方法的平均误差err=0.247复化辛甫森方法的平均误差err=0.00116复化高斯方法的平均误差err=0.0008当迭代次数n=5时,6精确解1.00001.28401.64872.11702.7183复化梯形方法0.99341.27551.63782.10302.7003复化辛甫森方法1.00001.28401.64872.11702.7183复化高斯方法1.00001.28401.64872.11702.7183复化梯形方法的平均误差err=0.00116复化辛甫森方法和复化高斯方法的平均误差err=0可以看出,复化高斯方法得到的结果精度最高,复化辛普森方法比复化梯形方法的精度要高,程序:clear,clca=0;b=1;n=5;figurefun1(a,b,n);holdona=0;b=1;n=5;figurefun2(a,b,n);holdonfigurefun3(a,b,n);编制m函数:functiony=Kfun(t,s)y=2/(exp(1)-1)*exp(t);functiony=ffun(t)y=-exp(t);functiony=Fexc(t)%精确解y=exp(t);function[x,w]=fhgauss(a,b,n)h=(b-a)/n;x1=a:h:b;x=zeros(1,2*n);w=x;fori=1:n[x(2*i-1:2*i),w(2*i-1:2*i)]=GaussLegendre(x1(i),x1(i+1),2);endfunction[x,w]=fhsimpson(a,b,n)h=(b-a)/n;x=a:h/2:b;w=x;w(1)=h/6;7w(2*n+1)=h/6;fori=1:nw(2*i)=2/3*h;ifinw(2*i+1)=h/3;endendfunction[x,w]=fhtrapz(a,b,n)h=(b-a)/n;x=a:h:b;fori=1:n+1ifi==1||i==n+1w(i)=h/2;elsew(i)=h;endendfunction[x,w]=GaussLegendre(a,b,n)i=1:n-1;c=i./sqrt(4*i.^2-1);CM=diag(c,1)+diag(c,-1);[VL]=eig(CM);[xind]=sort(diag(L));V=V(:,ind)';w=2*V(:,1).^2;x=x*(b-a)/2+(b+a)/2;w=w*(b-a)/2;functionfun1(a,b,n)[x1,w1]=fhtrapz(a,b,n);n1=4;n=n+1;h=(b-a)/n1;x=a:h:b;y0=Fexc(x);A=zeros(n,n);B=zeros(n,1);fori=1:nB(i)=ffun(x1(i));endfori=1:nforj=1:nA(i,j)=w1(j)*Kfun(x1(i),x1(j));end8endA=eye(n)-A;y1=(A\B)';yN=x;fori=1:n1+1yN(i)=ffun(x(i));forj=1:nyN(i)=yN(i)+w1(j)*Kfun(x(i),x1(j))*y1(j);endendfprintf('数值解:\n')yNfprintf('精确解:\n')y0plot(x,yN,'x',x,y0,'.');h=legend('复化值','真实值');functionfun2(a,b,n)[x1,w1]=fhsimpson(a,b,n);n=2*n+1;n1=50;h=(b-a)/n1;x=a:h:b;y0=Fexc(x)