2 揺らぎと輸送現象 from fluctuations to transport phenomena ·...

22
熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本担当分): 25 2 揺らぎと輸送現象: From Fluctuations To Transport Phenomena この章では,前章で導入した ラ ン ジュバ ン Langevin運動方程式 というモデルを使って,ブラ ウン粒子の挙動を少し詳しく調べる.この現象は, マクロな (macroscopic,巨視的 ≒ 連続体的 continuous)輸送速度 セミマクロ semi-macro, mesoscopic なダイナミクス ミクロな(microscopic, 微視的 ≒分子レベルの , 離散的 discrete)熱揺らぎ という物理世界の階層性 hierarchy を統計力学の中でどのように取り扱うか,とい う問題の典型的な例を与えてくれる.本章の最後では,輸送係数をダイナミクスの 例えば 久保亮五(1920–1995)東京大 富田和久(1920–1991)京都大 中野藤生(1922–2009)名古屋大 中嶋貞雄(1923–2008)東京大 1926–2011)九州大 相関や熱揺らぎの大きさを用いて表す 揺動散逸定理 fluctuation–dissipation theorem に到達するが,これは,非平衡統計力学 Non-equilibrium Statistical Mechanics の大 きな成果であり,何人もの日本人研究者 が大きな貢献を果たした. (参考)日本物理学会誌 (2005) の記事より

Upload: others

Post on 28-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 25

2 揺らぎと輸送現象:

From Fluctuations To Transport Phenomena

この章では,前章で導入した  ラ ン ジュバ ン

Langevin 運動方程式 というモデルを使って,ブラ

ウン粒子の挙動を少し詳しく調べる.この現象は,

マクロな (macroscopic,巨視的 ≒ 連続体的 continuous)輸送速度

セミマクロ semi-macro, mesoscopic なダイナミクス

ミクロな(microscopic, 微視的 ≒分子レベルの , 離散的 discrete)熱揺らぎ

という物理世界の階層性 hierarchy を統計力学の中でどのように取り扱うか,とい

う問題の典型的な例を与えてくれる.本章の最後では,輸送係数をダイナミクスの例えば

久保亮五(1920–1995)東京大

富田和久(1920–1991)京都大

中野藤生(1922–2009)名古屋大

中嶋貞雄(1923–2008)東京大

森 肇 (1926–2011)九州大

相関や熱揺らぎの大きさを用いて表す 揺動散逸定理 fluctuation–dissipation theorem

に到達するが,これは,非平衡統計力学 Non-equilibrium Statistical Mechanics の大

きな成果であり,何人もの日本人研究者が大きな貢献を果たした.

(参考)日本物理学会誌 (2005) の記事より

Page 2: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 26

2.1 離散的な酔歩過程: Introduction—Discrete Random Walk

Langevin方程式を詳しく扱う前に,warming upとして,もっと簡単な 1次元酔

歩 random walk の問題を考えてみよう.

問題設定

 ある酔っ払いが,一本道を歩いている.意識が もうろう

朦朧 としているので,一歩ごと

に,前に進むか後戻りするかは確率的にしか決まらず,一歩前にどちらに進んだ

かさえ憶えていない.前に進む確率を p(0 ≤ p ≤ 1),後戻りする確率を 1 − p,

歩幅を∆x (ここでは定数と考える) とするとき,N 歩後にどこにいるかを調べよ.

[略解] もちろん,「どこにいるか」は確率的にしか求まらない.このような場合,まずは,平均 (average, mean value) と分散 (variance) を求めることを考えるのが確率

統計学の じょうとう

常套 手段 normal strategy である.

N 歩のうち,前に n歩,後ろに N − n歩進んだとする.そのときの位置は,初期位置を原点として

x(n;N) = [n− (N − n)]∆x = (2n−N)∆x (2–13)

その確率は,二項係数 binomial coefficient NCn を使って NCn は,N 個のものから,重複を許

さずに n 個を選ぶ場合の数(組み合

わせ combination)である.高校数学

で学んだはず.

NCn ≡N !

n!(N − n)!

ただし,! は階乗 factorial.

P (n;N) = NCnpn(1− p)N−n =

N !

n!(N − n)!pn(1− p)N−n (2–14)

である.もちろん,nは,0, 1, 2, . . . , N をとる.

まずは,P (n;N)が規格化 normalized されていることを確かめよう.公式 Iより

公式 I:2項展開(2項定理 binomialtheorem)

(p + q)N

=

∑n

NCnpnqN−n

∑n

P (n;N) =∑n

NCnpn(1− p)N−n = 1 (2–15)

続いて,平均位置を求めよう.公式 IIより

公式 II:両辺を p で微分すると

N(p + q)N−1

=

∑n

NCnnpn−1

qN−n

両辺に p を掛けると

Np(p + q)N−1

=

∑n

NCnnpnqN−n

⟨x⟩ =∑n

x(n)P (n;N)

=∑n

(2n−N)∆xP (n;N)

=

[2∑n

nP (n)−N∑n

P (n;N)

]∆x

= [2Np−N ]∆x

= N(2p− 1)∆x

∝ N (2–16)

一歩あたりの平均移動距離が p∆x− (1− p)∆x = (2p− 1)∆xであり,それぞれのステップが独立であるから,この結果は妥当なものである.

最後に,分散 variance を求めてみよう.公式 IIIを利用して 公式 III:公式 II をもう一度 p で微分すると

N(p + q)N−1

+ N(N − 1)p(p + q)N−2

=

∑n

NCnn2pn−1

qN−n

両辺に p を掛けて整えると

Np(Np + q)(p + q)N−2

=

∑n

NCnn2pnqN−n

分散 ≡⟨(x− ⟨x⟩)2

⟩=

⟨x2⟩− ⟨x⟩2

=

[∑n

(2n−N)2P (n;N)−N2(2p− 1)2

](∆x)2

=

[4∑n

n2P (n;N)− 4N∑n

nP (n;N) +N2 −N2(2p− 1)2

](∆x)2

Page 3: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 27

=[4Np [(N − 1)p+ 1]− 4N2p− 4N2(p2 − p)

](∆x)2

= 4Np [(N − 1)p+ 1−N −N(p− 1)] (∆x)2

= 4Np(1− p)(∆x)2

∝ N (2–17)

[別解] 各ステップが互いに独立であることを使うと,これらの結果は,実は別の方法でもっと容易に求めることができる.i番目のステップでの移動距離(変位)を∆i としよう.今考えている問題では,∆i = ±∆xである.その性質は

平均 ⟨∆i⟩ = p∆x− (1− p)∆x = (2p− 1)∆x (2–18)

2乗平均⟨∆2

i

⟩= p(∆x)2 + (1− p)(∆x)2 = (∆x)2 (2–19)

である.ところで,N ステップ後の場所は,∆i の和で表される:

x(N) =

N∑i=1

∆i (2–20)

各ステップは独立である(すなわち,「酔っ払いは一歩前のことも憶えていない」)と 各ステップが独立であるという仮定の

もとで時間変化していく過程を,一般

に Markov 過程とよぶ.(以下, Wikipedia より)

マルコフ過程とは,マルコフ性をもつ確率過程のことをいう.すなわち,未来の挙動が現在の値だけで決定され,過去の挙動と無関係であるという性質を持つ確率過程である.このような過程は例えば,確率的にしか記述できない物理現象の時間発展の様子に見られる.なぜなら,多くの物理現象は過去によらない微分方程式によって記述されるが,この性質は系の粒子数が多くなり確率論的な解析を必要とする状態にも引き継がれるからである.ロシア人数学者,アンドレイ マルコフ Andrey Andreyevich

Markov (1856–1922) にちなんで命名された.

仮定しているから,平均操作と summation は入れ替えることができて,

⟨x(N)⟩ =∑i

⟨∆i⟩

= N(2p− 1)∆x (2–21)

となって,式 (2–16)と一致する.同様にして

⟨x(N)2

⟩=

⟨[∑i

∆i

]2⟩=

