2015-10-19 70 views
0

Im編程中的新手,尤其是曲線擬合。但是我試圖將一個模型曲線擬合成我用Python和Numpy做的一些測量。Scipy Curve_fit函數使用初始猜測值而不是實際擬合

我成功地將「擬合」曲線繪製成一組數據。好吧,看起來好像是這樣。事實證明,該函數只是使用最初的猜測,並沒有嘗試實際擬合曲線。我通過對不同的數據集使用相同的初始猜測來測試它。這是結果:

enter image description here

fitParams輸出是fitCovariances(這似乎是很奇怪的值):

[ 540.  2.5 2. ] 
[[ inf inf inf] 
[ inf inf inf] 
[ inf inf inf]] 

def fitFunc()輸出只是初步猜測反覆值。

我第一次嘗試我的腳本的第五個數據集,這似乎有些什麼好。但是你可以看到每個「擬合曲線」都完全相同,只是使用了初始猜測。

這是腳本:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 
import scipy 
import math 
import csv 
import matplotlib as mpl 

mpl.rcParams['text.usetex']=True 
mpl.rcParams['text.latex.unicode']=True 

#model 
def fitFunc(P_max, x, x_0, w_z): 
    print P_max 
    print x_0 
    print w_z 
    return 0.5 * P_max * (1 - scipy.special.erf((scipy.sqrt(2) * (x - x_0))/w_z)) 

fig = plt.figure() 

#for-loop to read and curve fit for all data sets 
for n in range (1,7): 
    x_model = np.linspace(-1,6,5000) 
    y_model = [] 
    x = [] 
    P = [] 
    name = 'data_' + str(n) 
    with open(name + '.csv', 'rb') as f: 
     data = csv.reader(f, delimiter = ';') 
     for row in data: 
      x.append(float(row[1])) 
      P.append(float(row[2])) 
     fitParams, fitCovariances = curve_fit(fitFunc, np.array(x), np.array(P), [540, 2.5, 2]) 
     print fitParams 
     print fitCovariances 

    for i in range(0, len(x_model)): 
     y_model.append(fitFunc(fitParams[0], x_model[i], fitParams[1], fitParams[2])) 

    ax = fig.add_subplot(2,3,n, axisbg='white') 
    ax.scatter(x,P) 
    ax.plot(x_model,y_model) 
    ax.set_xlim([0, 6]) 
    ax.set_ylim([0, 600]) 
    ax.set_xlabel(r'\Delta x') 
    ax.set_ylabel(r'P (\mu W)') 

plt.tight_layout() 
plt.show() 

我真的不能找到什麼即時通訊做錯了。我希望你們能幫助我。謝謝:)

注意:您可以下載數據文件here來嘗試使用相同數據的腳本。

+1

顯示由腳本輸出的輸出。特別是,你會得到什麼'fitCovariances'? –

+0

我已將它添加到問題中。我覺得'fitCovariances'都是無限的,這似乎很奇怪。 – SjonTeflon

+3

你確定'fitFunc'中的這個變量順序是可以的嗎? 'help(curve_fit)'告訴我'模型函數f(x,...)。它必須將獨立變量作爲第一個參數,並將參數作爲獨立的剩餘參數。 –

回答

3

你唯一的問題是fitFunc的定義。從help(curve_fit)

Parameters 
---------- 
f : callable 
    The model function, f(x, ...). It must take the independent 
    variable as the first argument and the parameters to fit as 
    separate remaining arguments. 

這意味着你必須將你的x輸入成爲你的函數的第一個參數。這隻會影響2行:你的fitFunc定義,

#def fitFunc(P_max, x, x_0, w_z): #original 
def fitFunc(x, P_max, x_0, w_z): 
    print P_max 
    print x_0 
    print w_z 
    return 0.5 * P_max * (1 - scipy.special.erf((scipy.sqrt(2) * (x - x_0))/w_z)) 

和繪圖時fitFunc顯式調用:

for i in range(0, len(x_model)): 
    y_model.append(fitFunc(x_model[i], fitParams[0], fitParams[1], fitParams[2])) 

結果: fixed_fits

我想你和SciPy的做得很好:)

效率注:

我不明白了一個道理,爲什麼你fitFunc不會與矢量值x輸入工作(和它)。這意味着當繪製擬合模型時,您可以省去循環i,您可以說

y_model=fitFunc(x_model, fitParams[0], fitParams[1], fitParams[2]) 
相關問題