在Matplotlib中使用Debye + Einstein模型进行比热拟合

时间:2019-05-23 08:46:06

标签: python curve-fitting

我正在尝试使用gamma T + m Debye_model +(1-m)* Einstein模型找到适合特定热量数据的模型,如下所示。

Cel + ph(T)=γT + [αCDebye(T)+(1-α)CEinstein(T)]

其中Debye和Einstein模型由等式给出。附件中的3和4。

我已经在jupyter笔记本中尝试了以下代码,并在网上举了一些例子,但我不知道如何将这些功能结合在一起以进行拟合。

数据已链接https://www.dropbox.com/s/u0r2m3zwl8w77at/HC_ScPtBi.dat?dl=0 第1列是温度,第3列是感兴趣的Y数据。 模型在https://www.dropbox.com/s/9452fq7eydajr5o/Debye.pdf?dl=0

代码在https://www.dropbox.com/s/hk9b1t0agvt36zn/Untitled2.ipynb?dl=0

from matplotlib import pyplot 
import numpy as np
from scipy import integrate
from scipy.optimize import curve_fit
from scipy.integrate import quad

data=np.genfromtxt('HC_ScPtBi.dat', skip_header=1)
R=8.314
n=3
M=1
T=data[10:290,0]
c=data[10:290,2]
def plot_data():
    pyplot.scatter(T, c)
    pyplot.xlabel('$T [K]$')
    pyplot.ylabel('$C$')

plot_data()
def c_einstein(T, T_E):
    x = T_E / T
    return 3 *n*R*x**2 * np.exp(x) / (np.exp(x) - 1)**2

popt0, pcov0 = curve_fit(c_einstein, T, c, 250)
T_E = popt0[0]
delta_T_E = np.sqrt(pcov0[0, 0])
print(f"T_E = {T_E:.5} ± {delta_T_E:.3} K")
print(popt0)

plot_data()
#temps = np.linspace(10, T[-1], 100)
pyplot.plot(T, c_einstein(T, *popt0));

def integrand(y):
    return y**4 * np.exp(y) / (np.exp(y) - 1)**2

@np.vectorize
def c_debye(T, T_D):
    x = T / T_D
    return 9 *n*R*x**3 * quad(integrand, 0, 1/x)[0]

popt1, pcov1 = curve_fit(c_debye, T, c, 150)
T_D = popt1[0]
delta_T_D = np.sqrt(pcov1[0, 0])
print(f"T_D = {T_D:.5} ± {delta_T_D:.3} K")
print(popt1)
plot_data()
pyplot.plot(T, c_einstein(T, *popt0), label='Einstein')
pyplot.plot(T, c_debye(T,  *popt1), label='Debye')
pyplot.legend();

2 个答案:

答案 0 :(得分:0)

如果有什么用,我就很好地拟合了修改后的Weibull峰方程,R平方= 0.99999,RMSE = 0.06878。

enter image description here

InvalidOperationException

答案 1 :(得分:0)

您需要将爱因斯坦方程式和德拜方程式合并为一个函数,该函数应如下所示:

def func(T, alpha,gamma,T_e,T_d):
   fn = lambda y: y**4 * np.exp(y) / (np.exp(y) - 1)**2
   einst = (1-alpha)*3*n*R*T_e**2/T**2 * np.exp(T_e/T) / (np.exp(T_e/T) - 1)**2
   debye_int = np.array([integrate.quad(fn, 0, T_d/t)[0] for t in T])
   debye = alpha*9*n*R*T**3/T_d**3*debye_int
   return einst+debye+gamma*T

然后您可以在曲线拟合中使用该功能

coefs = curve_fit(func, T, c)[0]
plt.plot(T, func(T, *coefs))