∑i

⟨∆2

i

⟩+

∑i,j(i =j)

⟨∆i⟩ ⟨∆j⟩

= N(∆x)2 +N(N − 1)(2p− 1)2(∆x)2 (2–22)

従って,分散は 特に,p = 12の場合については,

平均 = 0,分散 = N(∆x)2

となる.分散が N に比例することに

注意しよう.

⟨x(N)2

⟩− ⟨x(N)⟩2 = N

[1− (2p− 1)2

](∆x)2 = 4N(p− p2)(∆x)2 (2–23)

となって,やはり式 (2–17)が得られる.

以上のように,酔歩問題においては平均も分散も歩数に比例することがわかる.

一歩進むのに単位時間かかると考えて,歩数を「時間」と読み替えると,確率的な

移動現象では,平均移動距離もその分散も,時間に比例すると予想できる.移動距

離が連続的な「ブラウン運動」でも同様であることを,次節で見る.

(補足)連続空間への移行: To Continuum Space 詳細は,確率論の適当な教科書,例え

ば,国沢清典「確率論とその応用」(岩

波全書,1982)などを参照されたい.確率 (2–14) が,有名な二項分布 binomial distribution B(N,n) である.ステップ数 N

が十分に大きい場合に二項分布が正規分布 (normal distribution, Gauss distribution) に近づくことはご存じだろう.それを簡単に示す.

そのためには,Stirling公式

lnm! ≃ m lnm−m (2–24)

あるいは,もう少し精度の高い近似式

m! =√2πmmm exp

[−m+

1

12m+O

(m−2

)](2–25)

Page 4: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 28

が必要となる.これを使うと,二項分布(しばらくは 1− p = q のままで話を進める)は

B(N,n) =N !

n!(N − n)!pnqN−n

≃√

N

2πn(N − n)

(Np

n

)n ( Nq

N − n

)N−n

(2–26)

nに代わって,平均からのずれ x ≡ n−Npを新たな変数に選ぶと

n = Np+ x (2–27)

N − n = N(1− p)− x = Nq − x (2–28)

となるから

B(N, x) =

√N

2π(Np+ x)(Nq − x)

(1 +

x

Np

)−Np−x (1− x

Nq

)−Nq+x

(2–29)

が得られる.さらに,N → ∞において |x| ≪ Np, |x| ≪ Nq を仮定すると,Taylor展開により

−(Np+ x) log

(1 +

x

Np

)≃ −(Np+ x)

[x

Np− x2

2N2p2+ · · ·

]= −x− x2

2Np+O

(x3

N2p2

)(2–30)

−(Nq − x) log

(1− x

Nq

)≃ −(Nq − x)

[− x

Nq− x2

2N2q2− · · ·

]= x− x2

2Nq+O

(x3

N2q2

)(2–31)

さらに,

Np+ x ≃ Np (2–32)

Nq − x ≃ Nq (2–33)

を使うと結局

B(N, x) ≃ 1√2πNpq

exp

[− x2

2Npq

](2–34)

あるいは,元の変数 nに戻すと

B(N,n) ≃ 1√2πNpq

exp

[− (n−Np)2

2Npq

](2–35)

となる.これは,平均 Np,分散 Npq の正規分布 あるいはガウス分布である.

 図 2–9 に,二項分布と正規分布を比較した例を示す.N = 10程度でもかなり良い近似であることがわかる.二項分布の場合と同じく,正規分布においても平均・分散ともに N に比例する という結果は重要である.

0

0.1

0.2

0.3

0.4

0 1 2 3 4 5

n

N=5

BinaryGauss

0

0.1

0.2

0.3

0 2 4 6 8 10

n

N=10

BinaryGauss

0

0.1

0.2

0 5 10 15 20

n

N=20

BinaryGauss

図 2–9: 二項分布と正規分布の比較; p = 0.3, q = 0.7の場合.

Page 5: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 29

2.2 ブラウン粒子の拡散挙動: Statistics of a Brownian Particle

それでは,Langevin方程式で記述される ブラウン粒子の変位の平均や分散 につ

いて考えてみよう.まず,速度に注目する.運動方程式 (1–1)を形式的に積分すると

v(t) = e−γm tv(0) +

∫ t

0

e−γm (t−t′) Fr(t

′)

mdt′ (2–36)

が得られる.

(略証) 逆に,式 (2–36)を微分すると

d

dtv = − γ

me−

γm

tv(0) +Fr(t)

m− γ

m

∫ t

0

e−γm

(t−t′) Fr(t′)

mdt′

= − γ

mv(t) +

Fr(t)

m

より,式 (1–1)を満たす.[証明終わり]

従って,白色雑音の性質 (1–2)より

⟨v⟩ = e−γm tv(0)

t→∞= 0 (2–37)

すなわち,m

γ程度の緩和時間 relaxation time で初期条件 v(0) を忘れて,平均が

ゼロとなってしまうことがわかる.

式 (2–36)をさらに積分すると,位置 の表式が得られる:

r(t)− r(0)

=

∫ t

0

dt′v(t′)

= −m

γ

[e−

γm t − 1

]v(0) +

∫ t

0

dt′∫ t′

0

dt′′e−γm (t′−t′′) Fr(t

′′)

m(2–38)

従って

⟨r(t)− r(0)⟩ = −m

γ

[e−

γm t − 1

]v(0)

t→∞=

m

γv(0) (2–39)

これは初速度がゼロに緩和するまでの間の移動量を表している.初速度 v(0) で時

間m

γだけ動き続ける,と考えると理解できるだろう.これ以降,話を簡単にする

ために 初速度をゼロ v(0) = 0 と仮定しよう. v(0) = 0と仮定すると,以下で分散な

どを求めるのに,初速度の項を考えな

くて済み,少し表式が簡単になるので.では,分散,すなわち平均2乗変位 (mean square displacement, MSD) を計算し

てみよう.式 (2–38)から

MSD ≡⟨[r(t)− r(0)]

2⟩

=

∫ t

0

dt′∫ t′

0

dt′′∫ t

0

dt′′′∫ t′′′

0

dt′′′′e−γm (t′−t′′+t′′′−t′′′′) 1

m2

⟨Fr(t

′′)Fr(t′′′′)

⟩=

C

m2

∫ t

0

dt′∫ t′

0

dt′′∫ t

0

dt′′′∫ t′′′

0

dt′′′′e−γm (t′−t′′+t′′′−t′′′′)δ(t′′ − t′′′′)

(2–40)

Page 6: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 30

この,δ関数を含む4重積分を計算するのは,少しコツがいる.こんな計算技術

が必要になる研究分野は限られていると思うので,詳細は飛ばしてもよいだろう.

スペクトル解析,量子化学計算,物性

物理学理論などの分野で,こうした計

算が必要になることがある.この分野

の研究をしている人は,一度は自分で

手計算してみることをお勧めする.(計算の詳細)

