Solving Laplace's equation on [0, 1] × [0, 1] where the boundary value is defined by a function f(x, y) may be done as follows:
N :=32: # the number of intervals
f := (x, y) -> sin(4.0*x*y):
# assign the boundary values on [0, 1] x [0, 1]
for i from 0 to N do
du[i,0] := f(i/N, 0);
du[0,i] := f(0, i/N);
du[i,N] := f(i/N, 1);
du[N,i] := f(1, i/N);
end do:
M := Matrix( (N - 1)*(N - 1), (N - 1)*(N - 1), datatype=float[8] ):
b := Vector( (N - 1)*(N - 1), datatype=float[8] ):
for i from 1 to N - 1 do
for j from 1 to N - 1 do
posn := (N - 1)*(i - 1) + j;
M[posn, posn] := -4;
for k from -1 to 1 by 2 do
if assigned( du[i + k, j] ) then
b[posn] := b[posn] - du[i + k, j];
else
M[posn, posn + (N - 1)*k] := 1;
end if;
end do;
for k from -1 to 1 by 2 do
if assigned( du[i, j + k] ) then
b[posn] := b[posn] - du[i, j + k];
else
M[posn, posn + k] := 1;
end if;
end do;
end do;
end do:
u := LinearAlgebra:-LinearSolve( M, b ): # solve the system of linear equations
# plot the result
plots[display](
plots[pointplot3d](
[seq( seq( [i/N, j/N, u[(i - 1)*(N - 1) + j]], i = 1..N - 1 ), j = 1..N - 1 )],
symbol = circle, color = black
),
# the boundary values
plots[spacecurve]( [0, t, f(0, t)], t = 0..1, thickness = 2, colour = red ),
plots[spacecurve]( [t, 0, f(t, 0)], t = 0..1, thickness = 2, colour = red ),
plots[spacecurve]( [1, t, f(1, t)], t = 0..1, thickness = 2, colour = red ),
plots[spacecurve]( [t, 1, f(t, 1)], t = 0..1, thickness = 2, colour = red ),
axes = framed
);
Copyright ©2005 by Douglas Wilhelm Harder. All rights reserved.


