我正在尝试使用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();
答案 0 :(得分:0)
答案 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))