指数関数が,t′ − t′′ と t′′′ − t′′′′ の関数であることに着目して,4重積分の積分変数を次のように変換する:{

t′

t′′→

{s1 = t′ − t′′

t′′

{t′′′

t′′′′→

{s2 = t′′′ − t′′′′

t′′′′(2–41)

これは,右図のように積分の方向を変えたことを意味する.なおこの変換のヤコビアン Jacobian  t''

t'

t

t

積分変数の変換.黒い斜線方向から赤

い斜線方向に,積分方向を変換した.

は1であることに注意.この変換により,

MSD =C

m2

∫ t

0

ds1

∫ t−s1

0

dt′′∫ t

0

ds2

∫ t−s2

0

dt′′′′e−γm

(s1+s2)δ(t′′ − t′′′′)

=C

m2

∫ t

0

ds1

∫ t

0

ds2 e− γ

m(s1+s2)

∫ t−s1

0

dt′′∫ t−s2

0

dt′′′′δ(t′′ − t′′′′)

(2–42)

δ関数についての内側の2重積分は,t′′と t′′′′が等しい部分の長さを計算することになるから∫ t−s1

0

dt′′∫ t−s2

0

dt′′′′δ(t′′ − t′′′′) = min(t− s1, t− s2) (2–43)

よって,外側の2重積分は,右図を参照して次のようになる:

s1

t

t

s2

t-s1 > t-s2

t-s2 > t-s1

積分領域ごとの被積分関数の分類.

MSD =C

m2

[∫ t

0

ds1

∫ s1

0

ds2 (t− s1)e− γ

m(s1+s2)

+

∫ t

0

ds2

∫ s2

0

ds1 (t− s2)e− γ

m(s1+s2)

]=

2C

m2

∫ t

0

ds

∫ s

0

ds′(t− s)e−γm

(s+s′)

=2C

m2

∫ t

0

ds (t− s)e−γm

s

[−m

γ

] [e−

γm

s − 1]

=2C

∫ t

0

ds (t− s)[e−

γm

s − e−2γm

s]

(2–44)

部分積分により

MSD =2C

[(t− s)

[−m

γ

] [e−

γm

s − 1

2e−2

γm

s]∣∣∣∣s=t

s=0

+

[−m

γ

]∫ t

0

ds[e−

γm

s − 1

2e−2

γm

s]]

=2C

γ2

[1

2t+

m

γ

[e−

γm

t − 1

4e−2

γm

t − 3

4

]]=

C

γ2

[t+

2m

γ

[−3

4+ e−

γm

t − 1

4e−2

γm

t]]

(2–45)

以上の計算結果から,

MSD ≃

C

γ2t− 3m

2γ   for t ≫ m

γ

C

3m2t3    for t ≪ m

γ

(2–46)

であることがわかる.すなわち,長い時間 (t ≫ mγ ) が経過したのちは,酔歩問題の

時に予想した通り,ブラウン粒子の平均2乗変位は時間に比例して増大する.

Page 7: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 31

(補足) なお,t ≪ mγでの振る舞いを調べるためには,指数関数を Taylor展開す

る.すなわち

e−γm

t = 1− γ

mt+

1

2

mt)2

− 1

6

mt)3

+ · · ·

e−2γm

t = 1− 2γ

mt+ 2

mt)2

− 4

3

mt)3

+ · · ·

これを式 (2–45)に代入すると,定数項,tの1次項,2次項がすべて消えて,式 (2–46)

が得られる.

短い時間では,粒子は等速直線運動をすると考えてよい.だとすると,MSDは t2

に比例することになるが,今は簡単のために初速度 v をゼロと考えているので,tの2次までがすべて消えて3次から始まる,というのが物理的な解釈である.

この挙動を,数値計算で確かめるためには,統計平均を十分にとることが必要で

ある.そのためには,

  (i) 乱数の種 seedを変えて集団平均 ensemble averageをとる rand( )を使う場合には,p. 15で述

べたように,最初に srand(seed) を

呼ぶことで,異なる seedから始まる

乱数列を生成することができる.あるいは,

  (ii) 長時間の時間平均 time averageをとる

のがよい.図 2–11 に,時間平均をとることにより平均2乗変位を計算するプログ

ラムを載せた.図 2–10 のように,理論的予想とほぼ一致することがわかる.

-2

0

2

4

6

8

10

0 2 4 6 8 10

Me

an

Sq

ua

re D

isp

lace

me

nt

t

Resultst-1.5

図 2–10: ブラウン粒子の平均2乗変位の計算結果.

Page 8: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 32

// 2次元ブラウン運動の平均2乗変位#include <stdio.h>#include <stdlib.h>#include <math.h>

#define mass 1.0 // 粒子質量#define gamma 1.0 // 摩擦係数#define c_rand 1.0 // ランダム力の大きさ#define delta_t 0.1 // 時間刻み

#define total_step 100000 // 計算ステップ数#define out_step 1000 // 出力ステップ数

double fr( ){

double factor;

factor=sqrt((3*c_rand)/(2*delta_t));return ( rand( )/(double)RAND_MAX*2 - 1.0 ) * factor;

}

int main( ){

double x, y;double u, v;int step;FILE *fout;

int i, j;double dx, dy;static int count[out_step];static double msd[out_step];static double posx[total_step], posy[total_step];

fout = fopen("msd.dat","w");if (fout==NULL) {

printf("Error: cannot open file\n");return -1;

}

x=0.0; y=0.0;u=0.0; v=0.0;

for (step=0; step<total_step; step++) {// printf("%7.2f %10.3f %10.3f %10.3f %10.3f\n",step*delta_t,x,y,u,v);

x += delta_t * u;y += delta_t * v;u += delta_t/mass * (-gamma*u + fr( ));v += delta_t/mass * (-gamma*v + fr( ));posx[step]=x;posy[step]=y;

}

for (step=0; step<out_step; step++) { // カウンタ初期化count[step]=0;msd[step]=0;

}for (i=0; i<total_step; i++) { // 平均2乗変位の計算

printf("%d\n",i);for (j=i; j<total_step; j++) {

step=j-i;if (step<out_step) {

dx=posx[j]-posx[i];dy=posy[j]-posy[i];msd[step] += dx*dx + dy*dy;count[step]++;

}}

}

for (step=0; step<out_step; step++) {fprintf(fout, "%10.3f %10.3f\n", delta_t*step, msd[step]/count[step]);

}fclose(fout);

return 0;}

図 2–11: ブラウン粒子の平均2乗変位を計算するプログラム.

matsu
ハイライト表示
matsu
ハイライト表示
matsu
ハイライト表示
matsu
ハイライト表示
matsu
ハイライト表示
matsu
ハイライト表示
matsu
ハイライト表示
matsu
ハイライト表示
matsu
ハイライト表示
Page 9: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 33

2.3 ちょっと横道—C言語における配列の使い方とメモリについて:

Tips—How to Use Arrays of Huge Size

図 2–11 のプログラムでは,いったん粒子の座標データをすべて 配列 array に蓄

えてから,あとで平均2乗変位を求めている.配列の基本的な考え方は Fortranや

Basic言語と同じであるが,C言語はより「ハードウェアに近い」言語であり,例 逆に,この柔軟性のために思わぬメモ

リアクセスが発生して,システムがク

ラッシュする,といったバグが生まれ

やすい.悪用すれば,コンピュータウィ

ルスにつながることも…

えば,計算実行時に,必要な量だけメモリを確保するなど,柔軟な取扱いも可能で

ある.

ところで,大きな配列(例えば 100万個も要素があるような1次元配列や,各方

向を 1000分割した3次元格子を取り扱うような場合)をC言語で扱うには,ちょっ

とした注意が必要である.この節では,Cプログラミングにおける変数の扱い(メ

モリへの割り付け方)の基本について,まとめておく.C言語で本格的な数値計算

をおこなうためには,必要になることもあるであろう.

2.3.1 配列変数: Arrays

Cプログラムでは,次のように配列 arrayを扱う:

• 配列の宣言

(type) array [size ]

例えば,100個の倍精度実数の配列 position を確保・利用するためには,次

のように宣言する:

double position[100]; 添え字の範囲は,間違えやすいので初

心者は特に注意が必要.

  double position[100];

と宣言すると,どうしても

position[100]まで使いたくなるが,

先頭が0番地であるので,position[99]

までしか使えない.この,一見わかり

にくい方式にも理由があって,[ ]の

つかない配列変数がメモリ上でデー

タの先頭位置を示すからである.例え

ば,position[9] と書くと,その文

法的な意味は「メモリ上で position

によって示される位置から9つ後ろに

あるデータ」ということになる.詳し

くは,C言語の適当な参考書で「配列

とポインタ」の部分を参照されたい.

• 配列の利用

Fortran などと同様に,[ ] 内の添え字によって配列の位置を指定する.た

だしCプログラムでは,配列は,0 から size-1 までが確保されているの

で注意.例えば,全ての配列要素をゼロに初期化するコードは次のようになる:

