Python Scipy-Bodgy曲线拟合

Python Scipy-Bodgy曲线拟合,python,curve-fitting,Python,Curve Fitting,我使用未校准的罗盘在现场收集了简单的测量数据。意识到这一问题,在现场,测量方位,比较好的罗盘和未校准的罗盘,以及11个方位记录的差异。图中显示的差异非常接近于sin函数。 我希望将多项式(3次)拟合到此结果函数,以使用未校准罗盘校正测量数据。我的曲线拟合程序生成的曲线拟合效果不佳。有人能看出哪里出了问题吗 import numpy as np import scipy import pylab correctCompass=\ np.array([134.4,112.6,069.7,051.1,

我使用未校准的罗盘在现场收集了简单的测量数据。意识到这一问题,在现场,测量方位,比较好的罗盘和未校准的罗盘,以及11个方位记录的差异。图中显示的差异非常接近于sin函数。 我希望将多项式(3次)拟合到此结果函数,以使用未校准罗盘校正测量数据。我的曲线拟合程序生成的曲线拟合效果不佳。有人能看出哪里出了问题吗

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()

polyfit
工作正常,问题是
diff
中的一个负点降低了拟合,但当您将yaxis的最低值设置为-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([0360,-10.0,高度])你会看到“问题”

此外,您可以改进代码并使其更具可读性,使用以下三行替换两个嵌套for循环:

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

pylab包含numpy,因此导入这两个是多余的。我建议
将matplotlib.pyplot导入为plt
,Numpyuhhh只是没有看到这一点。我意外地将81转为18,没有看到数据点错误,因为它偏离了绘图。谢谢你关于分类的提示,这是一个很好的技巧。不客气。它确实发生了。作为规则:如果你必须做一些暗示for循环的事情,试着:1)找到一些不需要
for
的解决方案(列表理解、numpy、列表之间的操作、数组等等);2) 如果无法避免,请查看是否可以避免嵌套循环(在本例中,
itertools
通常是您的朋友)