2013-02-03 4 views
1

교정되지 않은 나침반을 사용하여 현장에서 수집 한 간단한 측량 데이터가 있습니다. 이 분야에서 문제를 깨닫고 보정되지 않은 나침반과 11 개의 베어링에 기록 된 차이를 비교하여 좋은 나침반을 비교했습니다. 플롯은 그 차이가 죄 기능에 매우 가깝다는 것을 보여줍니다. 교정되지 않은 나침반을 사용하여 측량 데이터를 수정하기 위해이 결과 함수에 다항식 (차수 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 한 부정적인 점입니다하지만 당신은 -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]) 
에 y 축에 대해 가장 낮은 값을 설정 한 그 플롯에 표시되지, 잘 작동 당신이 언급하는 경우

pylab.axis([0,360,-10.0,height]) 당신은 개선하고 다음과 같은 세 가지 선 루프에 대한 두 개의 중첩 대체 코드를 읽기 쉽게 만들 수 있고, 게다가은 "문제"

가 표시됩니다

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

을 제안한다. Uhhhh는 그것을 보지 못했다. 실수로 81에서 18로 바뀌었고 데이터 포인트 오류가 보지 못했기 때문에 데이터 포인트 오류가 표시되지 않았습니다. 정렬에 대한 팁을 주셔서 감사합니다. 좋은 트릭입니다. – Keir

+0

반갑습니다. 그것은 일어난다. 규칙으로 : 루프를 암시하는 무언가를해야한다면 : 1) "for"(목록 이해력, numpy,리스트, 배열, ... 사이의 연산)을 필요로하지 않는 솔루션을 찾으십시오. 2) 피할 수없는 경우 중첩 루프를 피할 수 있는지 확인하십시오 (이 경우 itertools는 종종 친구입니다) –