61 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 **********************************************************************
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 *      CLP(R) Version 2.0	(Example Programs Release)
							 | 
						||
| 
								 | 
							
								 *	(C) Copyright, March 1986, Monash University
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 **********************************************************************
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% This program finds a root of a transcendental function given an initial
							 | 
						||
| 
								 | 
							
								% guess. It uses the Steffensen algorithm.
							 | 
						||
| 
								 | 
							
								% The goal         ?- go          finds a root of
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%      2
							 | 
						||
| 
								 | 
							
								% 1 - X
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% given X = 1.7 as an initial guess, requiring that the solution give a value
							 | 
						||
| 
								 | 
							
								% no more than 0.0000005 from zero.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								getnext(X,NX):-
							 | 
						||
| 
								 | 
							
									NX = X - (F / G),
							 | 
						||
| 
								 | 
							
									eval(X,F),
							 | 
						||
| 
								 | 
							
									getg(X,G).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								getg(X,G):-
							 | 
						||
| 
								 | 
							
									G = (FF - F)/F,
							 | 
						||
| 
								 | 
							
									eval(X,F),
							 | 
						||
| 
								 | 
							
									eval(X+F,FF).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								eval(X,1 - X * X).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								small(X,E):-
							 | 
						||
| 
								 | 
							
									X < 0,
							 | 
						||
| 
								 | 
							
									(0-X) < E .
							 | 
						||
| 
								 | 
							
								small(X,E):-
							 | 
						||
| 
								 | 
							
									X >= 0,
							 | 
						||
| 
								 | 
							
									X < E .
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								solve(I,E):-
							 | 
						||
| 
								 | 
							
									eval(I,F),
							 | 
						||
| 
								 | 
							
									small(F,E),
							 | 
						||
| 
								 | 
							
									printf("%10.8f\n",[I]).
							 | 
						||
| 
								 | 
							
								solve(I,E):-
							 | 
						||
| 
								 | 
							
									printf("%10.8f\n",[I]),
							 | 
						||
| 
								 | 
							
									getnext(I,X),
							 | 
						||
| 
								 | 
							
									solve(X,E).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								go:-  solve(1.7,0.0000005).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% Output:
							 | 
						||
| 
								 | 
							
								%  1.70000000
							 | 
						||
| 
								 | 
							
								%  0.44834437
							 | 
						||
| 
								 | 
							
								%  0.91953538
							 | 
						||
| 
								 | 
							
								%  0.99701354
							 | 
						||
| 
								 | 
							
								%  0.99999555
							 | 
						||
| 
								 | 
							
								%  1.00000000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								?- printf("\n>>> Sample goal: go/0\n", []).
							 |