Weiß jemand vielleicht, wie man < M**4 > / < M**2 > **2 in Python konstruieren kann?
M steht für die Magnetisierung. Sie wird in einer Schleife wird durch 1000 Durchläufe ermittelt. Nun muss ich den Mittelwert bilden, weiß aber nicht, wie es geht.
Code: Alles auswählen
def initialzustand(N):
zustand = 2*np.random.randint(2, size=(N,N))-1
return zustand
def mcmove(konfig, beta):
for i in range(N):
for j in range(N):
a = np.random.randint(0,N)
b = np.random.randint(0,N)
s = konfig[a,b]
nb = konfig[(a+1)%N,b]+konfig[a,(b+1)%N]+konfig[(a-1)%N,b]+konfig[a,(b-1)%N]
cost = 2*s*nb
if cost < 0 :
s*= -1
elif rand() < np.exp(-cost*beta):
s*= -1
konfig[a,b]=s
return konfig
def calcEnergie(konfig):
Energie = 0
for i in range(len(konfig)):
for j in range(len(konfig)):
S = konfig[i,j]
nb = konfig[(i+1)%N,j]+konfig[i,(j+1)%N]+konfig[(i-1)%N,j]+konfig[i,(j-1)%N]
Energie += -nb*S
return Energie/4.
def calcMag(konfig):
return np.sum(konfig)
nt = 500
N = 10
eqSteps = 1000
mcSteps = 1000
T = np.linspace(1,4,nt)
Kumulante = np.zeros(nt)
for m in range(len(T)):
M1 = M2 = 0
konfig = initialzustand (N)
for i in range(eqSteps):
mcmove(konfig,1.0/T[m])
for i in range(mcSteps):
mcmove(konfig, 1.0/T[m])
Mag = calcMag(konfig)
M1 = M1 + Mag
M2 = M2 + Mag*Mag;
[u] Kumulante[m] =( Hier muss ich[b] < M**4 > / < M**2 > **2[/b] eingeben und anschließend plotten)[/u]
Der erste Term soll irgedwie [u]M2**4/mcSteps[/u] aussehen. oder zumindest habe ich was ähnliches in
einem Buch gesehen.
plt.plot(T, Kumulante, 'o',color='red', markersize=3, label='Specific Heat');
plt.xlabel('Temperature (T)', fontsize=20);
plt.ylabel('Kumulante',fontsize=20);
plt.show()
Liebe Grüße
Micha