This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/CLPQR/clpqr/examples/monash/laplace
vsc e5f4633c39 This commit was generated by cvs2svn to compensate for changes in r4,
which included commits to RCS files with non-trunk default branches.


git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
2001-04-09 19:54:03 +00:00

90 lines
2.6 KiB
Plaintext

/*
**********************************************************************
*
* CLP(R) Version 2.0 (Example Programs Release)
* (C) Copyright, March 1986, Monash University
*
**********************************************************************
*/
%
% Solve the Dirichlet problem for Laplace's equation using
% Leibman's five-point finit-differenc approximation. The goal
% ?- go1 is a normal example, while the goal ?- go2
% shows output constraints for a small region where the boundary conditions
% are not specified.
%
laplace([H1,H2,H3|T]):-
laplace_vec(H1,H2,H3),
laplace([H2,H3|T]).
laplace([_,_]).
laplace_vec([TL,T,TR|T1],[ML,M,MR|T2],[BL,B,BR|T3]):-
B + T + ML + MR - 4 * M = 0,
laplace_vec([T,TR|T1],[M,MR|T2],[B,BR|T3]).
laplace_vec([_,_],[_,_],[_,_]).
printmat([H|T]):-
printvec(H),
printmat(T).
printmat([]).
printvec([H|T]):-
printf("%7.2f",[H]),
printvec(T).
printvec([]):-
printf("\n",[]).
go1:-
X = [
[0,0,0,0,0,0,0,0,0,0,0],
[100,_,_,_,_,_,_,_,_,_,100],
[100,_,_,_,_,_,_,_,_,_,100],
[100,_,_,_,_,_,_,_,_,_,100],
[100,_,_,_,_,_,_,_,_,_,100],
[100,_,_,_,_,_,_,_,_,_,100],
[100,_,_,_,_,_,_,_,_,_,100],
[100,_,_,_,_,_,_,_,_,_,100],
[100,_,_,_,_,_,_,_,_,_,100],
[100,_,_,_,_,_,_,_,_,_,100],
[100,100,100,100,100,100,100,100,100,100,100]
],
laplace(X),
printf("\n", []),
printmat(X).
% Answer:
% 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
% 100.00 51.11 32.52 24.56 21.11 20.12 21.11 24.56 32.52 51.11 100.00
% 100.00 71.91 54.41 44.63 39.74 38.26 39.74 44.63 54.41 71.91 100.00
% 100.00 82.12 68.59 59.80 54.97 53.44 54.97 59.80 68.59 82.12 100.00
% 100.00 87.97 78.03 71.00 66.90 65.56 66.90 71.00 78.03 87.97 100.00
% 100.00 91.71 84.58 79.28 76.07 75.00 76.07 79.28 84.58 91.71 100.00
% 100.00 94.30 89.29 85.47 83.10 82.30 83.10 85.47 89.29 94.30 100.00
% 100.00 96.20 92.82 90.20 88.56 88.00 88.56 90.20 92.82 96.20 100.00
% 100.00 97.67 95.59 93.96 92.93 92.58 92.93 93.96 95.59 97.67 100.00
% 100.00 98.89 97.90 97.12 96.63 96.46 96.63 97.12 97.90 98.89 100.00
% 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
go2 :-
laplace([
[B11, B12, B13, B14],
[B21, M22, M23, B24],
[B31, M32, M33, B34],
[B44, B42, B43, B44]
]),
printf("\n", []),
dump.
% Answer:
% B12 = -B21 - 4*B31 + 16*M32 - 8*M33 + B34 - 4*B42 + B43
% B13 = -B24 + B31 - 8*M32 + 16*M33 - 4*B34 + B42 - 4*B43
% M22 = -B31 + 4*M32 - M33 - B42
% M23 = -M32 + 4*M33 - B34 - B43
?- printf("\n>>> Sample goals: go1/0, go2/0\n", []).