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 的值。调整你的边界,它应该可以工作。
我正在尝试将 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 的值。调整你的边界,它应该可以工作。