90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			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", []).
							 | 
						||
| 
								 | 
							
								
							 |