Ich habe versucht gemäß
https://lmfit.github.io/lmfit-py/model.html
eine Kurve zu fitten. Es klappt leider nicht.
Ich erhalte folgende Fehlermeldung:
gmodel = Model(gaussian)
NameError: name 'gaussian' is not defined
Obwohl Gauß im lmfit drin sein müsste.
Code: Alles auswählen
import numpy as np
import random
import matplotlib.pyplot as plt
from lmfit import Model
eqstep = 500 ; mcstep = 500 ; gitter1 = 10
T = np.linspace(1.,3.5,50)
def initialzustand(zeile,spalte):
return np.random.choice([1, -1], size=(zeile, spalte))
def nachbar_spin(konfig,gitter,x,y):
links = (x, y-1)
rechts = (x, (y+1) % gitter)
oben = (x-1, y)
unten = ((x+1) % gitter, y)
return[konfig[links[0], links[1]],
konfig[rechts[0], rechts[1]],
konfig[oben[0], oben[1]],
konfig[unten[0],unten[1]]]
def energie(konfig,gitter,x,y):
return 2 * konfig[x,y] * sum(nachbar_spin(konfig,gitter,x,y))
def metropolis():
magnet = np.array([]) ; magnet2 = np.array([]) ; magnet4 = np.array([]) ;
for temp in T:
konfig = initialzustand(gitter1,gitter1)
mag = np.zeros(eqstep + mcstep)
for sweep in range(eqstep + mcstep):
for i in range(gitter1):
for j in range(gitter1):
e = energie(konfig,gitter1,i,j)
if e <= 0:
konfig[i,j] *= -1
elif np.exp((-1.0 * e) / temp) > random.random():
konfig[i,j] *= -1
mag[sweep] = (sum(sum(konfig))) / gitter1**2
magnet = np.append(magnet,((sum(mag[eqstep:]) / mcstep)))
magnet2 = np.append(magnet2,sum(abs(mag[eqstep:])) / mcstep)
magnet4 = np.append(magnet4,sum(mag[eqstep:]**2) / mcstep)
EW = magnet4 / magnet2**2
Sus = magnet4 - magnet **2
return Sus
EW = metropolis()
gmodel = Model(gaussian)
result = gmodel.fit(EW,T=T)
plt.plot(T,EW,'bo')
plt.plot(result.best_fit,'r--')
plt.show()
Danke euch!
LG
Micha