cms.integration.debye_function のソースコード

import sys
import random
from math import exp
import numpy as np
from scipy import integrate             # 数値積分関数 integrateを読み込む
from matplotlib import pyplot as plt

"""
Calculate Debye function fD(y).
Mol const. V heat capacity: CV = 3R * fD(TD/T), where TD is the Debye temperature.
"""

# Debye Temperature
TD = 300.0 # K

# Calculate T range
Tmin  = 0.0
Tmax  = 400.0
Tstep = 10.0


# 被積分関数を定義
[ドキュメント] def func(x): expx = exp(x) expx1 = expx - 1.0 return pow(x, 4) * expx / expx1 / expx1
[ドキュメント] def main(): # Treat argments argv = sys.argv if len(argv) == 1: print("Usage: python debye_function.py TD Tmin Tmax Tstep") print(" e.g.: pythnon debye_function.py 300 0 500 10") exit() if len(argv) >= 2: TD = float(argv[1]) if len(argv) >= 3: Tmin = float(argv[2]) if len(argv) >= 4: Tmax = float(argv[3]) if len(argv) >= 5: Tstep = float(argv[4]) T = [] fD = [] nT = int((Tmax - Tmin) / Tstep) + 1 print(" T(K) T/TD integ fD(T/TD)") for i in range(nT): Ti = Tmin + i * Tstep T.append(Ti) # 温度が 0 K のときは y=>∞ となって計算できないので、極限値 0 を与える if Ti <= 0.0: y = 0.0 fD.append(0.0) integ = 0.0 else: y = TD / Ti ret = integrate.quad(func, 0.0, y) integ = ret[0] fD.append(3.0 / pow(y, 3) * integ) print("%6.1f\t%6.4f\t%12.6g\t%8.4f" % (Ti, y, integ, fD[i])) #============================= # グラフの表示 #============================= fig = plt.figure() ax1 = fig.add_subplot(1, 1, 1) ax1.plot(T, fD) ax1.plot([Tmin, Tmax], [1.0, 1.0], color = 'red', linestyle = 'dashed', linewidth = 0.5) ax1.plot([TD, TD], [0.0, 1.1], color = 'red', linestyle = 'dashed', linewidth = 0.5) ax1.set_title('Debye function (TD=%g K)' % (TD)) ax1.set_xlabel("T (K)") ax1.set_ylabel("fD(TD/T)") ax1.set_xlim([Tmin, Tmax]) ax1.set_ylim([0, 1.1]) plt.pause(0.1) print("Press ENTER to exit>>", end = '') input()
if __name__ == '__main__': main()