function [u,x,y] = poisson(f,g,bx0,bxf,by0,byf,D,Mx,My,tol,MaxIter)x0 = D(1); xf = D(2); y0 = D(3); yf = D(4);dx = (xf - x0)/Mx; x = x0 + [0:Mx]*dx;dy = (yf - y0)/My; y = y0 + [0:My]'*dy;Mx1 = Mx + 1; My1 = My + 1;%Boundary conditions
for m = 1:My1, u(m,[1 Mx1])=[bx0(y(m)) bxf(y(m))]; end %left/right side
for n = 1:Mx1, u([1 My1],n) = [by0(x(n)); byf(x(n))]; end %bottom/top
%initialize as the average of boundary values
sum_of_bv = sum(sum([u(2:My,[1 Mx1]) u([1 My1],2:Mx)']));u(2:My,2:Mx) = sum_of_bv/(2*(Mx + My - 2));for i = 1:Myfor j = 1:MxF(i,j) = f(x(j),y(i)); G(i,j) = g(x(j),y(i));endenddx2 = dx*dx; dy2 = dy*dy; dxy2 = 2*(dx2 + dy2);rx = dx2/dxy2; ry = dy2/dxy2; rxy = rx*dy2;for itr = 1:MaxIterfor j = 2:Mxfor i = 2:Myu(i,j) = ry*(u(i,j + 1)+u(i,j - 1)) + rx*(u(i + 1,j)+u(i - 1,j)) + rxy*(G(i,j)*u(i,j)- F(i,j)); endendif itr > 1 & max(max(abs(u - u0))) < tol, break; endu0 = u;end%solve_poisson
f = inline('0','x','y'); g = inline( '0','x','y');x0 = 0; xf = 4; Mx = 20; y0 = 0; yf = 4; My = 20;bx0 = inline( 'exp(y) - cos(y)','y'); bxf = inline( 'exp(y)*cos(4) - exp(4)*cos(y)','y'); by0 = inline( 'cos(x) - exp(x)','x'); byf = inline( 'exp(4)*cos(x) - exp(x)*cos(4)','x');D = [x0 xf y0 yf]; MaxIter = 500; tol = 1e-4;[U,x,y] = poisson(f,g,bx0,bxf,by0,byf,D,Mx,My,tol,MaxIter);clf, mesh(x,y,U), axis([0 4 0 4 -100 100])
MATLAB: Can this be arranged to run
can this be arranged for me to run
Best Answer