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 # 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]) # 被積分関数を定義 def func(x): expx = exp(x) expx1 = expx - 1.0 return pow(x, 4) * expx / expx1 / expx1 def main(): 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()