for (i=0; i<100; i++) {

position[i] = 0;

}

• 多次元配列

例えば2次元配列なら

(type) array [size1 ][size2]

のように宣言する.メモリ上では

   array[0][0], array[0][1], array[0][2], ...,

   array[1][0], array[1][1], ..., array[size1-1][size2-1]

のように確保される.

Page 10: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 34

2.3.2 メモリ領域の話: Various Types of Memory Region

最近は,10万円程度のPCでも,8GB

以上ものメモリを持っていることが珍

しくない.試しに,100万個の倍精度

実数変数を確保するのに必要なメモリ

を見積もってみよう.倍精度実数は,

8 byte の大きさを持つので,

8 byte× 1, 000, 000

≃ 8 kbyte× 1, 000

≃ 8 Mbyte

となり,約 8MB で済む.1GB もあ

れば,OSなどの分を除いても,その

50 倍,5千万個くらいは利用できそ

うである.

 なお上の見積りでは,キロ = 103,

メガ= 106 で概算した.もちろん,正

確には,

キロ = 210 = 1, 024

メガ = 220 = 1, 048, 576

であるが,この概算も便利である.

ステップ数を増やしてブラウン粒子の位置データを長時間にわたってメモリ上に

蓄えようとすると,メモリ不足に遭遇するかも知れない.計算機は十分にメモリを

搭載しているはずなのに,プログラムの作り方が悪くて,そのメモリを有効に使え

ないことがある.そこで,Cプログラミングでのメモリの有効利用法について,簡

単に紹介する.

Cプログラムで扱えるメモリ領域は,図 2–12に示すように,4つに大別される:

(1) プログラム領域 program region:プログラムを実行するためのコード code の

本体が置かれる.計算は,この codeの指示で逐次,行われる.

(2) スタック領域 stack region:自動変数(後述)が置かれる.それ以外にも,関

数の引数や関数の戻り値,長い計算式の一時的変数などもここに置かれる.メ

モリのことを意識しないでプログラムを書くと,普通はこの領域が使われる.

(3) 静的領域 static region:外部変数や静的変数(後述)が置かれる.

(4) ヒープ領域 heap region:静的領域とスタック領域以外の第3のメモリ領域で

ある.malloc( )などメモリ割当関数を使って,実行時にメモリを動的に確

保する場合には,このヒープ領域が使われる.

stack = 干し草の山

heap = 塊

これらの領域を,それぞれどのように実装メモリに割り付けるかは処理系(OS)

に任されているが,一般に,自動で使えるスタック領域の大きさは比較的少量に限

られていることが多い.このため,計算機は十分なメモリを実装しているにもかか

わらず,スタックエラー stack errorのためにプログラムが実行できない,という症

状が現れる.

Program region Program region Program region

Stack region Stack region Stack region

“Standard” program Program with many

static variables

Program with dynamic

memory allocation

Static region

Heap region

Heap region

Heap region

Static region

Static region

図 2–12: コンピュータ内のメモリの使われ方の概念図.実際には,OSによってさまざまに異なる.

Page 11: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 35

2.3.3 記憶クラス: Concept of Storage Class

前項は変数をどのようにメモリに割り付けるかという話であったが,それとは別

に,プログラム中での変数の有効範囲と性質を決める記憶クラス storage class とい

う概念がある.C言語では次の4種類がある:

(1) 自動変数 auto variables

• 関数の内部で宣言される.• 変数の寿命は,宣言されてから関数の実行が終わるまで.• スタック領域に割り付けられる.

手元の計算機(OS:Windows7, Visual Studio 12.0, 8GB メモ

リ)で右のプログラムを試みたところ,NMAX は 130,000 程度

が限界で,それ以上は,コンパイルはできたにもかかわらず実

行できなかった.この系でのスタック領域のサイズは,恐らく,

220 = 8× 131072 byte 程度であろうと想像される.

#include <stdio.h>#include <math.h>#define NMAX 1000000

int main( ){

double data[NMAX];int i;for (i=0;i<NMAX;i++) data[i]=cos(0.01*i);return 0;

}

リスト 自動変数による配列宣言の例

(2) 静的変数 static variables

• 関数内部でも外部でも宣言できる.• 変数の寿命は,プログラム開始からプログラム終了まで.• 静的領域に割り付けられる.

上と同じ計算機では,NMAXは 200,000,000(≃1.6GB)を超え

ても実行できたが,400,000,000(≃3.2MB)では以下のエラー

メッセージが出た.16進法で 7fffffff は (24)8 の半分,つまり,

231 ≃ 2GB であり,これがこのコンパイラの限界らしい.

#include <stdio.h>#include <math.h>#define NMAX 1000000

int main( ){

static double data[NMAX];int i;for (i=0;i<NMAX;i++) data[i]=cos(0.01*i);return 0;

}

リスト 静的変数による配列宣言の例

> cl var-static.cpp

Microsoft(R) C/C++ Optimizing Compiler Version 18.00.31101 for x86

Copyright (C) Microsoft Corporation. All rights reserved.

var-static.cpp

var-static.cpp(7) : error C2148: 配列サイズの合計は 0x7fffffff バイトを超えることはできません。

>

(3) 外部変数 external variables

• 関数外部で宣言する.• 変数の寿命は,プログラム開始からプログラム終了まで.• 静的領域に割り付けられる.

静的変数の場合と同様の実行結果となった.

#include <stdio.h>#include <math.h>#define NMAX 1000000

double data[NMAX];

int main( ){

int i;for (i=0;i<NMAX;i++) data[i]=cos(0.01*i);return 0;

}

リスト 外部変数による配列宣言の例

matsu
ハイライト表示
matsu
ハイライト表示
matsu
ハイライト表示
Page 12: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 36

(4) レジスタ変数 register variables

• 関数内部で宣言する.

• 変数の寿命は,宣言されてから関数が終了するまで.

• メモリではなくCPUのレジスタ に割り付けられるので,アクセスが非

常に高速になる.

• レジスタ数には限度(それも非常に少数)があるので,割り付けできなかった変数は,auto指定と同じ扱いになる.

• ループの高速化など,特殊用途に用いる.普通は,このようなプログラム最適化はコンパイラが行うので,一般ユーザが直接利用することは少

ない だろう.

さらに,以上の区別とは別に,変数の利用範囲(宣言の有効範囲)をあらわすも

のとして,グローバル変数 とローカル変数 の区別がある.

• グローバル変数 global variables  プログラム全体で利用可能なものをい

う.上の例では,外部変数がこれに該当する.ただし,プログラムを幾つかの

ファイルに分けて作成する「分割コンパイル」の場合には,変数が宣言されて

いるファイル内でのみ利用できるので,プログラム全体で利用するためには,

ヘッダファイルを自作する.

• ローカル変数 local variables  宣言された関数内でのみ利用できるもの

をいう.上の例では,自動変数やレジスタ変数がそれに相当する.

なお,静的変数は,宣言する場所によって,グローバルにもローカルにもなるので

注意が必要である.

2.3.4 メモリの動的割付け: Dynamic Allocation vs. Static Allocation

多くの数値計算においては,予め配列のサイズがわかっているので,そのサイズ

で変数宣言することができる.また,予想されるサイズよりも大きめに宣言しても

よい(もちろん,メモリ領域が無駄に確保されてしまうが).一方,プログラムの実 これに対して,予めサイズを指定し

て宣言する方法を静的割付け static

allocation という.行時に,必要なだけメモリを確保することもできる.これを,動的割付け dynamic

allocationといい,計算対象の大きさに柔軟に対応できて,かつ限られたメモリを

有効に利用できるというメリットがあるが,バグが出やすいのでプログラミングに

は十分な注意が必要である.詳細は,Cプログラミングの解説書等で学んでいただ 不要になったメモリを解放するのを忘

れたため,プログラムを起動するたび

にメモリが食いつぶされて,やがてO

Sがフリーズする,というのは昔から

商用ソフトウェアでもよく見られるバ

グである.

