2015-02-06 4 views
27

Python's curve_fit вычисляет наилучшие параметры для функции с одной независимой переменной, но есть ли способ, используя curve_fit или что-то еще, для соответствия функции с несколькими независимыми переменными? Например:Python curve_fit с несколькими независимыми переменными

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

где x и y - независимая переменная, и мы хотели бы поместиться для a, b и c.

ответ

27

Вы можете передать curve_fit многомерный массив для независимых переменных, но тогда ваш func должен принять одно и то же. Например, вызов этот массив X и распаковка его x, y для ясности:

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) 

Дает припадок:

(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

Если x и y не совпадают, способ изменить решение для использования кривой. Например, x = linspace (0,1,1,1,101) и y = np.array ([1.0,2.0])? –

+0

Я не уверен, что следую за вами: 'func' представляет собой двумерную функцию (берущую две независимые переменные), поэтому для соответствия она должна быть определена как дающая результат f (x_i, y_i) для любых предоставленных входных значений x_i и y_i , Если 'x' и' y' не имеют одинакового размера, вы пытаетесь его оценить, например. на некотором 'x', но с' y' undefined, который, безусловно, не может быть выполнен. – xnx

0

Да, есть: просто дайте curve_fit многомерный массив для xData.

+0

Я пытался кускового х и у в один массив 'г = [x, y], так что 'x = z [0] и' y = z [1] '. Но 'curve_fit', похоже, не нравится, и дает мне ошибку:' TypeError: неподдерживаемый тип операндов для /: 'list' и 'float'' – mcglashan

Смежные вопросы