2014-10-01 102 views
3

我想要適合這個x數據:[0.4,0.165,0.165,0.585,0.585],這個y數據:[.45,.22,.63,.22,。 63],而這個z數據:[1,0.99,0.98,0.97,0.96]爲拋物面。我正在使用scipy的curve_fit工具。這裏是我的代碼:拋物面(3D拋物線)表面擬合python

doex = [0.4,0.165,0.165,0.585,0.585] 
doey = [.45, .22, .63, .22, .63] 
doez = np.array([1, .99, .98,.97,.96]) 

def paraBolEqn(data,a,b,c,d): 
    if b < .16 or b > .58 or c < .22 or c >.63: 
     return 1e6 
    else: 
     return ((data[0,:]-b)**2/(a**2)+(data[1,:]-c)**2/(a**2)) 

data = np.vstack((doex,doey)) 
zdata = doez 

opt.curve_fit(paraBolEqn,data,zdata) 

我試圖居中0.16和1.58(X軸)和0.22和1.63(Y軸)之間的拋物面。我通過返回一個很大的值,如果b或c在這個範圍之外做到這一點。

不幸的是,合適的是合適的,我的popt值都是1,我的pcov是inf。

任何幫助將是偉大的。

謝謝

回答

4

而不是強迫高回報值超出範圍的區域,你需要提供一個良好的初始猜測。另外,該模式缺少偏移參數,而拋物面標誌錯誤。該模型改變爲:

def paraBolEqn(data,a,b,c,d): 
    x,y = data 
    return -(((x-b)/a)**2+((y-d)/c)**2)+1.0 

予固定的偏移量爲1.0,因爲如果其中加入作爲擬合參數的系統將被欠定(比擬合參數更少或相等數量的數據點)。 呼叫curve_fit像這樣的初始猜測:

popt,pcov=opt.curve_fit(paraBolEqn,np.vstack((doex,doey)),doez,p0=[1.5,0.4,1.5,0.4]) 

這產生了:

[ 1.68293045 0.31074135 2.38822062 0.36205424] 

和尼斯比賽的數據:

enter image description here