2013-01-14 33 views
1

我想在python中將一些數據擬合到一個公式中,並且我遇到了一些困難。我有方程:在python vs gnuplot中將數據擬合到一個公式中

y(t)=yo+a(t-ti)^b+kt 

其中atibk是擬合參數,和tdisp是陣列varaibles分別代表時間和位移。該公式將適合在一些迭代gnuplot的罰款,但在python裝修它拋出了一個錯誤: -

ValueError: array must not contain infs or NaNs 

完整的堆棧跟蹤是:

creep_test.py:246: RuntimeWarning: invalid value encountered in power 
    fitfunc = lambda p, t: disp_list[0]+(p[0]*(t-p[1])**p[2])+p[3]*t # Target function 
Traceback (most recent call last): 
    File "creep_test.py", line 374, in <module> 
    main() 
    File "creep_test.py", line 368, in main 
    python_fit(filename) 
    File "creep_test.py", line 256, in python_fit 
    out = optimize.leastsq(errfunc, p0[:], args=(t, disp,err), full_output=1) 
    File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 338, in leastsq 
    cov_x = inv(dot(transpose(R),R)) 
    File "/usr/lib/python2.7/dist-packages/scipy/linalg/basic.py", line 285, in inv 
    a1 = asarray_chkfinite(a) 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 590, in asarray_chkfinite 
    "array must not contain infs or NaNs") 
ValueError: array must not contain infs or NaNs 

我與周圍玩發現它的術語ti導致的問題在於,如果您的ti固定在35.5附近,配件將工作。我用一個電子表格,併爲下tit任何值,則公式拋出了一個#VALUE(可能是因爲它的假想)

基本上是有沒有辦法讓Python適合像gnuplot的曲線(我假設忽略無效的結果)?我用我的程序的fittiong部分代碼如下:

fitfunc = lambda p, t: disp_list[0]+(p[0]*(t-p[1])**p[2])+p[3]*t # Target function 
    errfunc = lambda p, t, y, err: (fitfunc(p, t) - y)/(err) # Distance to the target function 
    err=0.01 
    p0 = [ 50, 35.5,0.005, 0.001] # Initial guess for the parameters 
    out = optimize.leastsq(errfunc, p0[:], args=(t, disp,err), full_output=1) 
    print out[0] 
    print out[1] 

謝謝!

+0

你能告訴我們你的't'和'disp'看起來像什麼嗎? – ford

+0

對不起disp_list [0]是yo值(從我的數據讀取的列表中的第一個值(代表位移)),t是以秒爲單位的時間(獨立可用) – Phil

+0

oh和t是一個數組變量形式(同樣也是一個列表時間值) – Phil

回答

1

寶貴的經驗教訓。我正在使用的起始參數試圖打破我在此之前擬合的更簡單的方程式,現在打破了更復雜的方程式。如果配件聲稱解決方案沒有意義,請始終檢查您的啓動參數。學習python的方式很難,所以你不必......