我正在使用此代码来曲线拟合一些数据:
def extract_parameters(Ts, ts):
def model(t, Ti, Ta, c):
return (Ti - Ta)*math.e**(-t / c) + Ta
popt, pcov = cf(model, Ts, ts, p0 = (10, 6, 7))
Ti, Ta, c = popt
maxx = max(Ts)
xfine = np.linspace(0, maxx, 101)
print "xfine: ", xfine
yfitted = model(xfine, *popt)
print "yfittted", yfitted
pl.plot(Ts, ts, 'o', label = 'data point')
pl.plot(xfine, yfitted, label = 'fit')
pylab.legend()
pylab.show()
return Ti, Ta, c
当我进入时:
extract_parameters([1,2,3,4,5,6],[100,60,50,40,45,34])
我完美契合
但是当我进入时:
extract_parameters([1,2,3,4,5,6,7],[100,80,70,65,60,58,56])
我得到的是
谁能明白为什么?曲线拟合变化很大?
答案 0 :(得分:2)
像curve_fit
这样的优化器会尝试找到最佳匹配,但并不总是成功。
请注意extract_parameters([1,2,3,4,5,6],[100,60,50,40,45,34])
返回
(196.85292746741234, 38.185643828689777, 1.0537367332516778)
这意味着它以p0 = (10, 6, 7)
的初始参数猜测开始
并找到了通往不同位置的路。
您可以通过选择更接近最佳值的初始猜测来帮助优化器。只需将其更改为
即可p0 = (100, 6, 7)
允许
extract_parameters([1,2,3,4,5,6,7],[100,80,70,65,60,58,56])
找到更合适的人:(131.71232607048836, 54.894539483338022, 1.8503931318517444)
。