您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 两点边值问题的不同迭代法比较及matlab实现
两点边值问题的不同迭代法比较及matlab实现问题:考虑两点边值问题:.1)1(,0)0(10,22yyaadxdydxyd容易知道它的精确解为:axeeayx)1(11/1为了将微分方程离散,把[0,1]区间n等分,令h=1/n,1,...2,1,niihxi,得到差分方程211)2()(ahyyhyhiii,从而得到迭代方程组的系数矩阵A。对=1,a=1/2,n=100,分别用jacobi,G-S,超松弛迭代法分别求线性方程组的解,要求4位有效数字,然后比较与精确解的误差。对=0.1,=0.01,=0.001,考虑同样问题。思想:利用书上的迭代公式即可。注意问题:迭代矩阵是n-1阶的,不是n阶;等号右端向量b的最后一项,不是ah^2,而是ah^2-eps-h精确解:axeeayx)1(11/1带入a=1/2,=1代码:clearx=linspace(0,1);truy=(1-0.5)/(1-exp(-1/1))*(1-exp(-x./1))+x.*0.5;figure;plot(x,truy,'g','LineWidth',1.5);holdon;Grid图:三种方法的实现Jacobi法:代码见附录Eps=1结果:迭代次数k:22273结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)Eps=0.1结果:迭代次数k:8753结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)Eps=0.01结果:迭代次数k:661结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)G-S迭代法:代码见附录Eps=1结果:迭代次数k:11125结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)Eps=0.1结果:迭代次数k:4394结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)Eps=0.01结果:迭代次数k:379结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)超松弛法:代码见附录Eps=1w=1.56结果:迭代次数k:3503结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)Eps=0.1w=1.56结果:迭代次数k:1369结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)Eps=0.01w=1.56结果:迭代次数k:131结果与精确解的比较图(绿色粗线是精确解,黑色细线是迭代结果)结果:Jacobi、G-S、超松弛法,三者都能够取得对精确解的良好逼近,但是,在相同的精度条件下,三者的收敛速度是不一样的,jacobiG-S超松弛,也就是说,在迭代次数相同的条件下,精度:jacobiG-S超松弛。代码附录:Jacobi:function[y,k]=jacobi2(a,eps,h,delta)n=1.0/h;A=ones(n-1);y=zeros(n-1,1);z=zeros(n-1,1);k=0;fori=1:n-1forj=1:n-1A(i,j)=0;endendfori=1:n-1A(i,i)=-(2*eps+h);endfori=1:n-1forj=1:n-1ifi==j+1A(i,j)=eps;endifi==j-1A(i,j)=eps+h;endendendb=zeros(n-1,1);fori=1:n-2b(i,1)=a*h^2;endb(n-1,1)=a*h^2-eps-h;D=zeros(n-1);fori=1:n-1D(i,i)=A(i,i);endL=zeros(n-1);fori=1:n-1forj=1:n-1ifijL(i,j)=-A(i,j);endendendU=zeros(n-1);fori=1:n-1forj=1:n-1ifijU(i,j)=-A(i,j);endendendB=D\(L+U);g=D\b;while1z=B*y+g;ifnorm(z-y,inf)deltabreak;endy=z;k=k+1;endx=linspace(0,1);truy=(1-a)/(1-exp(-1/eps))*(1-exp(-x./eps))+x.*a;figure;plot(100*x,truy,'g','LineWidth',5);holdon;gridholdon;plot(y,'b')G-S:function[y,k]=gs2(a,eps,h,delta)n=1.0/h;A=ones(n-1);y=zeros(n-1,1);z=zeros(n-1,1);k=0;fori=1:n-1forj=1:n-1A(i,j)=0;endendfori=1:n-1A(i,i)=-(2*eps+h);endfori=1:n-1forj=1:n-1ifi==j+1A(i,j)=eps;endifi==j-1A(i,j)=eps+h;endendendb=zeros(n-1,1);fori=1:n-2b(i,1)=a*h^2;endb(n-1,1)=a*h^2-eps-h;D=zeros(n-1);fori=1:n-1D(i,i)=A(i,i);endL=zeros(n-1);fori=1:n-1forj=1:n-1ifijL(i,j)=-A(i,j);endendendU=zeros(n-1);fori=1:n-1forj=1:n-1ifijU(i,j)=-A(i,j);endendendB=D\(L+U);g=D\b;while1z=(D-L)\U*y+(D-L)\b;ifnorm(z-y,inf)deltabreak;endy=z;k=k+1;endx=linspace(0,1);truy=(1-a)/(1-exp(-1/eps))*(1-exp(-x./eps))+x.*a;figure;plot(100*x,truy,'g','LineWidth',5);holdon;gridholdon;plot(y,'b')超松弛:function[y,k]=sor(a,eps,h,delta,w)n=1.0/h;A=ones(n-1);y=zeros(n-1,1);z=zeros(n-1,1);k=0;fori=1:n-1forj=1:n-1A(i,j)=0;endendfori=1:n-1A(i,i)=-(2*eps+h);endfori=1:n-1forj=1:n-1ifi==j+1A(i,j)=eps;endifi==j-1A(i,j)=eps+h;endendendb=zeros(n-1,1);fori=1:n-2b(i,1)=a*h^2;endb(n-1,1)=a*h^2-eps-h;D=zeros(n-1);fori=1:n-1D(i,i)=A(i,i);endL=zeros(n-1);fori=1:n-1forj=1:n-1ifijL(i,j)=-A(i,j);endendendU=zeros(n-1);fori=1:n-1forj=1:n-1ifijU(i,j)=-A(i,j);endendendB=D\(L+U);g=D\b;Lw=((D-w*L)^-1)*((1-w)*D+w*U);while1z=Lw*y+w*(D-w*L)^-1*b;ifnorm(z-y,inf)deltabreak;endy=z;k=k+1;endx=linspace(0,1);truy=(1-a)/(1-exp(-1/eps))*(1-exp(-x./eps))+x.*a;figure;plot(100*x,truy,'g','LineWidth',5);holdon;gridholdon;plot(y,'b')
本文标题:两点边值问题的不同迭代法比较及matlab实现
链接地址:https://www.777doc.com/doc-7885159 .html