Curve_fitting数据(我接近params值,但curve_fit表示未找到最佳参数)

时间:2016-09-11 14:33:15

标签: python scipy curve-fitting

我正在尝试将this file中的数据与来自Python中的scipy的curve_fit相匹配。该文件包含温度与时间的数据点,单位为摄氏度和毫秒。我将它们转换为开尔文和秒:

thefile = open("aluminio_33920um_aire.txt", "r")
data = np.loadtxt(thefile, delimiter='\t', skiprows=1)
Temp = data[:, 0] + 273.15  #kelvin
Time = data[:, 1]*1e-3  #secs
thefile.close()

我定义了几个适合的函数:

def newton(t, a, b, tau):
    return a + b * np.exp(-t/tau)

def dulong(t, ta, dift, f, n):
    return ta + (dift + (n-1)*t/f)**(1/(1-n))
牛顿的装修效果很好。但是独龙不是。我已经为duolong的参数绘制了几个值,以查看哪些值绘制了一条或多或少符合数据的行,并且我找到了这里给出的值:

poptd, pcovd = curve_fit(dulong, Time, Temp, p0=[295, 0.155, 6000, 1.38], sigma=[1]*len(Temp), absolute_sigma=True)

然而,将这些值p0传递给curve_fit并没有帮助,因为我收到了错误

RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000.

不知道如何改进,因为我的参数的初始猜测是一个非常好的猜测。感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

由于其window.localStorage依赖性,您的独龙功能对n的变化非常敏感。您可能希望为它设置边界,或者甚至将它保持为常量,如果这对您来说足够好。

此外,如果您处理足够小的时间尺度,您可以考虑使用近似函数。如果不是,请尝试获取临时数据的对数并拟合dulong函数的对数。如果算法在变化n时步长太大,这可能很有用。

出于调试目的,您可以在函数中添加一行来打印传递的参数,这样您就可以看到哪个参数变化了多少,您可以从那里开始工作。 作为另一个衡量标准,你可以看一下scipy.optimize中的最小化函数,在那里你可以指定更多的选项,比如求解算法和步长,你也可以通过jacobian来进一步提高效率。

答案 1 :(得分:2)

当我使用curve_fit函数调用dulong时,我收到以下警告:

  

RuntimeWarning: invalid value encountered in power

这表明,当curve_fit测试各种参数值时,dulong的评估需要计算(negative real)**(real)形式,这会导致复数。因此,优化过程失败。

一种方法是限制参数的搜索空间,以便不会发生此问题。在不知道参数的物理意义的情况下,我可以看到,只要n大于1且所有其他参数都是非负数,dulong将只返回实数。

如上所述使用curve_fit选项调用bounds可以找到最佳参数。

poptd, pcovd = curve_fit(dulong, Time, Temp, p0=[295, 0.155, 6000, 1.38], sigma=[1]*len(Temp), absolute_sigma=True,
                        bounds = ([0,0,0,1],[1000,1,10000,10]))

print(poptd)
  

[ 304.5965 0.0857 9999.1743 1.5099]

这是拟合的图表

enter image description here

答案 2 :(得分:0)

由于我还不能发表评论,我会发回另一个答案作为对你的评论的回复:第三个参数的大错误可能是由于算法不允许为其分配10000以上的值。调整你的它应该有效。