2016-12-23 72 views
3

我有一個python如何在嘗試曲線擬合時評估x的數組的形式(f1(x),f2(x))向量函數的問題。如何正確定義scipy的矢量函數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-equations-in-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.]]