1、 数值实验题一 班级:研开发 14-1 班 姓名:马高强 学号: 2014212090 4.用有限差分方法(五点差分格式)求解正方形域上的 Poisson 方程边值问题 2222 ,3 0 , 10 , 1 , 0 , x , 0 x , 1 1uu f x yxy xyu y u y u u x x 用 MATLAB 语言编写求解线性方程组 Au f 的算法程序,采用下列方法计算,比较计算结果和算法性能,对计算结果给出结论。 ( 1)用 SOR 迭代法求解线性方程组 Au f , 用试算法确定最佳松弛因子 。 ( 2)用块 SOR 迭代法求解线性方程组 Au f , 用试算法确定最佳松弛因子
2、 。 ( 3)用(预条件)共轭斜向量法求解线性方程组 Au f 。 解:首先,剖分求解区域。用平行于坐标轴的直线 1, , , 0 , 1 , , , 11ijx x i h y y j h h i j n nn 然后 用数值微分公式对微分算子进行离散 。 211 222211 2, 2 , , 2 , ,i j i j i jiji j i j i jiju x y u x y u x yux y hxhu x y u x y u x yux y hyh 既有 21 , , 1 ,222, 1 , , 1222,2,i j i j i jiji j i j i jiju u uu xyxhu
3、 u uu xyyh 其中 ,iju 表示 ,iju x y的近似值 。 得到在每个点 ,ijxy上的有限差分方程为 : 2, 1 , 1 , , 1 , 14 = 1 ,i j i j i j i j i j iju u u u u h f i j n 又称为五点差分格式 .其中 =,ij i jf f x y。 在边界上有 0 , + 1 , , 0 , 1= 0 , = 1 1 1 1 ,j n j i i nu u u u i h i h i j n 可得差分格式为 : 2, 1 , 1 , , 1 , 10 , + 1 , , 0 , 14= 1,= 0 , = 1 1 1i j i
4、 j i j i j i j ijj n j i i nu u u u u h f i j nu u u u i h i h 将差分方程组写成矩阵形式为 Au f , 其中 ,n n n n nnA R u f R 。 如果把每一条线上的网格点看作一个组 , 如 1 1 , 1 2 , 1 n , 1 2 1 , 2 2 , 2 n , 2 1 , n 2 , n n , n2 2 21 1 , 1 2 , 1 n , 1 2 1 , 2 2 , 2 n , 2 1 , n 2 , n n , n, , , , , , , , , , , , , , , , , , , , , , ,T T
5、TnT T Tnv u u u v u u u v u u ub h f f f b h f f f b h f f f 对矩阵也相应地分块 1 1 1 12 2 2 2,n n n nA I v bI A v bA v bII A v b 其中 114114 ,114nniiA A R则差分方程等价于 Av b 。 这样就可以用块迭代法进行求解 。 ( 1)用 SOR 迭代法求解线性方程组 Au f , 用试算法确定最佳松弛因子 。 SOR 迭代法: function u,k,t=SOR(n,w) %用 SOR迭代法求解 Poisson方程 %输出结果 : u, k, t 输入 : n, w
6、 h=1/(n+1); f(2:n+1,2:n+1)=3*h2;%定义右端项 u=zeros(n+2,n+2); %对边界进行差分 for i=1:n+2 u(i,1)=(i-1)*h*(1-(i-1)*h); u(i,n+2)=(i-1)*h*(1-(i-1)*h); end e=0.000000001; tic%程序开始的时间 %SOR迭代法过程 for k=1:10000 er=0; for i=2:n+1 for j=2:n+1 ub=u(i,j); u(i,j)=w*(u(i-1,j)+u(i+1,j)+u(i,j+1)+u(i,j-1)+f(i,j)/4)+(1-w)*u(i,j)
7、; er=er+abs(ub-u(i,j); end end if er/n2 goodw,goodk=Bestw(9) goodw = 1.5330 goodk = 33 u,k,t=SOR(9,goodw) k = 33 t = 2.3291e-004 u 的结果如下表 : 将 u 画成三维图 surf(u) ( 2)用块 SOR 迭代法求解线性方程组 Au f , 用试算法确定最佳松弛因子 。 块 SOR 迭代法: function u,k,t=BSOR(n,w) %用块 SOR求解 Poisson问题 ,其中用到追赶法 %输出结果 : u, k, t 输入 : n, w h=1/(n+
8、1); f(2:n+1,2:n+1)=3*h2; u=zeros(n+2,n+2); a=-1*ones(1,n);b=4*ones(1,n);c=-1*ones(1,n); for i=1:n+2%对边界条件进行差分 u(i,1)=(i-1)*h*(1-(i-1)*h); u(i,n+2)=(i-1)*h*(1-(i-1)*h); end tic;%块 SOR迭代法过程 e=0.000000001; for k=1:1000 er=0; for j=2:n+1 ub=u(:,j); d=f(2:n+1,j)+u(2:n+1,j-1)+u(2:n+1,j+1); x=zg(a,b,c,d);%
9、调用追赶法求解 for i=1:n u(i+1,j)=w*x(i)+(1-w)*u(i+1,j); end er=er+norm(ub-u(:,j),1); end if er/n2 goodw,goodk=BBestw(9) goodw = 1.4200 goodk = 25 u,k,t=BSOR(9,goodw) k = 25 t = 0.0156 u 的结果如下表 : 将 u 画成三维图 surf(u) ( 3)用(预条件)共轭斜向量法求解线性方程组 Au f 。 共轭斜量法: function u,k,t=CG(n) %共轭 斜量法求解 Poisson问题 A=zeros(n2,n2)
10、; for i=1:n2%系数 A(i,i)=4; if i+n u,k,t=CG(9) k = 13 t = 0.0019 u 的结果如下表 : 将 u 画成三维图 surf(u) 将三个程序结果进行比较: 对于同一问题 , SOR 迭代方法迭代次数为 33 次,迭代时间为 0.00219s;块 SOR 迭代方法迭代次数为 25 次,迭代时间为 0.0156s;共轭斜量法迭代次数为 13 次,迭代时间为: 0.0019s,由于在计算迭代时间时 SOR 方法和块 SOR 方法没有算上求解最佳松弛因子的时间,所以用迭代次数作为评价三种方法好坏的标准,显然 ,共轭斜量 法优于块 SOR 迭代法,块 SOR 迭代方法优于 SOR 迭代方法,即 CGBSORSOR。