2015-02-06 25 views
27

Python's curve_fit calcola i parametri più adatti per una funzione con una singola variabile indipendente, ma esiste un modo, utilizzando curve_fit o qualcos'altro, per adattarsi a una funzione con più variabili indipendenti? Ad esempio:Python curve_fit con più variabili indipendenti

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

dove xey sono la variabile indipendente e vorremmo per adattarsi per a, b, e c.

risposta

27

È possibile passare a curve_fit un array multidimensionale per le variabili indipendenti, ma il proprio func deve accettare la stessa cosa. Ad esempio, la chiamata questa matrice X e disimballaggio a x, y per chiarezza:

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) 

esprime la misura:

(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

Se xey non sono della stessa dimensione c'è un modo per modificare la soluzione per utilizzare la curva. Ad esempio, x = linspace (0.1.1.1.101) e y = np.array ([1.0,2.0])? –

+0

Non sono sicuro di seguirti: 'func' rappresenta una funzione bivariata (prendendo due variabili indipendenti), quindi per l'adattamento dovrebbe essere definito come dare un risultato f (x_i, y_i) per qualsiasi valore di input fornito x_i e y_i . Se 'x' e' y' non hanno le stesse dimensioni, stai provando a valutarlo, ad es. ad alcuni 'x' ma con' y' indefinito che sicuramente non può essere fatto. – xnx

0

Sì, c'è: è sufficiente fornire curve_fit una matrice multidimensionale per xData.

+0

Ho cercato di grumo x ed y in un singolo array 'z = [x, y], in modo che 'x = z [0] e' y = z [1] '. Ma 'curve_fit' non sembra piacermi e mi dà un errore:' TypeError: tipo/i di operando non supportati per /: 'list' e 'float'' – mcglashan