きたい.

Page 13: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 37

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

int main( )

{

int i, size;

double *data;

scanf("%d", &size); // 配列サイズを入力 data = (double*)calloc(size, sizeof(double));

if (data==NULL) {

printf("Effor: out of memory\n");

return -1;

}

for (i=0;i<size;i++) data[i]=cos(0.01*i);

free(data);

return 0;

}

リスト メモリの動的割付けのプログラム例

(簡単な解説)上の例は,実行時に,配列のサイズ sizeを scanf( )で読み込んで,必要なメモ

リを動的に確保する例である.

  dataは,double型配列の先頭のアドレスを指すポインタとして宣言されている.

関数 calloc( )によって,size*8バイトのメモリ領域を確保しようとしている.確

保に成功すれば,calloc( )はその領域の先頭アドレスを返すので,それを data に

代入することで,アドレス dataから始まる size*8バイトの領域をユーザが利用で

きるようになる.もし確保できなければ,calloc( )は NULLを返すので,ユーザの

責任において例外処理をする.

確保できたとき,dataは配列の先頭ポインタであるから,

data[0], data[1], data[2], . . ., data[size-1]

は通常の double型配列である.このあたりは,配列とポインタの関係 をよく理解し

ておく必要があるだろう.この講義ではこれ以上深入りしない.

もちろん,必要な作業が終わったら,free( )によってメモリを解放しなければな

らない.解放しないでプログラムが終了すると,処理系によってはそれ以降,主メモ

リ上のその領域が再利用できなくなってしまい(メモリのリーク leakという),最

悪の場合はフリーズして,リブート(再起動)する羽目になる.

このような動的割付けを用いたプログラミングは,予め配列の大きさを考える必

要がないので便利であるが,割付けと解放に時間がかかるため,比較的計算量の少

ないプログラムで動的割り付けを繰り返すと計算効率の低下につながることがある.

また,動的割り付けを繰り返すと,メモリ上で占有されている領域がバラバラになっ

ていき (memory fragmentation),メモリアクセスの効率低下を招くことがある.言

語によっては自動的にメモリの不要領域を回収 (garbage collection) し,再配置す

る (memory compaction) 機能をもっている(例:Java, Ruby).

動的割付けは,コンパイル時に配列の

大きさが不明,あるいは大きさを見積

もるのに手間がかかるような場合には,

もちろん有効である.一般に,商用ソ

フトウェアは,ユーザのさまざまな作

業に対応するために動的割付けが多用

される.本講義の中で取り上げるプログラミング課題については,静的割付けをお勧めする.

Page 14: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 38

2.4 輸送係数と相関関数:

Transport Coefficients and Correlation Functions

2.2節での議論から,ブラウン粒子の平均2乗変位は,時間に比例することがわ

かった.これは,ブラウン粒子の拡散 diffusion が時間に比例していることを示して

おり,その比例係数が 拡散係数 diffusion coefficient に対応している.

∆ はラプラス演算子 Laplacian

∆ =∂2

∂x2+

∂2

∂y2+ · · ·

である.

ちなみに,δ 関数を初期値とする微分

方程式の解を一般に Green 関数とい

う.このような線形微分方程式の場合

は,初期値に応じて Green 関数を重

ね合わせることにより,任意の初期値

問題を解くことができるので,Green

関数が求まっていると便利である.

ここで,いきなり 拡散係数 が登場するのは,少し唐突に感じるかも知れない.後

の章でもう少し詳しく扱うつもりだが,ここで,ブラウン運動と拡散方程式の関

係 について簡単に触れておこう.

 拡散方程式 diffusion equation と聞けば,多くの人は次の形の微分方程式を

思い浮かべるだろう:∂c

∂t= D∆c (2–47)

ここで,c(r, t)は考えている物質の密度(あるいは濃度)であり,D が拡散係数

である.ブラウン粒子の運動に対応するのは,時刻ゼロにおいて原点にのみ存在

する場合の解の挙動である.すなわち,初期条件 c(r, t = 0) = C0δ(r) [ただし,

C0 は正定数]の下で,式 (2–47)を解けばよい.このような偏微分方程式(放物型

微分方程式 parabolic partial differential equation という)の基本的解法はおそ

らく,物理数学や工業数学などの授業で学んだと思うので,詳しく復習すること

は避けて,結果のみを示す:

c(r, t) =C0[

2√πDt

]ndexp

[− r2

4Dt

](2–48)

ここで,nd は次元数(2次元なら nd = 2)である.この解を用いて,平均2乗変

位,すなわち分散を求めてみる:⟨r2⟩

=

∫dr

x2 + y2 + · · ·[2√πDt

]ndexp

[− r2

4Dt

]= nd ×

∫ ∞

−∞dx

x2

2√πDt

exp

[− x2

4Dt

]= 2ndDt (2–49)

 これを,ブラウン粒子の結果,式 (2–46),と比べると

2ndD ≃ C

γ2(2–50)

のように,ランダム力の強さ C ,摩擦係数 γ,拡散係数 D の間に関係があるこ

とがわかる.これは,以下で見るように,揺動散逸定理 の一例である.

一般に,確率的に変化するような物理量 A(t)を考える.スカラー量でもベクト スカラー量の例としては,エネルギー

や質量,ベクトル量の例としては,運

動量や電流がある.ル量でもよい.これまでに見たように,その分散が時間 tに比例する場合に,輸送

係数 transport coefficient α を,次のように定義する:

α ≡ limt→∞

1

2t⟨[A(t)− A(0)]2⟩ (2–51) 係数 1

2は,上述の拡散方程式などマ

クロな輸送方程式で用いられる定義に

合わせるためである.自明な次式を用いて,式 (2–51)を変形する:

A(t)−A(0) =

∫ t

0

A(t′)dt′ (2–52)

Page 15: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 39

式 (2–51)に代入して,

-t t

t

t'

-t t

t

t'

積分変数の変換

⟨[A(t)−A(0)]2⟩

=

∫ t

0

dt′∫ t

0

dt′′⟨A(t′)A(t′′)⟩

=

∫ t

0

dt′∫ t−t′

−t′dτ⟨A(t′)A(τ + t′)⟩ ∵ τ = t′′ − t′ に変数変換

=

∫ 0

−t

∫ t

−τ

dt′⟨A(t′)A(τ + t′)⟩+∫ t

0

∫ t−τ

0

dt′⟨A(t′)A(τ + t′)⟩

   ∵積分を「横」から「縦」へ(右図を参照)

=

∫ t

0

∫ t

τ

dt′⟨A(t′)A(−τ + t′)⟩+∫ t

0

∫ t−τ

0

dt′⟨A(t′)A(τ + t′)⟩

   ∵第1項の τ → −τ に変数変換

=

∫ t

0

∫ t−τ

0

dt′⟨A(t′ + τ)A(t′)⟩+∫ t

0

∫ t−τ

0

dt′⟨A(t′)A(τ + t′)⟩

   ∵第1項の t′ − τ → t′ に変数変換

= 2

∫ t

0

∫ t−τ

0

dt′⟨A(t′)A(τ + t′)⟩

= 2

∫ t

0

dτ(t− τ)⟨A(0)A(τ)⟩ (2–53)

故に

limt→∞

1

2t⟨[A(t)−A(0)]

2⟩ = limt→∞

∫ t

0

(1− τ

t

)⟨A(0)A(τ)⟩dτ

=

∫ ∞

0

⟨A(0)A(τ)⟩dτ (2–54)

すなわち

α =∫ ∞

0⟨A(0)A(τ)⟩dτ (2–55)

この式は,輸送係数 α が物理量 A の時間変化 A の自己相関関数 autocorrelation

function の時間積分から求められることを示している.これは,久保の公式,ある 久保亮五 (1925–1995) 理論物理学者,

東京大学,慶應義塾大学名誉教授.線

形応答理論,揺動散逸定理,久保効果

(金属微粒子の物性)などで世界的に

