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:
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])
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:
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:
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.
Ihr Google Drive Link erscheint eingeschränkt. Ist das beabsichtigt? –
@VlasSokolov hey entschuldigen Sie das. Ich habe den Link aktualisiert. Bitte versuche es erneut. – xplodnow
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? –