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

标签 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.

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

最佳答案

由于其 n^n 依赖性,您的 dulong 函数对 n 的变化高度敏感。您可能需要为其设置界限,或者甚至将其保留为常数(如果这对您来说足够好)。

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

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

关于python - Curve_fitting 数据(我接近参数值,但 curve_fit 表示未找到最佳参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39437133/

相关文章:

python - (Python,数据帧): Add a Column and insert the nth smallest value in the row

python - 在 Python 中拟合分箱对数正态数据

python - python可以控制itunes之类的应用吗?

python - 编写仅采用特定类型的方法的正确 python 方法是什么?

python - 计算两个点阵列之间成对角度的矩阵

python - 从一个源WAV构造几个WAV文件

c# - 使用 Math.Net 的基于指数的曲线拟合

python - Curve.fit优化错误: 'Covariance of the parameters could not be estimated

Python:比较两个字典列表

python - 使用 Python 和 Numpy 实现根升余弦 (RRC) 滤波器的简单方法