2014-03-26 65 views
0

我希望用2D函數擬合數據以便使用lmfit包提取參數(a)和(b)。基本上作爲一維函數擬合,我試圖在同一座標(x,y)處將每個數據點擬合到2D函數中。這意味着每個數據點都具有與其他數據點不同的初始猜測值,因爲每個數據具有不同的座標(x,y)。這是我的代碼:使用Python中的lmfit將數據擬合到2D函數

#!/usr/bin/ python 
    import pyfits 
    import numpy as np 
    import math 
    from lmfit import minimize, Parameters, Parameter, report_errors,report_fit,  
     conf_interval, printfuncs 


    xn =np.linspace(0,3,4) # x-component 
    yn =np.linspace(0,3,4) # y-component 

    data= [0.0, 0.16, 0.33, 0.5, 0.2, 0.26, 0.38, 0.53, 0.4, 0.43, 0.52, 0.64, 0.6, 0.62, 
    0.67, 0.78] # (x1,y1) generate (data[0]), (x1,y2) generate (data[1]) and so on 


    params = Parameters() 
    params.add('a', value=3) 
    params.add('b', value=5)      


    def residual(params,x,y,data=None): 
     a = params['a'].value    # parameter 
     b = params['b'].value    # parameter 
     model=(x**2/a**2+y**2/b**2)**0.5  # 2D function    
     if data is None: 
      return data 
     return model - data 


    out=minimize(residual,params,args=(x,y,data,))  # lmfit minimizer 
    final=data+out.residual 
    report_fit(params) 
    ci = conf_interval(out, sigmas=[0.68,0.95])   # confidence interval 
    printfuncs.report_ci(ci) 

不過,我得到這個錯誤信息:

ValueError: operands could not be broadcast together with shapes (4) (16) 

顯然,x和y的尺寸是不一樣的數據,但我不知道該怎麼做data [0]取(x1,y1),data [1]取(x1,y2)...,data [5]取(x2,y1)等。請任何人都可以幫助我解決這個問題或提出任何建議,謝謝你提前。

回答

0

你需要壓縮你的數據嗎?

x = [x1, x2, ...] 
y = [y1, y2, ...] 
data = zip(x, y) # [(x1, y1), (x2, y2), ... ] 
+0

謝謝你的迴應,實際上我在數據之前加了這個步驟x,y = np.ix_(xn,yn),它運行良好。 – user3395817