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

Curve_fitting data (I'm close to the params values, but curve_fit says optimal parameters not found)

我正在尝试将 this file 中的数据与 scipy 中 Python 中的 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))

newton 的拟合效果很好。但是独龙族没有。我已经为 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.

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

由于 n^n 依赖性,您的独龙函数对 n 的变化非常敏感。您可能需要为其设置界限,或者如果这对您来说足够好,甚至将其保持为常量。

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

出于调试目的,您可以在函数中添加一行来打印传递的参数,这样您就可以看到哪个参数变化了多少,然后您可以从那里开始工作。 作为另一种措施,您可以查看 scipy.optimize 中的最小化函数,在那里您将能够指定更多选项,例如求解算法和要采用的步长,您还可以传递雅可比矩阵以进一步提高效率。

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

RuntimeWarning: invalid value encountered in power

这表明,由于 curve_fit 测试参数的各种值,dulong 的评估需要计算 (negative real)**(real) 形式,这会产生一个复数。因此,优化过程失败。

一种方法是限制对参数的搜索 space,以免出现此问题。在不知道参数的物理意义的情况下,我可以看到,只要 n 大于 1 并且所有其他参数都是非负的,dulong 将 return只有实数。

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

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]

这是拟合图

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