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 1

Ich 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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage