2012-04-15 19 views
2

Ich versuche, eine Funktion anzupassen, die als Eingabe 2 unabhängige Variablen x, y und 3 Parameter verwendet, um a, b, c zu finden. Das ist mein Testcode:Übergabe von Argumenten an eine Funktion zum Anpassen

import numpy as np 
from scipy.optimize import curve_fit 

def func(x,y, a, b, c): 
    return a*np.exp(-b*(x+y)) + c  

y= x = np.linspace(0,4,50) 
z = func(x,y, 2.5, 1.3, 0.5) #works ok 
#generate data to be fitted 
zn = z + 0.2*np.random.normal(size=len(x)) 
popt, pcov = curve_fit(func, x,y, zn) #<--------Problem here!!!!! 

Aber ich erhalte die Fehlermeldung: "Func() nimmt genau 5 Argumente (51 genannt)". Wie kann ich meine Argumente x, y richtig übergeben?

+0

Was sagt die Dokumentation für 'curve_fit' über den' func' Parameter? Offensichtlich versucht es, es mit 51 Parametern zu benennen, also sollten Sie vielleicht die Dokumentation noch einmal lesen. – Wes

Antwort

6

Ein Blick auf die documentation of scipy.optimize.curve_fit() ist alles was man braucht. Der Prototyp ist

scipy.optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw) 

Die Dokumentation curve_fit() Zuständen wird mit der Zielfunktion als erstes Argument, die unabhängige Variable (n) als das zweite Argument, die abhängige Variable als drittes Argument ans die Startwerte für die Parameter aufgerufen als viertes Argument. Sie haben versucht, die Funktion auf eine völlig andere Art aufzurufen, also ist es nicht überraschend, dass es nicht funktioniert. Insbesondere haben Sie zn als p0 Parameter übergeben - deshalb wurde die Funktion mit so vielen Parametern aufgerufen.

Die Dokumentation beschreibt auch, wie die Zielfunktion aufgerufen wird:

f : callable
The model function, f(x, ...) . It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments.

xdata : An N -length sequence or an (k,N) -shaped array
for functions with k predictors. The independent variable where the data is measured.

Sie Verwendungen versuchen Argumente für die abhängigen Variablen zu trennen, während es ein einzelnes Array von Argumenten sein sollte. Hier ist der Code behoben:

def func(x, a, b, c): 
    return a * np.exp(-b * (x[0] + x[1])) + c  

N = 50 
x = np.linspace(0,4,50) 
x = numpy.array([x, x])   # Combine your `x` and `y` to a single 
           # (2, N)-array 
z = func(x, 2.5, 1.3, 0.5) 
zn = z + 0.2 * np.random.normal(size=x.shape[1]) 
popt, pcov = curve_fit(func, x, zn) 
+0

vielen Dank, Problem gelöst! – elyase

0

Try die ersten beiden Array-Parameter zu func als Tupel passieren und func zu modifizieren, um ein Tupel von Parametern

Normalerweise wird erwartet, zu akzeptieren, die curvefit würde eine x und y Parameter func(x) als eine Eingabe akzeptieren, die passen Kurve. Seltsamerweise in Ihrem Beispiel, da Ihr x-Parameter kein einzelner Wert ist, sondern zwei Werte (nicht sicher, warum), müssen Sie Ihre Funktion so ändern, dass sie die x als einen einzigen Parameter akzeptiert und sie darin erweitert.

Im Allgemeinen sollte die dreidimensionale Kurvenanpassung anders gehandhabt werden als das, was Sie erreichen möchten. Sie können einen Blick in die folgenden SO Post werfen, die versucht, eine dreidimensionale Streuung mit einer Linie zu passen.

>>> def func((x,y), a, b, c): 
    return a*np.exp(-b*(x+y)) + c 

>>> y= x = np.linspace(0,4,50) 
>>> z = func((x,y), 2.5, 1.3, 0.5) #works ok 
>>> zn = z + 0.2*np.random.normal(size=len(x)) 
>>> popt, pcov = curve_fit(func, (x,y), zn) 
Verwandte Themen