2013-12-08 61 views
1

我已經編寫了一個正在執行測量數據參數識別的程序。公式爲:Scipy curve_fit在測量數據擬合上失敗

f = k0 * x + c1 *(x-x1)^ e1 + c2 *(x-x2)^ e2。

(它呈現這樣,因爲我還沒有允許把這裏拍照)

我必須找到該公式的正確的參數和參數是K0,X,1,E1,C2,X2 ,e2。線性部分很容易找到。所以我得到K0和x1.My的第一個問題是:此代碼正確的公式

x = [0.4,0.5,0.513,1.02,1.5,2,2.25,2.75,3,3.3,3.51,3.75,4,4.3,4.5,4.7] 
y = [65,115,135,150,170,300,400,600,700,800,1064,1401,1935,2616,3697,4693] 

x_np = np.array(x) 
y_np = np.array(y) 

p0 =(0.1,10) 

def advance(x,c2,e2): 
    k0 = 166.801522505 
    c1 =0.195545880867 
    x1 = 0.3 
    x2 = 4.7 
    print c1 
    return k0*x+c1*np.power((x-x1),e1)+c2*np.power((x-x2),e2) 


standard_fitting = scipy.optimize.curve_fit(advance, x_np, y_np, p0) 

第二個問題是,我的代碼是沒有做curve_fitting這個曲線。如果我在裝配期間打印變量,則Python插入器只打印nan

+1

你能清理你的示例代碼嗎? 'advance'不返回任何內容,'x2'未定義。 –

+0

謝謝。我忘了放在這裏'return'和'x2' –

+0

你只是有太多的擬合參數,因此必須提供良好的參數估計。目前,您不提供任何優化算法,因此無法收斂。 –

回答

0
x = [0.4,0.5,0.513,1.02,1.5,2,2.25,2.75,3,3.3,3.51,3.75,4,4.3,4.5,4.7] 
y = [65,115,135,150,170,300,400,600,700,800,1064,1401,1935,2616,3697,4693] 

x_np = np.array(x) 
y_np = np.array(y) 

p0 =(0.1,10) 

def advance(x,c1,e1): 
    k0 = 166.801522505 
    x1 = 0.3 
    print c1 
    return k0*x+c1*np.power((x-x1),e1)#+c2*np.power((x-x2),e2) 


standard_fitting = scipy.optimize.curve_fit(advance, x_np, y_np, p0) 

這會聚並運行。您的示例代碼仍然無法運行。另外,我不建議使用該數據擬合兩個以上的參數,這兩個參數擬合看起來相當不錯,所以您可能沒有足夠的信息來有意義地適合任何更多的參數。

編輯:哦,我看到那裏曾經是一個線性部分。也許那麼這將是值得更多的參數,但我懷疑雙冪律模型會有所幫助。

如果你想使用更多的參數,你需要很好的猜測。因此,例如,如果您想將k0作爲參數,請使用y的均值或中值或最小值作爲猜測值。先確定兩個參數,然後使用它的輸出作爲下一個擬合輸入的猜測。

+0

我已經使用線性迴歸來計算k0和x1 –

相關問題