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
