2016-11-03 5 views
2

Ich habe ein kleines Problem mit der Funktion curve_fit in Scipy. Hier ist die Funktion Ich möchte passen:Erzwingen von Daten zum Anpassen von Punkten mit curve_fit

def funclog(x, a, b, c, d): 
    return a * np.log(b * x + c) + d 

Das Problem, das ich ist, dass ich die Fit-Funktion möchte einen bestimmten Wert in einigen Punkten haben (y (min) = 0 und y (max) = 1). Wie kann ich diese Punkte mit curve_fit erzwingen?

Danke

+0

Ich glaube [dieser Ansatz] (http://stackoverflow.com/a/16632712/832621) wird Ihnen helfen –

Antwort

1

Die Forderung der Anpassung an x=0 spezifischen Werten, x=1, bedeutet, dass die Parameter a, b, c, d sind abhängig von der Menge eingeschränkt von zwei Gleichungen:

funclog(0, a, b, c, d) = 0, funclog(1, a, b, c, d) = 1

Für die Form von funclog Sie erwägen, können Sie dieses Gleichungssystem in Bezug auf a und d was in der (einmaligen) Lösung lösen können

a = 1/(-log(c) + log(b + c)) und d=log(c)/(log(c) - log(b + c))

(unter der Annahme, dass b und c sind so, dass die Nenner nicht gleich Null sind).

Ersetzen dieser Ausdrücke für a und d in funclog führt zu einer neuen Anpassungsfunktion, nämlich

(log(c) - log(b*x + c))/(log(c) - log(b + c)),

die standardmäßig erfüllt die Einschränkungen. Die Werte b und c finden Sie unter curve_fit.

+0

Vielen Dank, das habe ich gesucht! – Vlad

0

Sie versuchen, Grenzen verwenden:

bounds = ([amin, bmin, cmin, dmin], [amax, bmax, cmax, dmax]) 
(or np.inf -np.inf if limes of param is in infininty) 

nächsten

popt1, pcov1 = curve_fit(funclog, x, y, bounds=bounds) 
+0

Das Problem ist, dass ich nicht wollen, meine Parameter aber das Ergebnis der Funktion selbst – Vlad

+0

vielleicht gebunden Sie sollten versuchen, die Ergebnisse nach der Anpassung zu "normalisieren"? Sie wissen, von Max Y als 1 und Min Y als Null? – fafnir1990

Verwandte Themen