Example 5.8

Iterative Solution of an Elliptic Equation

Contents

Setup

close all;

N = 20;  % points in the each direction

x0 = -1;
xN = 1;
y0 = -1;
yN = 1;

dx = (xN-x0)/N;
dy = (yN-y0)/N;

x = linspace(x0,xN,N+1);
y = linspace(y0,yN,N+1);

[X Y] = meshgrid(x,y);

Q = 2*(2-X.^2 - Y.^2);
Qint = Q(2:N,2:N);  % obtain interior
q = Qint(:);        % transform into a vector

Direct Solve

construct system. See Applied Numerical Linear Algebra by James Demmel footnote on page 275

TN = gallery('tridiag',N-1,-1,2,-1);
TNxN = kron(speye(N-1),TN) + kron(TN,eye(N-1));
tic
pd = (1/(dx^2)*TNxN)\q;
toc
Pd = zeros(N+1,N+1);
Pd(2:N,2:N) = reshape(pd,N-1,N-1);
Elapsed time is 0.000690 seconds.

True solution

Pd = (X.^2-1).*(Y.^2-1);

tol = 1e-4;

Point Jacobi

Pj = zeros(N+1,N+1);   % initial guess
Pnew = zeros(N+1,N+1); % extra storage
err = max(max(abs(Pd(2:N,2:N)-Pj(2:N,2:N))./Pd(2:N,2:N)));
iter = 0;

while ( err > tol )
    iter = iter + 1;
    for j = 2:N
        for i = 2:N
            Pnew(i,j) = (Pj(i+1,j)+Pj(i-1,j)+Pj(i,j+1)+Pj(i,j-1))/4 + dx^2/4*Q(i,j);
        end
    end
    Pj = Pnew;
    err = max(max(abs(Pd-Pj)))/max(max(abs(Pd)));
    Ej(iter) = err;
end

pj_iter = iter
pj_iter =

   749

Gauss-Seidel

Pgs = zeros(N+1,N+1);   % initial guess
err = max(max(abs(Pd(2:N,2:N)-Pgs(2:N,2:N))./Pd(2:N,2:N)));
iter = 0;

while ( err > tol )
    iter = iter + 1;
    for j = 2:N
        for i = 2:N
            Pgs(i,j) = (Pgs(i+1,j)+Pgs(i-1,j)+Pgs(i,j+1)+Pgs(i,j-1))/4 + dx^2/4*Q(i,j);
        end
    end
    err = max(max(abs(Pd-Pgs)))/max(max(abs(Pd)));
    Egs(iter) = err;
end

pgs_iter = iter
pgs_iter =

   375

SOR

Psor = zeros(N+1,N+1);   % initial guess
Pold = zeros(N+1,N+1);   % old solution
omega = 1.8; % SOR parameter
err = max(max(abs(Pd(2:N,2:N)-Psor(2:N,2:N))./Pd(2:N,2:N)));
iter = 0;

while ( err > tol )
    iter = iter + 1;
    for j = 2:N
        for i = 2:N
            Psor(i,j) = omega*((Psor(i+1,j)+Psor(i-1,j)+Psor(i,j+1)+Psor(i,j-1))/4 + dx^2/4*Q(i,j))+(1-omega)*Psor(i,j);
        end
    end
    err = max(max(abs(Pd-Psor)))/max(max(abs(Pd)));
    Esor(iter) = err;
end

psor_iter = iter
psor_iter =

    45