def birch_murnaghan_fit(energies, volumes):
"""
least squares fit of a Birch-Murnaghan equation of state curve. From delta project
containing in its columns the volumes in A^3/atom and energies in eV/atom
# The following code is based on the source code of eos.py from the Atomic
# Simulation Environment (ASE) <https://wiki.fysik.dtu.dk/ase/>.
:params energies: list (numpy arrays!) of total energies eV/atom
:params volumes: list (numpy arrays!) of volumes in A^3/atom
#volume, bulk_modulus, bulk_deriv, residuals = Birch_Murnaghan_fit(data)
"""
fitdata = np.polyfit(volumes[:]**(-2./3.), energies[:], 3, full=True)
ssr = fitdata[1]
sst = np.sum((energies[:] - np.average(energies[:]))**2.)
#print(fitdata)
#print(ssr)
#print(sst)
residuals0 = ssr/sst
deriv0 = np.poly1d(fitdata[0])
deriv1 = np.polyder(deriv0, 1)
deriv2 = np.polyder(deriv1, 1)
deriv3 = np.polyder(deriv2, 1)
volume0 = 0
x = 0
for x in np.roots(deriv1):
if x > 0 and deriv2(x) > 0:
volume0 = x**(-3./2.)
break
if volume0 == 0:
print('Error: No minimum could be found')
exit()
derivV2 = 4./9. * x**5. * deriv2(x)
derivV3 = (-20./9. * x**(13./2.) * deriv2(x) -
8./27. * x**(15./2.) * deriv3(x))
bulk_modulus0 = derivV2 / x**(3./2.)
#print('bulk modulus 0: {} '.format(bulk_modulus0))
bulk_deriv0 = -1 - x**(-3./2.) * derivV3 / derivV2
return volume0, bulk_modulus0, bulk_deriv0, residuals0
评论列表
文章目录