著名.また,熱・統計力学の演習書(裳

華房)でも有名ですね.

いは 第1種揺動散逸定理 fluctuation–dissipation theorem of the first kind として知

られている.

この公式を,「ブラウン粒子の拡散挙動」に適用してみよう.このためには,

A ≡ r

とする.このとき

A ≡ v (2–56)

だから,次の自己相関関数 (速度自己相関関数 velocity auto correlation function,

VAF) を計算すればよい:

VAF(t) ≡ ⟨v(t0)v(t0 + t)⟩t0 (2–57)

Page 16: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 40

速度の表式 (2–36) から,

VAF(t) = e−γm (2t0+t)v2(0) +

∫ t0

0

dt′∫ t0

0

dt′′e−γm (2t0+t−t′−t′′) 1

m2⟨Fr(t

′)Fr(t′′)⟩

白色雑音の仮定より = e−γm (2t0+t)v2(0) +

C

m2

∫ t0

0

dt′∫ t0

0

dt′′e−γm (2t0+t−t′−t′′)δ(t′ − t′′)

= e−γm (2t0+t)v2(0) +

C

m2

∫ t0

0

dt′e−γm (2t0+t−2t′)

= e−γm (2t0+t)v2(0) +

C

2mγ

[e−

γm t − e−

γm (2t0+t)

](2–58)

以上より,速度自己相関関数 VAF(t) が次のような性質を持っていることがわ

かる:

(1)m

γ程度の緩和時間を持つ.これは,速度そのものの緩和時間と同じである.

(2) t0 ≫ m

γにおいては,初期条件の記憶を失って,

VAF(t) → C

2mγe−

γm t (2–59)

(3) この条件(「初期の記憶を失っている」)のもとで,切片 VAF(t = 0)を考え

ると

VAF(0) =C

2mγ(2–60)

であるが,エネルギー等分配則から,nd 次元では

m

2VAF(0) =

m

2⟨v2⟩ = nd

2kBT (2–61)

となるはずだから,両式を比較して

C = 2ndγkBT (2–62)

という関係がなければならない.

式 (2–62)の関係は,

• 溶媒分子のミクロな分子運動の強さの指標である温度 T

• その結果としてのランダム力の強さ C

• ブラウン粒子に対してメゾスケールで働く抵抗係数 γ

という,スケールの異なる階層に属する物理量を結びつける重要な関係であり,第

2種揺動散逸定理 fluctuation–dissipation theorem of the second kind とよばれるも

のの例である.

式 (2–59)から,輸送係数の表式 (2–55)の積分を手計算で求めることができる:

α ≃∫ ∞

0

C

2mγe−

γm t =

C

2γ2(2–63)

あるいは,第2種揺動散逸定理 (2–62)より

α =ndkBT

γ(2–64)

Page 17: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 41

すなわち

D =α

nd=

kBT

γ(2–65)

もちろん,これは,式 (2–50)から直接に

D =C

2ndγ2=

kBT

γ(2–66)

と求めることもできる.すなわち,ブラウン粒子の拡散係数Dは,温度が高いほど

大きく,摩擦係数が大きいほど小さい.温度が高いことは周囲の水分子が活発に動

いていることに対応し,摩擦係数が大きいことはブラウン粒子の運動を妨げる流体

抵抗が大きいことを意味するので,この結果は物理的に理解しやすいだろう.

2.5 「世界」の階層性: Hierarchy of Our World

以上のように,ブラウン粒子のダイナミクスについての考察から, kBT は水分子の熱運動に対応するの

で「ミクロ」,γは多数の水分子のため

にブラウン粒子が受ける摩擦力なので

「中間スケール」,D はブラウン粒子

の運動そのものを表す指標なので「マ

クロ」,というように考える.

• ミクロな熱揺らぎ kBT

• 中間スケールの摩擦係数 γ

• マクロな拡散係数 D ≡ α

nd

の,異なる空間スケールをもつ3つの物理量が結びついていることがわかった.特に,

3次元で,かつ粒子が球形である場合には,流体抵抗について流体力学の Stokes則

γ = 6πaη (2–67)

が知られている(a:粒子半径,η:粘性係数)から,式 (2–65) より

D =kBT

6πaη(2–68)

が得られる.これは,Stokes–Einsteinの関係式 とよばれる.原子の存在が不確か 現在では,この式を逆に使って,粘性

係数が既知の液体中に分散した微粒子

の拡散係数を測定して,その微粒子の

サイズを評価することがよく行われて

いる.次ページの 動的光散乱測定装

置 の例を参照.

だった 20 世紀初頭,Einstein が D, T , a, η という比較的測定しやすい物理量か

ら,ボルツマン定数 kB を評価する方法を提案したことが,原子の実在性の決め手

となった.

この関係式は,マクロな輸送係数がミクロな揺らぎから決定される という,階層

性 hierarchy の典型例である.

   マクロな輸送係数  例:拡散係数 D   ↑中間スケールの物性 例:摩擦力,粘性係数 γ, η   ↑分子レベルの運動  例:熱揺らぎによるランダム力 C, kBT   

久保の公式を利用して自己相関関数から輸送係数を求める例として,ほかに詳しくは,例えば,神山新一・佐藤明

「分子動力学シミュレーション」(朝倉

書店,1997)などを参照のこと.

• 運動量流束の自己相関関数を積分して,粘性係数を求める

• エネルギー流束の自己相関関数を積分して,熱伝導率を求める

• 電流密度の自己相関関数の積分から,電気伝導度(電気抵抗の逆数)を求める

などがよく利用されている.

Page 18: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 42

【参考】ベックマン・コールター株式会社のホームページから

https://ls.beckmancoulter.co.jp/column/particle/m principle/

動的光散乱法 測定原理

はじめに 近年、新素材・新材料の研究・開発が盛んになっており、特にナノ粒子特有の機能の応用が活発化しています。また、サブミクロンレベルでのエマルション、インク・顔料などの分散性の評価や、研磨材の品質管理などの重要性がますます増えてきています。液体中の粒子がブラウン運動により拡散する速度 (拡散係数)を計測することで粒子径を測定する動的光散乱法は、簡便性からナノ粒子の測定に使用されています。拡散速度は、溶媒の温度、溶媒の粘度、粒子サイズの 3つの要素により決まります。溶媒の温度と粘度と屈折率が既知であれば、簡単に数分間で粒子径が求められます。ナノ粒子アナライザーが粒子径と分子量を求めるために採用している動的光散乱法について説明します。この測定原理は、ブラウン運動および光子相関法(PCS)を用います。

1. ブラウン運動とは 省略。

2.光子相関法とは 動的光散乱法はブラウン運動中の粒子に、レーザ光を粒子群に当てその散乱光を光電子増倍管(PMT)で検出することにより測定します。粒子により散乱された光は、互いに重なり合い干渉パターンを形成します。PMTで検出される光の強度は、その干渉パターンにより決まります。溶液中を粒子が、ブラウン運動によりランダムに移動して粒子同士の相対的な位置が変わることで、干渉パターンの時間的な変化をもたらし、検出器の光強度が時間的に変動します。 ブラウン粒子により生じる時間的な散乱強度の変化、つまり散乱強度の揺らぎは、マイクロ秒からミリ秒オーダーにわたり続きます。大きい粒子は動きが相対的に遅く、位置がゆっくりと変わるので、検出器における強度の揺らぎも緩やかなものとなります。これとは反対に、小さい粒子は動きが速いので強度の揺らぎも急激に変化します。光子相関法では、この散乱光強度の時間的な揺らぎ(散乱光の光子数の揺らぎ)を測定します。つまり、拡散する粒子のパターンが変化することから生じるランダムな強度の揺らぎを、正確な時間尺度で把握すること(自己相関関数)で、拡散係数を求め、アインシュタイン・ストークスの式により粒子径を導き出します。

3. 自己相関関数とは (前半省略)散乱光の強度の揺らぎは、拡散する粒子により生じ、この揺らぎの時間的尺度は散乱光強度の自己相関関数を計算することで求められます。この関数は次式で定義されます。

