2016-11-23 3 views
3

Dies ist ein ziemlich spezifisches Problem Ich hatte gehofft, dass die Gemeinschaft mir helfen könnte. Danke im Voraus.Kurvenanpassung mit einer großen Anzahl von Datenpunkten

Also habe ich 2 Datensätze, einer ist experimentell und der andere basiert auf einer Gleichung. Ich versuche, meine Datenpunkte an diese Kurve anzupassen und damit die fehlenden Variablen zu erhalten, an denen ich interessiert bin. Nämlich a und b in der Ebfit-Funktion. Hier

ist der Code:

%matplotlib notebook 
import numpy as np 
import matplotlib.pyplot as plt 
import scipy.stats as spys 
from scipy.optimize import curve_fit 

time = [60,220,520,1840] 
Moment = [0.64227262,0.468318916,0.197100772,0.104512508] 

Temperature = 25        # Bake temperature in degrees C 
Nb = len(Moment)           # Number of bake measurements 
Baketime_a = time     #[s] 
N_Device = 10000         # No. of devices considered in the array 
T_ambient = 273 + Temperature 
kt = 0.0256*(T_ambient/298)       # In units of eV 
f0 = 1e9           # Attempt frequency 


def Ebfit(x,a,b): 
    Eb_mean = a*(0.0256/kt)      # Eb at bake temperature 
    Eb_sigma = b*Eb_mean 
    Foursigma = 4*Eb_sigma 
    Eb_a = np.linspace(Eb_mean-Foursigma,Eb_mean+Foursigma,N_Device) 
    dEb = Eb_a[1] - Eb_a[0] 
    pdfEb_a = spys.norm.pdf(Eb_a,Eb_mean,Eb_sigma) 

    ## Retention Time 

    DMom = np.zeros(len(x),float) 
    tau = (1/f0)*np.exp(Eb_a) 
    for bb in range(len(x)): 
     DMom[bb]= (1 - 2*(sum(pdfEb_a*(1 - np.exp(np.divide(-x[bb],tau))))*dEb)) 
    return DMom 

a = 30 
b = 0.10 

params,extras = curve_fit(Ebfit,time,Moment) 

x_new = list(range(0,2000,1)) 
y_new = Ebfit(x_new,params[0],params[1]) 

plt.plot(time,Moment, 'o', label = 'data points') 
plt.plot(x_new,y_new, label = 'fitted curve') 
plt.legend() 

Das Hauptproblem ich habe, ist, dass die Anpassung der Daten an die Funktion nicht funktioniert, wenn ich große Anzahl von Punkten verwenden. In dem obigen Code Wenn ich die 4 Punkte (Zeit & Moment) verwende, funktioniert dieser Code gut.

Ich bekomme die folgenden Werte für a und b.

Array ([29,11832766, 0,13918353])

Die erwarteten Werte für a ist (23-50) und b (0,06-0,15). Diese Werte liegen also im akzeptablen Bereich. Dies ist der entsprechende Plot: Plot 1

Allerdings verwende ich meine tatsächlichen experimentellen normalisierten Daten mit etwa 500 Punkten.

EDIT: Diese Daten:

normalisierten Daten

https://www.dropbox.com/s/64zke4wckxc1r75/Normalized%20Data.csv?dl=0

Rohdaten

https://www.dropbox.com/s/ojgse5ibp59r8nw/Data1.csv?dl=0

ich die folgenden Werte und Grundstück für ein und b, die außerhalb des akzeptablen Bereichs liegen,

Array ([- 13,76687781, -12,90494196]) Plot 2

Ich weiß, diese Werte falsch sind und wenn ich es manuell tun (langsam Werte zur Anpassung erhalten die richtige Passform) es wäre um a = 30,1 und b = 0,09. Und wenn Blicke als solche aufgetragen: Plot 3

Ich habe versucht, so gut und andere Vorschläge in ähnlichen Themen die ersten Schätzwert für ein & b, andere Sätze von experimentellen Daten zu ändern. Keiner scheint für mich zu funktionieren. Jede Hilfe, die Sie zur Verfügung stellen können, wird geschätzt. Vielen Dank.

. . . .

WEITERE INFORMATIONEN

Das Modell Ich versuche, um die Daten zu passen, um aus der folgenden Gleichung kommt: Equation

wo Dmom = 1 bis 2 * Psw

ein ist der Eb-Wert, während b der Sigma-Wert ist, wo, Eb hat eine Reihe von Werten bestimmt b y die Wahrscheinlichkeitsdichtefunktion und 4 Mal die Sigmawerte (d. h. Foursigma). Diese Verteilung wird dann zur Verwendung für die endgültige Gleichung aufsummiert.

+0

Ihr Google Drive Link erscheint eingeschränkt. Ist das beabsichtigt? –

+0

@VlasSokolov hey entschuldigen Sie das. Ich habe den Link aktualisiert. Bitte versuche es erneut. – xplodnow

+0

Die Momentdaten in der Datei reichen von -3e-5 bis 1,65e-5, aber in Ihrer Anpassung an einen 500-Punkt-Datensatz reichen die Bereiche bis Eins. Erklärt dies die Anpassungsdiskrepanz? Normalisieren Sie die Daten irgendwo dazwischen, passen Sie sie an und zeichnen Sie sie auf dem Bildschirm auf? –

Antwort

2

Es sieht so aus, als müssten Sie mit den ersten Vermutungen für a und b herumspielen. Vielleicht ist die Funktion, die du verwendest, nicht sehr gut benommen, weshalb es so anfällig für anfängliche Vermutungen ist, weg vom globalen Minimum. Davon abgesehen, ist hier ein funktionierendes Beispiel, wie die Daten passen:

import pandas as pd 
data_df = pd.read_csv('data.csv') 
time = data_df['Time since start, Time [s]'].values 
moment = data_df['Signal X direction, Moment [emu]'].values 

params, extras = curve_fit(Ebfit, time, moment, p0=[40, 0.3]) 

ergibt die Werte von a und b von:

In [6]: params 
Out[6]: array([ 30.47553689, 0.08839412]) 

, die in einem gut ausgerichteten Sitz einer Funktion zur Folge hat.

x_big = np.linspace(1, 1800, 2000) 
y_big = Ebfit(x_big, params[0], params[1]) 

plt.plot(time, moment, 'o', alpha=0.5, label='all points') 
plt.plot(x_big, y_big, label = 'fitted curve') 
plt.legend() 
plt.show() 

fits

Verwandte Themen