1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

エントロピーとは結局何だったのか。Pythonでシミュレーションで見るエントロピー

1
Last updated at Posted at 2026-05-16

導入

親や嫁に「なんで部屋が散らかっているの!」と言われ、「エントロピーは増大するから仕方ないね」なんて言っている人のなんと多いことか...
本記事ではわかりにくい概念であるエントロピーをシミュレーションをして、理解してもらおうと思う。

目次

  1. 熱力学における状態
  2. エントロピーと状態数
  3. 実装と結果

1章 熱力学における状態

熱力学には様々な物理量が存在し、圧力$P$,体積$V$,化学ポテンシャル$\mu$,そしてエントロピー$S$等無数にある。しかし最も基礎的な量は三つだけである。
それはエネルギー$E$,体積$V$,粒子数$N$である。これらによってそれぞれの熱力学的な量を計算することができる。

2章 エントロピーと状態数

あるエネルギー$E$,体積$V$,粒子数$N$の系が何通りあるかを$\Omega$で表し、それを状態数という。
ここで一つモデル化を行う。
名称未設定ファイル-ページ1.drawio.png

箱が4つ(V=4)、球体が二つ(N=2),シールが6つ(E=6)であり、すべての粒子がある箱の中に重複を許さずにいれ、シールは重複を許してボールに張り付けることにする。これはエネルギーをある場所にある粒子に対して割り振ることと対応している。
この時の状態数はコンビネーション$\ _nC_r$を用いて以下のように計算される。

\ _4C_2\times \ _{7}C_6 = 42 通り

より一般化すると

\Omega = \ _vC_n\times \ _{N+E-1}C_E \tag{1}

この時エントロピー$S$は対数を用いて以下のように計算する

S = k_b\log\Omega\tag{2}

このエントロピーはあるうれしい性質を持つ。
系二つが($E_1$,$V_1$,$N_1$)、($E_2$,$V_2$,$N_2$)であるとき、これらの全体の系のエントロピーはもともとの系のエントロピーの足し合わせ$S_1+S_2$になる。(ここでは粒子とエネルギーの交換がないものとする)
これはそれぞれの状態数に着目することによって理解できる。
系1の状態数が$\Omega_1$,系2の状態数が$\Omega_2$のとき全体の系の状態数は場合の数の性質より$\Omega_1\times\Omega_2$になる。これに対してエントロピーは対数を取る。

S_{sum} = k_b\log\Omega_1\Omega_2 = k_b(\log\Omega_1+\log\Omega_2) = S_1+S_2\tag{3}

つまり独立な系の足し合わせであれば、単純なエントロピーの足し合わせで済む。
ここに粒子とエネルギーの移動を考えると系1の粒子が系2の箱に入ったり、系1のエネルギーシールが系2の粒子に貼られるパターンを考えなければならないため、状態数はさらに増え、($S_{sum}\ge S_1+S_2$)になる。

3章 実装と結果

前章のエントロピーをpythonでシミュレーションすることを考える。
各粒子に対してidとエネルギーと入っている系のidを定義する。

class Partcle():
  def __init__(self,E):
    self.E = E
    self.v = math.sqrt(E)
    self.systemId = (SYSTEM_SIZE)//2*SYSTEM_SIZE + (SYSTEM_SIZE)//2

また系のクラスを以下のように定義する。
idと(E,N,V)とエントロピーを式(1)(2)のように計算する。

class System():
  def __init__(self,id,V):
    self.id = id
    self.V = V
    self.sumE = None
    self.N = None
    self.S = None

    x = id % SYSTEM_SIZE
    y = id // SYSTEM_SIZE
    self.edges = [posToId(x+1,y),posToId(x-1,y),posToId(x,y+1),posToId(x,y-1)]
  def setE(self,particles):
    self.N = 0
    self.sumE = 0
    for i in range(len(particles)):
      if(particles[i].systemId == self.id):
        self.sumE += particles[i].E
        self.N += 1
  def culcS(self):
    spatial = log_comb(self.V, self.N)
    energy = log_comb

        self.sumE + self.N - 1,
        self.sumE
    )
    return spatial+energy

この系を5x5の正方形に並べ、その中に1万粒子を配置する。要件は以下のようになる。

Particle(P)

$$
P.id \in {1,2,3...10000},P.E \in {1,2,3...100}
$$

System(S)

$$
S.id \in {1,2,3...25},S.V \in {10^6...10^7}
$$

ある粒子はそれが所属している系の体積と自身のエネルギーによって上下左右の系に移動する。確率は以下のように定義する。

parcent = 1000*math.sqrt(p.E)/s.V

これをすべての粒子で3000ステップ繰り返し、エントロピーを計算する

結果

シミュレーションをした結果は以下のようになる。
左が各系の粒子数のエネルギーをテキストで、色はそれぞれのエントロピーの高さを表す。
右は全系の合計エントロピーを表す。
https://youtu.be/fEL3xx5g0YE

中央に置いた粒子が上下左右に遷移していく様子が見て取られ、それぞれの中心のもともとエントロピーが高かった系に関してはエントロピーが減少し、周りのエントロピーは増大する。
総体として全エントロピーはある値に収束していく。

異なる初期状態で行った結果のエントロピーの増加は以下のようになった
Figure_1.png
ほぼ同一のエントロピーに収束することが明らかになった。

終わりに

本記事の種本は「数理科学2026の5月号」である。あともう1本これを種本にかけると思う(体力次第ではあるが)

結局部屋は外部から粒子かエネルギーを持ってこないことにはエントロピーは増大していかないので、部屋に余計なものは持ち込まないのが最適ですね

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?