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
