1
0

More than 1 year has passed since last update.

「エントロピーと秩序」のプログラムをpythonで書く~カルノーサイクル

Posted at

初めに

去年の夏、エントロピーにはまっていていろいろな本を読んでいたのですが、その中の一つに「エントロピーと秩序」という本があります。この本の巻末にBASICで書かれたプログラムがいくつか載っているのですが、BASICの実行環境がないので実行できません。そこで、pythonで書き換えてみることにしました。

カルノーサイクル

ひとつめに載っているプログラムが「カルノーサイクル」です。

import math
import matplotlib.pyplot as plt

plt.xlabel("V")
plt.xticks(color="None")
plt.ylabel("P", rotation=0)
plt.yticks(color="None")

TU = int(input("高温部の温度"))
TL = int(input("低温部の温度"))
Q = int(input("膨張段階で吸収される熱量"))
VI = int(input("初期体積"))

VA = VI  # A点の体積
PA = TU / VA  # Aでの圧力
plt.annotate("A", (VA, PA))

# A-B(等温膨張)
VB = VA * math.exp(Q / TU)  # B点の体積
v = VA
xab = []
yab = []
while(v < VB):
    p = TU / v
    xab.append(v)
    yab.append(p)
    v += 0.1
plt.plot(xab, yab, "g")
PB = p  # B点での圧力
plt.annotate("B", (VB, PB))

# B-C(断熱膨張)
VC = ((PB / TL) * (VB ** 1.667)) ** 1.5  # C点の体積
PC = TL / VC  # C点での圧力
v = VB
xbc = []
ybc = []
while(v < VC):
    p = PB * ((VB / v) ** 1.667)
    xbc.append(v)
    ybc.append(p)
    v += 0.1
plt.plot(xbc, ybc, "y")
plt.annotate("C", (VC, PC))

# C-D(等温圧縮)
VD = ((PA / TL) * (VA ** 1.667)) ** 1.5  # D点の体積
PD = TL / VD  # D点の圧力
v = VC
xcd = []
ycd = []
while(v > VD):
    p = TL / v
    xcd.append(v)
    ycd.append(p)
    v -= 0.1
plt.plot(xcd, ycd, "r")
plt.annotate("D", (VD, PD))

# D-A(断熱圧縮)
xda = []
yda = []
v = VD
while(v > VA):
    p = PA * (VA / v) ** 1.667
    xda.append(v)
    yda.append(p)
    v -= 0.1
plt.plot(xda, yda, "b")
plt.show()

QC = TL * math.log(VC / VD)  # CD間で吸収される熱量
W = Q - QC  # 1サイクルで得られる仕事量
E = W / Q  # 効率

print(f"効率: {E:.2f}")

もともとは37行のプログラムだったのですが、書き直すと76行になってしまいました。本に書いてある通り、高温部の温度を1500、低温部の温度を1000、吸収される熱量を3000、初期体積を10で入力すると以下のようなグラフが表示されます。

img.jpg

それっぽいグラフが表示されるので問題なさそうです。
ちなみに、エントロピー系の本をいろいろ読んだ中で、私は「エントロピーと秩序」と「高校数学でわかるボルツマンの原理 : 熱力学と統計力学を理解しよう」が面白かったです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0