2015-02-06 13 views
27

Pythons berechnet die am besten geeigneten Parameter für eine Funktion mit einer einzigen unabhängigen Variablen, aber gibt es eine Möglichkeit, curve_fit oder etwas anderes zu verwenden, um eine Funktion mit mehreren unabhängigen Variablen zu erfüllen? Zum Beispiel:Python curve_fit mit mehreren unabhängigen Variablen

def func(x, y, a, b, c): 
    return log(a) + b*log(x) + c*log(y) 

wo x und y sind die unabhängige Variable und wir möchten für a, b und c passen.

Antwort

27

Sie können curve_fit ein multidimensionales Array für die unabhängigen Variablen übergeben, aber dann muss Ihr func das gleiche akzeptieren. Zum Beispiel ruft dieses Array X und es x, y für Klarheit Auspacken:

import numpy as np 
from scipy.optimize import curve_fit 

def func(X, a, b, c): 
    x,y = X 
    return np.log(a) + b*np.log(x) + c*np.log(y) 

# some artificially noisy data to fit 
x = np.linspace(0.1,1.1,101) 
y = np.linspace(1.,2., 101) 
a, b, c = 10., 4., 6. 
z = func((x,y), a, b, c) * 1 + np.random.random(101)/100 

# initial guesses for a,b,c: 
p0 = 8., 2., 7. 
print curve_fit(func, (x,y), z, p0) 

den Sitz Gibt:

(array([ 9.99933937, 3.99710083, 6.00875164]), array([[ 1.75295644e-03, 9.34724308e-05, -2.90150983e-04], 
    [ 9.34724308e-05, 5.09079478e-06, -1.53939905e-05], 
    [ -2.90150983e-04, -1.53939905e-05, 4.84935731e-05]])) 
+0

Wenn x und y nicht gleich groß sind, gibt es da eine Möglichkeit, die Lösung zu ändern, um die Kurvenanpassung zu verwenden. Zum Beispiel, x = linspace (0.1,1.1,101) und y = np.array ([1.0.2.0])? –

+0

Ich bin mir nicht sicher, ob ich dir folge: 'func' repräsentiert eine bivariate Funktion (nimmt zwei unabhängige Variablen), also sollte für die Anpassung ein Ergebnis f (x_i, y_i) für alle angegebenen Eingabewerte x_i und y_i angegeben werden . Wenn "x" und "y" nicht die gleiche Größe haben, dann versuchen Sie es z.B. bei einigen 'x', aber mit' y' undefined, was sicherlich nicht möglich ist. – xnx

0

Ja, gibt es: Geben Sie einfach curve_fit ein multidimensionales Array für xData.

+0

Ich habe zu Klumpen x und y in einem einzigen Array versuchen, 'z = [x, y], so dass "x = z [0] und" y = z [1] '. Aber 'curve_fit' scheint das nicht zu mögen und gibt mir einen Fehler:' TypeError: nicht unterstützte Operandentypen für /: 'list' und 'float'' – mcglashan

Verwandte Themen