File: stirling_compare.py

package info (click to toggle)
pycode-browser 1%3A1.02%2Bgit20181006-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 6,088 kB
  • sloc: python: 2,779; xml: 152; makefile: 71
file content (34 lines) | stat: -rw-r--r-- 1,117 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Validity of stirling's approximation up to N=100 and plot N vs actual, N vs approx
import math

def stirling(N):  #approximation function. log(n!)  = nlog(n)-n
    return N*math.log(N) - N
ACTUAL=[]
APPROX=[]
factN=1
MAXNUM = 100
print('N\tActual\tApprox\t%Error')
for N in range(1,MAXNUM): # loop from N=1 to N=99
	factN *= N  # factorial is automatically calculated and revised per iteration.	
	actual = math.log(factN)
	approx = stirling(N)
	
	ACTUAL.append(actual)
	APPROX.append(approx)

	if(N>2): #Actual is 0 at N=1, and error is quite high for N=2 => neglect
		err = 100*(actual-approx)/actual
		#Print values to the screen every 5 iterations
		if N<5: print ('%d\t%.2f\t%.2f\t%.4f'%(N,actual, approx, err))
		elif N<100 and N%20==0: print ('%d\t%.2f\t%.2f\t%.4f'%(N,actual, approx, err))
		elif N%100==0:print ('%d\t%.2f\t%.2f\t%.4f'%(N,actual, approx, err))

#Plot N vs actual, and N vs approx 
from pylab import *
N = range(1,MAXNUM)
plot(N,APPROX,'-b', label = "N vs Approximation")
plot(N,ACTUAL,'-r', label = "N vs Actual")
legend(loc='lower right')

xlabel('Actual');ylabel('ln(N!) , NlnN-N')
show()