2016-12-23 1 views
3

У меня проблема с тем, как python оценивает векторные функции формы (f1 (x), f2 (x)) для массивов x при попытке подгонки кривой.Как правильно определить векторную функцию для scipy's curve_fit

import numpy as np 
from scipy.optimize import curve_fit 

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

ydata = np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float) 
xdata=np.array([1,2,3,4], dtype=float) 
popt,pcov = curve_fit(func, xdata, ydata) 

дает "ValueError: операнды не могут передаваться вместе с формами (2,4) (4,2)" Транспонирование данные, которые будут установлены:

ydata=np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float).transpose() 

дает «Ошибка типа: Неправильное вход: N = 3 не должен превышать M = 2 ", потому что теперь у меня меньше функциональных значений, чем у параметров. Хорошо, я знаю, почему я не могу приспособиться к этому. Поэтому мне нужно перенести значение функции:

def func(x,a,b,c): 
    return np.array([a*x**b+c,a*x**b+c+1]).transpose() 

Это дает мне «Результат от вызова функции не является собственным массив поплавков.»

Как я могу получить решение от такой проблемы? Математически, это должно быть хорошо определено, если данные могут соответствовать модели.

+0

[связанные вопрос] (http://stackoverflow.com/questions/41090791/how-do-i-optimize-and-find-the-coefficients- for-two-equation-both-in) – Stelios

+0

Вы также можете быть заинтересованы в моем ответе здесь: http://stackoverflow.com/questions/40829791/fitting-a-vector-function-with-curve-fit-in-scipy/40961491 # 40961491 – tBuLi

ответ

3

curve_fit ожидает func, который возвращает 1D массив, поэтому output должен быть флэнтенд. В этом случае вы должны подать в ydata.T.ravel() до curve_fit, чтобы иметь правильный порядок в качестве элементов func(x,a,b,c).

import numpy as np 
from scipy.optimize import curve_fit 

def func(x,a,b,c): 
    output = np.array([a*(x**b)+c,a*(x**b)+c+1]) 
    return output.ravel() 

ydata = np.array([[1,2],[3,4],[5,6],[7,8]],dtype=float) 
xdata=np.array([1,2,3,4], dtype=float) 
popt,pcov = curve_fit(func, xdata, ydata.T.ravel()) 
# print (popt) 
# [ 2., 1., -1.] 

Тестирование результатов,

func(xdata,*popt).reshape(-1,len(xdata)).T 
# [[ 1., 2.], 
# [ 3., 4.], 
# [ 5., 6.], 
# [ 7., 8.]] 
Смежные вопросы