根据简单的示例here,我正在尝试使用Scipy.Optimise Curve_fit使指数适合某些数据。
该脚本运行没有错误,但是匹配非常糟糕。当我在curve_fit的每个步骤中查看popt的输出时,从初始参数跳到一系列1.0s似乎都没有很好地迭代,尽管看起来第3个参数又回到了一个不错的值:] >
92.0 0.01 28.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.00012207031 1.0 1.0 1.0 1.00012207031 1.0 1.0 1.0 1.00012207031 1.0 1.0 44.3112882656 1.00012207031 1.0 44.3112882656 1.0 1.00012207031 44.3112882656 1.0 1.0 44.3166973584 1.0 1.0 44.3112896048 1.0 1.0 44.3112882656
我不确定是什么原因造成的,除了也许模型虽然不能很好地适应数据,尽管我强烈怀疑应该这样做(物理学就是物理学)。有任何想法吗?我已经在下面发布了我的(非常简单的)脚本。谢谢。
#!/usr/bin/python import matplotlib.pyplot as plt import os import numpy as np from scipy.optimize import curve_fit from matplotlib.ticker import* from glob import glob from matplotlib.backends.backend_pdf import PdfPages import fileinput path_src=os.getcwd() dirlist= glob(path_src + '/Gel_Temp_Res.txt') dirlist.sort() plots_file='Temp_Curve.pdf' plots= PdfPages(path_src+'/'+plots_file) time=[] temp=[] for row in fileinput.input(path_src + '/Gel_Temp_Res.txt'): time.append(row.split()[0]) temp.append(row.split()[1]) nptime=np.array(time, dtype='f') nptemp=np.array(temp, dtype='f') del time[:] del temp[:] # Newton cooling law fitting def TEMP_FIT(t, T0, k, Troom): print T0, k, Troom return T0 * np.exp(-k*t) + Troom y = TEMP_FIT(nptime[41:], nptemp[41]-nptemp[0], 1e-2, nptemp[0]) yn = y + 0.2*np.random.normal(size=len(nptime[41:])) popt, pcov = curve_fit(TEMP_FIT, nptime[41:], yn) # Plotting ax1 = plt.subplot2grid((1,1),(0, 0)) ax1.set_position([0.1,0.1,0.6,0.8]) plt.plot(nptime[41:], nptemp[41:], 'bo--',label='Heater off', alpha=0.5) plt.plot(nptime[41:], TEMP_FIT(nptime[41:], *popt), label='Newton Cooling Law Fit') plt.xlim(-25, 250) plt.xlabel('Time (min)') plt.ylabel('Temperature ($^\circ$C)') ax1.grid(True, which='both', axis='both') plt.legend(numpoints=1, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) plt.savefig(plots, format='pdf',orientation='landscape') plt.close() plots.close()
另外,这是我要拟合的数据:
100 124
130 120
135 112
140 105
145 99
150 92
155 82
160 75
165 70
170 65
175 60
180 56
185 55
190 52
195 49
200 45
205 44
210 40
215 39
220 37
225 35
我正在尝试使用Scipy.Optimise Curve_fit使指数适合某些数据,此简单示例如下。脚本运行没有错误,但是适合程度很差。当我看着...
大负指数