2017-10-29 3 views
-2

Ich bin Neuling in Python Ich habe diesen Code ich will Unterklasse lmfit.models verwenden und eine Vermutung Methode zu implementieren,wie kann ich dieses Problem beheben ‚‘ ‚Name ist nicht definiert‘

class DecayingSineModel(): 

    def __init__(self, *args, **kwargs): 

     def decaying_sine(self, x, ampl, offset, freq, x0, tau): 
      return ampl * np.sin((x - x0)*freq) * np.exp(-x/tau) + offset 

     super(DecayingSineModel, self).__init__(decaying_sine, *args, **kwargs) 

    def pset(param, value): 
     params["%s%s" % (self.prefix, param)].set(value=value) 

    def guess(self, data, **kwargs):   
     params = self.make_params() 
     pset("ampl", np.max(data) - np.min(data)) 
     pset("offset", np.mean(data)) 
     pset("freq", 1) 
     pset("x0", 0) 
     pset("tau", 1) 
     return lmfit.models.update_param_vals(params, self.prefix, **kwargs) 

sp = DecayingSineModel() 
params = sp.guess(y, x=x) 
fit = sp.fit(y, params, x=x) 

und ich bin recieving folgende Fehler die Fehler, die ich the image of error that i recieved is in this address

+0

Dies ist, wie Sie Ihren Code eingerückt, weil diese es erklären kann. –

+1

Bitte poste eine genaue Kopie deines Codes, da es momentan sehr seltsam ist ... –

+0

Ist der Aufruf von 'super' innerhalb deiner' __init__' Methode? Mit der gebrochenen Einrückung ist es unmöglich zu sagen. Ähnlich verhält es sich mit 'sp = DecayingSineModel()' im Klassenkörper? Oder ist es außerhalb der Klasse? –

Antwort

0

bin recieving Sie wollen mit ziemlicher Sicherheit Ihr DecayingSineWave von lmfit.Model erben. Wie andere darauf hingewiesen haben, gibt es eine Reihe anderer Probleme mit Ihrem Code, einschließlich der Tatsache, dass Ihre pset Referenzen self, aber hat es nicht übergeben und noch rufen Sie pset, nicht self.pset. Ihre Modellfunktion decaying_sine sollte nicht haben self.

Eine aufgeräumte Version:

import numpy as np 
import lmfit 
import matplotlib.pyplot as plt 

class DecayingSineModel(lmfit.Model): 
    def __init__(self, *args, **kwargs): 
     def decaying_sine(x, ampl, offset, freq, x0, tau): 
      return ampl * np.sin((x - x0)*freq) * np.exp(-x/tau) + offset 
     super(DecayingSineModel, self).__init__(decaying_sine, *args, **kwargs) 

    def guess(self, data, x=None, **kwargs): 
     ampl = np.max(data) - np.min(data) 
     offset = np.mean(data) 
     params = self.make_params(ampl=ampl, offset=offset, freq=1, x0=0, tau=1) 
     return lmfit.models.update_param_vals(params, self.prefix, **kwargs) 

sp = DecayingSineModel() 

x = np.linspace(0, 25, 201) 
noise = np.random.normal(size=len(x), scale=0.25) 
y = 2 + 7*np.sin(1.6*(x-0.2)) * np.exp(-x/18) + noise 

params = sp.guess(y, x=x) 
result = sp.fit(y, params, x=x) 
print(result.fit_report()) 

plt.plot(x, y, 'bo') 
plt.plot(x, result.best_fit, 'r-') 
plt.show() 

gibt einen Bericht von:

[[Model]] 
    Model(decaying_sine) 
[[Fit Statistics]] 
    # function evals = 83 
    # data points  = 201 
    # variables  = 5 
    chi-square   = 39.266 
    reduced chi-square = 0.200 
    Akaike info crit = -318.220 
    Bayesian info crit = -301.703 
[[Variables]] 
    ampl:  6.92483967 +/- 0.123863 (1.79%) (init= 12.59529) 
    offset: 1.96307863 +/- 0.031684 (1.61%) (init= 2.139916) 
    freq:  1.60060819 +/- 0.001775 (0.11%) (init= 1) 
    x0:  0.19650313 +/- 0.010267 (5.23%) (init= 0) 
    tau:  18.3528781 +/- 0.614576 (3.35%) (init= 1) 
[[Correlations]] (unreported correlations are < 0.100) 
    C(ampl, tau)     = -0.781 
    C(freq, x0)     = 0.750 

und enter image description here

+0

Ja, danke, aber nachdem ich das getan habe, habe ich diesen Fehler erneut erhalten. – somaye

+0

Hm, ich bezweifle das: Wenn ich Ihren Code versuche, bekomme ich den NameError Fehler nicht. Aber wie andere bereits erwähnt haben, gibt es noch einige andere Probleme mit Ihrem Code. Ich habe meine Antwort aktualisiert, um eine funktionierende Version zu erhalten. –

+0

@M Newville Vielen Dank für Ihre Antwort Ich weiß nicht, warum ich diesen Fehler auch mit Ihrer Arbeitsversion erhalten habe, vielleicht gibt es ein anderes Problem, ich benutze Python 2.7.14 in Witwen 7, ist es möglich, dass ich dies deshalb habe Probleme. – somaye

Verwandte Themen