我正在尝试将数据放入 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.
不知道如何改进,因为我对参数的最初猜测是一个非常好的猜测。感谢您的帮助。
最佳答案
由于其 n^n
依赖性,您的 dulong 函数对 n 的变化高度敏感。您可能需要为其设置界限,或者甚至将其保留为常数(如果这对您来说足够好)。
此外,如果您正在处理足够小的时间尺度,您可以考虑使用近似函数。如果不是,请尝试取临时数据的对数并拟合 dulong 函数的对数。如果算法在改变 n 时采取太大的步骤,这可能很有用。
出于调试目的,您可以在函数中添加一行来打印传递的参数,这样您就可以看到哪个参数变化了多少,并且可以从那里开始工作。 作为另一种措施,您可以查看 scipy.optimize 中的最小化函数,在那里您将能够指定更多选项,例如要采用的求解算法和步长,您还可以传递雅可比矩阵以进一步提高效率。
关于python - Curve_fitting 数据(我接近参数值,但 curve_fit 表示未找到最佳参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39437133/