Die Kurvenanpassung schlägt mit Exponential fehl, aber Zunzun macht es richtig
Ich versuche, die beste Anpassung von zwei Exponentialformen für einige zu berechnenx, y
Daten (die Datendatei kann von heruntergeladen werdenHier)
Hier ist der Code:
from scipy.optimize import curve_fit
import numpy as np
# Get x,y data
data = np.loadtxt('data.txt', unpack=True)
xdata, ydata = data[0], data[1]
# Define first exponential function
def func(x, a, b, c):
return a * np.exp(b * x) + c
# Get parameters estimate
popt, pcov = curve_fit(func, xdata, ydata)
print popt
# Define second exponential function (one more parameter)
def func2(x, a, b, c, d):
return a * np.exp(b * x + c) + d
# Get parameters estimate
popt2, pcov2 = curve_fit(func2, xdata, ydata)
print popt2
Das erste Exponential gibt genau die gleichen Werte an wie zunzun.com (PDF hier) zumpopt
:
[ 7.67760545e-15 1.52175476e+00 2.15705939e-02]
aber der zweite gibt Werte an, die eindeutig falsch sindpopt2
:
[ -1.26136676e+02 -8.13233297e-01 -6.66772692e+01 3.63133641e-02]
Dies sind zunzun.com Werte (PDF hier) für dieselbe zweite Funktion:
a = 6.2426224704624871E-15
b = 1.5217697532005228E+00
c = 2.0660424037614489E-01
d = 2.1570805929514186E-02
Ich habe versucht, die Listen-Arrays so zu erstellen, wie es hier empfohlen wirdSeltsames Ergebnis mit Pythons (scipy) Kurvenanpassung, aber das hat nicht geholfen. Was mache ich hier falsch?
Addiere 1Ich vermute, das Problem hat mit dem Mangel an zu tunAnfangswerte Ich füttere meine Funktion (wie hier erklärt:Gaußsche Anpassung mit scipy.optimize.curve_fit in Python mit falschen Ergebnissen)
Wenn ich die Schätzungen vom ersten Exponential bis zum zweiten Exponential so einspeise (indem ich den neuen Parameter einspeise)d
anfangs Null sein):
popt2, pcov2 = curve_fit(func2, xdata, ydata, p0 = [popt[0], popt[1], popt[2], 0])
Ich erhalte Ergebnisse, die im Vergleich zu zunzun.com viel vernünftiger, aber immer noch falsch sind:
[ 1.22560853e-14 1.52176160e+00 -4.67859961e-01 2.15706930e-02]
Die Frage ändert sich nun zu: Wie kann ich meiner zweiten Funktion sinnvollere Parameter automatisch zuführen?