G(τ) =⟨I(t)× I(t+ τ)⟩

⟨I(t)⟩2

自己相関関数の計算方法は、任意の時間 tにおける強度の値と、その τ 時間後の値を比較します。τ における自己相関関数が高い値であれば、任意の時点における散乱強度と τ 時間後における強度との間に強い相関関係があります。強度は粒子の位置パターンに関係するので、異なる 2つの時間における強度間に高い相関関係があることは、その 2測定間で粒子がそれほど離れた位置へ移動していないことになります。τ が小さい時には粒子はあまり移動していないので、散乱光強度の変化は小さくなり高い相関を示します。τ が大きくなると粒子の位置は不確定になるので、散乱強度もランダムになり、相関は低くなります。このため、測定で得られる自己相関関数は指数関数的な減衰曲線になります。 (後半省略)

4. ハードウエア構成 動的光散乱法サブミクロン粒子アナライザーの機能ブロック図を次に示します。25mW He-Neレーザの光は集束レンズで集束され、測定対象の粒子浮遊液が入っている恒温のサンプル キュベットに照射されます。6種類の散乱角度検出を有し、散乱光の検出は 6本の光ファイバー受光器、角度選択用モーター、PMT(光電子増倍管)で構成されます。PMTは散乱光を検出し、光子ごとに電流パルスを発生させます。この電流は PADに流れ、PADはパルスが所定の閾値レベルよりも大きいかどうかを判別します。電流パルスが閾値レベルよりも大きい場合、デジタル自己相関器が検出しやすいように整形と増幅を行います。閾値より小さな電流は無視されます。 デジタル自己相関器は、マイクロプロセッサから制御されます。21 CFR Part11 対応ソフトウェアを通して入力指示を受け取り、デジタル自己相関器の駆動、キュベット温度の設定(6~60℃)、測定散乱角度の設定(6角度から選択)を行います。(以下,省略)

Page 19: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 43

2.6 (補足) 速度自己相関関数の形: VAF of Real Systems

ブラウン運動をする粒子の速度自己相関関数 VAF は,指数関数的な単調減少関

数であることを手計算で示すことができた[式 (2–59)].これは,記憶が急速に減

衰していく理想系の例である.

一般には,粒子のおかれている状況によって,VAF はさまざまな形をとる.簡単 もちろん,いずれ t → ∞ではゼロに

減衰するのが普通であるが.な系について,例を紹介しよう.図 2–13は,相互作用する粒子系の運動方程式を数

値積分することによって粒子の運動を追跡するシミュレーションプログラムである.

このプログラムを動かすと,125個 (=NUM ATOM)の粒子が CELL X×CELL Y×CELL Z これを,一般に 分子動力学

molecular dynamics シミュレーショ

ン,あるいは省略してMDシミュレー

ションという.この授業の はんちゅう

範疇 を超

えるので詳細は省略する.原子系の動

力学セミナー で解説している.

の大きさの箱の中で相互作用しながら動き回る様子を見ることができる.箱の大き

このプログラムでは,粒子間相互作用

として,引力と斥力がはたらくLennard-

Jonesポテンシャル を仮定している.

このモデルの性質はよく調べられてい

て,気液臨界点や三重点などの熱力学

的特性がはっきりしたモデルである.

さや入力する温度によって,気体・液体・固体の三態が出現する.粒子の座標と運

動量が,各ステップごとにファイルに出力されるので,そのデータを使ってVAFを

求めることができる.図 2–14は,VAFを求めるプログラムの例,図 2–15 が求め

られた VAFの例である.ただし,VAFの概形を比較しやすいように,時刻ゼロで

の値で規格化したものを示している.大雑把には次のようなことがわかる:

(1) VAFの形は密度と温度に強く依存する.

(2) 高温・低密度の場合は,VAFは指数関数に近い単調減少挙動を示す.これは,

粒子間の衝突がランダムに起きて,次第に速度の「記憶」が失われるからで

ある.

(3) 密度が大きくなると,VAFに振動が見られる.これは,粒子間隔が小さくな

るにつれて隣接する粒子との衝突に規則性が表れてくるからである. 結晶に

ついては,格子振動に対応する.

(4) VAFは負になることもある.

揺動散逸定理は,VAFの形には関係なく一般的に成り立つべきものであるから,

VAFが単調減少であろうと減衰振動的であろうと,その積分から拡散係数を求める

ことができる.ただし,極低温や高密度などの条件下で振動の減衰が遅い場合など

は積分の収束性が悪くてうまく求められないこともある.その場合は,定義に戻っ

て平均2乗変位から求めるのがよい.

Page 20: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 44

// A Simple MD Code for Lennard-Jones System// mass=1; epsilon=1; sigma=1;// Version 03: Periodic Boundary Conditions#include <stdio.h>#include <stdlib.h>#include <math.h>

#define NUM_LATTICE 5#define NUM_ATOM (NUM_LATTICE*NUM_LATTICE*NUM_LATTICE)#define TOTAL_STEP 20000#define SAVE_STEP 1

double DEL_T = 0.001;double CELL_X = 5.0;double CELL_Y = 5.0;double CELL_Z = 5.0;

void initial( ); // Function Prototypesvoid force( );void move( );void statistics(int);void initplot( );void finalplot( );void scaling( );

double posx[NUM_ATOM], posy[NUM_ATOM], posz[NUM_ATOM];double momx[NUM_ATOM], momy[NUM_ATOM], momz[NUM_ATOM];double frcx[NUM_ATOM], frcy[NUM_ATOM], frcz[NUM_ATOM];double eng_kin, eng_pot, t_target, tsum;int ntcount;

FILE *fgnuplot, *fsave;

int main( ){

int step;

printf("Input Target Temperature :");scanf("%lf",&t_target);initial( );initplot( );

for (step=0; step<=TOTAL_STEP; step++) {force( );move( );if (step%SAVE_STEP==0) {

statistics(step); }}

finalplot( );}//------------------------------------------------// Initialize Gnuplot Command Filevoid initplot( ){

fgnuplot=fopen("lj.plt","w");

fprintf(fgnuplot,"set data st point\n");fprintf(fgnuplot,"set size square\n");fprintf(fgnuplot,"set xran [0:%f]\n",CELL_X);fprintf(fgnuplot,"set yran [0:%f]\n",CELL_Y);

}//------------------------------------------------// Finalize Gnuplot Command Filevoid finalplot( ){

fprintf(fgnuplot,"pause -1\n");fclose(fgnuplot);

}//------------------------------------------------// Make Simple Cubic Lattice with Random Momentavoid initial( ){

int i=0;int ix,iy,iz;double dx,dy,dz;

dx=CELL_X/NUM_LATTICE;dy=CELL_Y/NUM_LATTICE;dz=CELL_Z/NUM_LATTICE;

tsum=0.0;for (ix=0;ix<NUM_LATTICE;ix++) {for (iy=0;iy<NUM_LATTICE;iy++) {for (iz=0;iz<NUM_LATTICE;iz++) {

posx[i] = dx*ix;posy[i] = dy*iy;posz[i] = dz*iz;momx[i] = (rand( )/(double)RAND_MAX -0.5);momy[i] = (rand( )/(double)RAND_MAX -0.5);momz[i] = (rand( )/(double)RAND_MAX -0.5);tsum += (momx[i]*momx[i]+momy[i]*momy[i]+

momz[i]*momz[i]);i++;

} } }tsum /= 2;scaling( );

}//------------------------------------------------// Calculate Forces: minimal image conventionvoid force( ){

int i, j;double dx,dy,dz,r2,ri06,ri12;double eng, frc;double cxh=CELL_X/2;double cyh=CELL_Y/2;double czh=CELL_Z/2;

eng_pot=0.0;for (i=0; i<NUM_ATOM; i++) {

frcx[i]=0.0;frcy[i]=0.0;frcz[i]=0.0;

}

