Advertisement
gronke

Metropolis Algorithm

Sep 25th, 2013
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.20 KB | None | 0 0
  1. import numpy
  2. import pylab
  3.  
  4. size = 16
  5. n = 2**size
  6.  
  7. T = numpy.arange(0.2,5,.1)
  8.  
  9. B = 1/(T)
  10.  
  11. isingarray = numpy.zeros((n,size))
  12. Hvals = numpy.zeros(n)
  13. m = n
  14.  
  15. for col in range (0,size,1):
  16.     m = m/2    
  17.     boolean = True
  18.     for row in range (0,n,1):
  19.         if row%m == 0:
  20.             boolean = not boolean
  21.         if boolean == True:
  22.             isingarray[row,col] = 1
  23.         else:
  24.             isingarray[row,col] = -1
  25.  
  26. asize = numpy.int(numpy.sqrt(size))
  27.  
  28. H = numpy.zeros(n)
  29.  
  30. Z = numpy.zeros(B.size)
  31. ZHsum = numpy.zeros(B.size)
  32. ZH2sum = numpy.zeros(B.size)
  33.  
  34. avgH = numpy.zeros(B.size)
  35. avgH2 = numpy.zeros(B.size)
  36.  
  37. for row in range (0,n,1):
  38.     testarray = numpy.reshape(isingarray[row,:], (asize,asize))
  39.     for i in range (0,asize,1):
  40.         H[row] += -(testarray[0,i]*testarray[asize-1,i])
  41.         H[row] += -(testarray[i,0]*testarray[i,asize-1])
  42.  
  43.  
  44. A = numpy.eye(asize**2, asize**2,1)
  45. A[numpy.arange(asize**2) % asize == asize-1] = 0
  46. A += numpy.eye(asize**2, asize**2, asize)
  47.  
  48. H += -(numpy.dot(isingarray,A)*isingarray).sum(axis=1)
  49.  
  50. for i in range (0,B.size):
  51.     for k in range (0,H.size):
  52.         Z[i] += numpy.exp(-B[i]*H[k])
  53.         ZHsum[i] += numpy.exp(-B[i]*H[k])*H[k]
  54.         ZH2sum[i] += numpy.exp(-B[i]*H[k])*(H[k])**2
  55.        
  56.     avgH[i] = ZHsum[i]/Z[i]
  57.     avgH2[i] = ZH2sum[i]/Z[i]
  58.    
  59. C = (avgH2-avgH**2)/((T**2)*size)
  60.  
  61. #Begin Metropolis Algorithm
  62.  
  63. metroarray = numpy.zeros(B.size)
  64.  
  65.  
  66. for j in range(0,B.size,1):
  67.    
  68.     metro = numpy.reshape(isingarray[numpy.random.randint(0,65537),:], (asize,asize))
  69.        
  70.     metrosize = numpy.zeros(10000)    
  71.     waitperiod = metrosize.size*1.5
  72.    
  73.     for count in range (numpy.int(metrosize.size-waitperiod),metrosize.size,1):
  74.        
  75.         mH = 0.
  76.         mHp = 0.
  77.        
  78.         for i in range (0,asize,1):
  79.             mH += (metro[0,i]*metro[asize-1,i])
  80.             mH += (metro[i,0]*metro[i,asize-1])
  81.             for k in range (0, asize-1,1):
  82.                 mH += (metro[i,k]*metro[i,k+1])
  83.                 mH += (metro[k,i]*metro[k+1,i])
  84.         mH = mH * -1
  85.                
  86.         metro2 = metro
  87.        
  88.         choice = numpy.random.randint(0,4,1)
  89.         choice2 = numpy.random.randint(0,4,1)
  90.        
  91.         metro2[choice,choice2] = metro2[choice,choice2]*-1
  92.        
  93.         for i in range (0,asize,1):
  94.             mHp += (metro2[0,i]*metro2[asize-1,i])
  95.             mHp += (metro2[i,0]*metro2[i,asize-1])
  96.             for k in range (0, asize-1,1):
  97.                 mHp += (metro2[i,k]*metro2[i,k+1])
  98.                 mHp += (metro2[k,i]*metro2[k+1,i])
  99.         mHp = mHp * -1
  100.        
  101.         if mHp < mH:
  102.             metro = metro2
  103.         if numpy.random.rand() < numpy.exp(-B[j]*(mH-mHp)):
  104.             metro = metro2
  105.        
  106.         mH = 0.
  107.        
  108.         for i in range (0,asize,1):
  109.             mH += (metro[0,i]*metro[asize-1,i])
  110.             mH += (metro[i,0]*metro[i,asize-1])
  111.             for k in range (0, asize-1,1):
  112.                 mH += (metro[i,k]*metro[i,k+1])
  113.                 mH += (metro[k,i]*metro[k+1,i])
  114.         mH = -1*mH
  115.         if count >= 0:
  116.             metrosize[count] += mH
  117.             print count
  118.     metroarray[j] = numpy.sum(metrosize)/metrosize.size
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement