Page 458 - Applied Numerical Methods Using MATLAB
P. 458

PROBLEMS   447

             function [u,x,y] = poisson_Neuman(f,g,bx0,bxf,by0,byf,x0,xf,y0,yf,...)
             .. .. .. .. .. .. .. ..
             Neum = zeros(1,4); %Not Neumann, but Dirichlet condition by default
             if length(x0) > 1, Neum(1) = x0(2); x0 = x0(1); end
             if length(xf) > 1, Neum(2) = xf(2); xf = xf(1); end
             if length(y0) > 1, Neum(3) = y0(2); y0 = y0(1); end
             if length(yf) > 1, Neum(4) = yf(2); yf = yf(1); end
             .. .. .. .. .. .. .. ..
             dx_2 = dx*dx; dy_2 = dy*dy;  dxy2=2*(dx_2 + dy_2);
             rx = dx_2/dxy2; ry = dy_2/dxy2; rxy = rx*dy_2; rx = rx;
             dx2 = dx*2; dy2 = dy*2; rydx = ry*dx2; rxdy = rx*dy2;
             u(1:My1,1:Mx1) = zeros(My1,Mx1);

             sum_of_bv = 0; num = 0;
             if Neum(1) == 0 %Dirichlet boundary condition
             for m = 1:My1, u(m,1) = bx0(y(m)); end %side a
             else %Neumann boundary condition
              for m = 1:My1, duxa(m) = bx0(y(m)); end %du/dx(x0,y)
             end
             if Neum(2) == 0 %Dirichlet boundary condition
              .. .. .. .. .. .. .. .. .. .. ..
             end
             if Neum(3) == 0 %Dirichlet boundary condition
              n1 = 1; nM1 = Mx1;
              if Neum(1) == 0, u(1,1)=(u(1,1) + by0(x(1)))/2; n1 = 2; end
              if Neum(2) == 0, u(1,Mx1)=(u(1,Mx1) + by0(x(Mx1)))/2; nM1 = Mx; end
              for n = n1:nM1, u(1,n) = by0(x(n)); end %side c
             else %Neumann boundary condition
              for n = 1:Mx1, duyc(n) = by0(x(n)); end %du/dy(x,y0)
             end
             if Neum(4) == 0 %Dirichlet boundary condition
              .. .. .. .. .. .. .. .. .. .. ..
             end
             for itr = 1:imax
              if Neum(1) %Neumann boundary condition
                for i = 2:My
                  u(i,1) = 2*ry*u(i,2) + rx*(u(i + 1,1) + u(i-1,1)) ...
                             + rxy*(G(i,1)*u(i,1) - F(i,1)) - rydx*duxa(i); %(9.1.9)
                end
                if Neum(3), u(1,1) = 2*(ry*u(1,2) +rx*u(2,1)) ...
                 + rxy*(G(1,1)*u(1,1) - F(1,1)) - rydx*duxa(1) - rxdy*duyc(1);%(9.1.11)
                end
                if Neum(4), u(My1,1) = 2*(ry*u(My1,2) +rx*u(My,1)) ...
                 + rxy*(G(My1,1)*u(My1,1)- F(My1,1))+rxdy*duyd(1)- rydx*duxa(My1);
                end
              end
              if Neum(2) %Neumann boundary condition
              .. .. .. .. .. .. .. .. .. .. .. .. ..
              end
              if Neum(3) %Neumann boundary condition
                for j = 2:Mx
                  u(1,j) = 2*rx*u(2,j)+ry*(u(1,j+1) + u(1,j-1)) ...
                            +rxy*(G(1,j)*u(1,j) - F(1,j)) - rxdy*duyc(j); %(9.1.10)
                end
              end
              if Neum(4) %Neumann boundary condition
               .. .. .. .. .. .. .. .. .. .. .. .. ..
              end
              .. .. .. .. .. .. .. .. .. .. .. .. ..
             end
   453   454   455   456   457   458   459   460   461   462   463