for (i=0; i<NUM_ATOM; i++) {for (j=i+1; j<NUM_ATOM; j++) {

dx=posx[i]-posx[j];if (dx<-cxh) dx+=CELL_X;else if (dx>cxh) dx-=CELL_X;

dy=posy[i]-posy[j];if (dy<-cyh) dy+=CELL_Y;else if (dy>cyh) dy-=CELL_Y;

dz=posz[i]-posz[j];if (dz<-czh) dz+=CELL_Z;else if (dz>czh) dz-=CELL_Z;

r2=dx*dx+dy*dy+dz*dz;ri06=1.0/(r2*r2*r2);ri12=ri06*ri06;eng=4*(ri12-ri06);frc=4*(12*ri12-6*ri06)/r2;eng_pot += eng;frcx[i] += frc*dx;frcy[i] += frc*dy;frcz[i] += frc*dz;frcx[j] -= frc*dx;frcy[j] -= frc*dy;frcz[j] -= frc*dz;

} }}//------------------------------------------------// Update Particle Positon & Momentum: Periodic Boundariesvoid move( ){

int i;

eng_kin=0.0;for (i=0; i<NUM_ATOM; i++) {

momx[i] += frcx[i]*DEL_T;momy[i] += frcy[i]*DEL_T;momz[i] += frcz[i]*DEL_T;eng_kin += (momx[i]*momx[i]+momy[i]*momy[i]+

momz[i]*momz[i]);posx[i] += momx[i]*DEL_T;

if (posx[i]<0.0) posx[i]+=CELL_X;else if (posx[i]>CELL_X) posx[i]-=CELL_X;

posy[i] += momy[i]*DEL_T;if (posy[i]<0.0) posy[i]+=CELL_Y;else if (posy[i]>CELL_Y) posy[i]-=CELL_Y;

posz[i] += momz[i]*DEL_T;if (posz[i]<0.0) posz[i]+=CELL_Z;else if (posz[i]>CELL_Z) posz[i]-=CELL_Z;

}eng_kin /= 2;ntcount++;tsum += (2.0/3.0)*eng_kin;

}//------------------------------------------------// Output Statistical Data & Configurationvoid statistics(int step){

int i;char fname[100];

tsum /= ntcount;scaling( );

printf("%8d %10.5f %10.5f %10.5f\n",step, eng_kin/NUM_ATOM, eng_pot/NUM_ATOM,(eng_kin+eng_pot)/NUM_ATOM);

sprintf(fname,"lj.%6.6d",step);fsave=fopen(fname,"w");

for (i=0;i<NUM_ATOM;i++) {fprintf(fsave,"%8.3f %8.3f %8.3f ",

posx[i],posy[i],posz[i]);fprintf(fsave,"%9.5f %9.5f %9.5f\n",

momx[i],momy[i],momz[i]);}

fclose(fsave);

fprintf(fgnuplot,"plot \"%s\" using 1:2\n",fname);if (step==0) fprintf(fgnuplot,"pause -1\n");

}//------------------------------------------------// Velocity Scalingvoid scaling( ){

int i;double factor;

factor=sqrt(t_target*NUM_ATOM/tsum);for (i=0;i<NUM_ATOM;i++) {

momx[i] *= factor;momy[i] *= factor;momz[i] *= factor;

}tsum=0.0;ntcount=0;

}

図 2–13: 簡単なMDシミュレーションプログラム.

Page 21: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 45

#include <stdio.h>

#define NUM_ATOM 125#define SKIP 10000 // Discard initial data#define MAX_STEP 20000#define MAX_VAF 1000

double momx[NUM_ATOM][MAX_STEP];double momy[NUM_ATOM][MAX_STEP];double momz[NUM_ATOM][MAX_STEP];

int data_input( ){

int step=SKIP;int iatom;double x,y,z,u,v,w;char cfile[100];FILE *fin;

do {sprintf(cfile,"L30T20\\lj.%6.6d",step);

// printf("%s\n",cfile);fin=fopen(cfile,"r");if (fin==NULL) return step-SKIP;if (step-SKIP>=MAX_STEP) return step-SKIP;

for (iatom=0;iatom<NUM_ATOM;iatom++) {if (fscanf(fin,"%lf %lf %lf %lf %lf %lf",&x,&y,&z,&u,&v,&w)!=6) return (-1);momx[iatom][step-SKIP]=u;momy[iatom][step-SKIP]=v;momz[iatom][step-SKIP]=w;

}fclose(fin);step++;

} while (1);}//---------------------------------------------------int main( ){

int step,is,js,ds,jsmax;int iatom;double factor;int vcount[MAX_VAF];double vsum[MAX_VAF];FILE *fout;

step=data_input( );printf("%d\n",step);

if (step<=0) {printf("Data Read Error\n"); return -1; }

fout=fopen("l30t20-vaf.dat","w");

for (ds=0;ds<MAX_VAF;ds++) {vcount[ds]=0; vsum[ds]=0.0;

}

for (iatom=0;iatom<NUM_ATOM;iatom++) {printf("iatom=%5d\n",iatom);

for (is=0;is<step;is++) {jsmax=is+MAX_VAF;if (jsmax>=step) jsmax=step;

for (js=is;js<jsmax;js++) {ds=js-is;vcount[ds]++;vsum[ds]+=(momx[iatom][is]*momx[iatom][js]+

momy[iatom][is]*momy[iatom][js]+momz[iatom][is]*momz[iatom][js]);

}}

}

factor=vsum[0]/vcount[ds];for (ds=0;ds<MAX_VAF;ds++) {

fprintf(fout,"%6d %10.6f\n",ds,vsum[ds]/vcount[ds]/factor);}fclose(fout);

return 0;}

図 2–14: MDシミュレーションのデータから VAFを求めるプログラム例.

Page 22: 2 揺らぎと輸送現象 From Fluctuations To Transport Phenomena · 熱物理工学講義ノートThermal Physics 2019 Lecture Note (松本担当分):27 4Np[(N 1)p + 1] 4N2p

熱物理工学 講義ノート Thermal Physics 2019 Lecture Note (松本 担当分): 46

数密度 ρ = 0.046

温度 T/Tc ≃ 2.0

高温希薄気体

0

5

10

15

20

25

30

0 5 10 15 20 25 30

-0.5

0.0

0.5

1.0

0 200 400 600 800 1000

No

rma

lize

d V

AF

t (step)

T=2.0

数密度 ρ = 0.125

温度 T/Tc ≃ 2.0

高温中密度流体

0

2

4

6

8

10

0 2 4 6 8 10

-0.5

0.0

0.5

1.0

0 200 400 600 800 1000

No

rma

lize

d V

AF

t (step)

T=2.0

数密度 ρ = 0.579

温度 T/Tc ≃ 2.0

高温高密度流体

0

1

2

3

4

5

6

0 1 2 3 4 5 6

-0.5

0.0

0.5

1.0

0 200 400 600 800 1000

No

rma

lize

d V

AF

t (step)

T=2.0

数密度 ρ = 0.579

温度 T/Tc ≃ 0.8

液体

0

1

2

3

4

5

6

0 1 2 3 4 5 6

-0.5

0.0

0.5

1.0

0 200 400 600 800 1000

No

rma

lize

d V

AF

t (step)

T=0.8

数密度 ρ = 1.000

温度 T/Tc ≃ 0.7

低温液体

0

1

2

3

4

5

0 1 2 3 4 5

-0.5

0.0

0.5

1.0

0 200 400 600 800 1000

No

rma

lize

d V

AF

t (step)

T=0.7

数密度 ρ = 1.000

温度 T/Tc ≃ 0.1

(不完全)結晶

0

1

2

3

4

5

0 1 2 3 4 5

-0.5

0.0

0.5

1.0

0 200 400 600 800 1000

No

rma

lize

d V

AF

t (step)

T=0.1

図 2–15: さまざまな条件下での Lennard-Jones粒子系の瞬間的な粒子配置の例と速度自己相関関数.