2013-02-03 213 views
1

我有一個簡單的調查數據在現場採用未經校準的指南針。意識到這個問題,在這個領域,軸承被用來比較一個好的指南針與未校準的指南針以及11個軸承中記錄的差異。該圖顯示了與sin函數非常接近的差異。 我希望對這個結果函數擬合一個多項式(3級),以使用未校準的羅盤校正測量數據。我的曲線擬合程序產生的擬合曲線很差。任何人都可以看到什麼是錯的?Scipy Bodgy曲線擬合

import numpy as np 
import scipy 
import pylab 
correctCompass=\ 
np.array([134.4,112.6,069.7,051.1,352.5,314.6,218.3,258.2,237.8,186.5,153.7]) 
errorCompass=\ 
np.array([131.6,108.9,065.6,047.0,349.8,314.0,284.6,262.7,243.4,189.8,153.2]) 
# sort compass values 
for i in range(0,11): 
    for j in range(i+1,11): 
     if correctCompass[i] > correctCompass[j]: 
      tmp=correctCompass[j] 
      correctCompass[j]=correctCompass[i] 
      correctCompass[i]=tmp 
      tmp=errorCompass[j] 
      errorCompass[j]=errorCompass[i] 
      errorCompass[i]=tmp 

diff = correctCompass - errorCompass + 15.0 
height=diff.max() + 16.0 
polycoeffs = scipy.polyfit(correctCompass, diff, 3) 

# fit the data with a polynomial 
yfit = scipy.polyval(polycoeffs,correctCompass) 

pylab.plot(correctCompass, diff, 'k.') 
pylab.plot(correctCompass, yfit, 'r-') 

pylab.axis([0,360,-10.0,height]) 
pylab.show() 
+0

pylab包含numpy,所以導入這兩個是多餘的。我建議'輸入matplotlib.pyplot plt'和numpy –

回答

2

polyfit工作正常,問題出在diff是搞垮適合一個不利點,但一旦您爲y軸的最低值設定爲-10

diff = array([ 19.1, 19.1, 18.7, 17.8, 15.5, 11.7, -51.3, 9.4, 10.5, 15.6, 17.7]) 
是不是在你的圖中顯示

如果你對此有何評論pylab.axis([0,360,-10.0,height])你會看到「問題」

此外,你可以改善和使你的代碼更易讀以下三個行替換兩個嵌套的for循環:

sort = np.argsort(correctCompass) 
correctCompass = correctCompass[sort] 
errorCompass = errorCompass[sort] 
+0

呃,只是沒有看到。我意外地將81轉換爲18,並且沒有看到數據點錯誤,因爲它沒有出現這種情況。 Thankyou關於排序技巧是一個很好的技巧。 – Keir

+0

不客氣。它確實發生。作爲規則:如果你必須做一些暗示循環的事情,試着:1)找到一些不需要'for'(列表理解,numpy,列表,數組之間的操作)的解決方案; 2)如果你無法避免,看看你是否可以避免嵌套循環(在這種情況下'itertools'往往是你的朋友) –