Bluepostech

まじめなことを書きます

【python】matplotlibがdvipngを見つけられない

最近理論の話が続いたのでプログラムの話に戻ろう。

先日matplotlibを使ったpythonコードを移植しようとしたところ、以下のようなエラーを吐いて動かない、ということがあった。

Could not obtain dvipng version

直訳すると「dvipngのバージョンを特定できない」というような意味だが、実はそうではないらしい。

そもそもdvipngとはtexで出力に使われるdviをじかにpngに変換するソフトで、一度このブログでも取り上げている。texliveに含まれているソフトで、texliveをインストールすれば一緒に入ってくる。
移植先の環境にはtexliveがすでに入っていると思っていたのだが、まずwhichでdvipngを調べても入っておらず、platexを調べても入っていないことがわかった。

そこで「dvipngだけ入ればいいや」とdvipngだけインストールしようとしたら、今度はlibkpathseaだったかがないというエラーが出た。仕方なしにtexliveをまるごと入れると、無事matplotlibまで動くようになった。

ごく簡単なことだが、エラーメッセージで検索をかけると英語のページしか出てこなかったので。

「熱速度」とは結局何なのか

統計物理の重要な概念のひとつに「熱速度」という概念がある。

熱速度とは、気体やプラズマのように多くの粒子からなる系で、さまざまな速度で運動する粒子集団の代表的な速度として定義される。しかし定義がいくつかあるうえ、あまりテキストに載っていないので、初学者の混乱のもとになっている。なのでここでまとめてみようと思う。

この記事では、1次元Maxwell分布を考える。すなわち分布関数が次で与えられる系を考える。

\displaystyle f(v)=\left(\frac{m}{2\pi T}\right)^{\frac{1}{2}}e^{-\frac{mv^2}{2T}}

1. 粒子の平均速度からの定義

今考えている系は1次元なので、平均値を考えると速度は0となってしまう。そのため2乗平均の平方根を考える。
\begin{eqnarray}\overline{v^2} &=&\left(\frac{m}{2\pi T}\right)^{\frac{1}{2}}\int^{\infty}_{-\infty}v^2 e^{-\frac{mv^2}{2T}}dv \\
&=&\frac{T}{m}
\end{eqnarray}
したがって
\displaystyle v_{th1}=\sqrt{\frac{T}{m}}
となる。

平均速度が0であることを考えると、v_{th1}は速度の統計的な揺らぎそのものであり、大多数の粒子はv_{th1}以下の速さで正か負の方向に運動していると解釈できる。

2. 速さの平均値

1次元Maxwell分布で「速度」の平均は0になるが、その絶対値である「速さ」の平均はそうはならない。それを計算してみると、
\displaystyle \begin{eqnarray}
v_{th2} &=& \overline{|v|}\\
&=&\left(\frac{2\pi T}{m}\right)^{\frac{1}{2}}\int^{\infty}_{-\infty}|v|e^{-\frac{mv^2}{2T}}dv \\
&=& \left(\frac{2\pi T}{m}\right)^{\frac{1}{2}} \times 2 \times \int^{\infty}_0 ve^{-\frac{mv^2}{2T}}dv \\ 
&=& 2 \times \left(\frac{m}{2\pi T}\right)^{\frac{1}{2}} \times \frac{1}{2} \times \frac{2T}{m} \\
&=& \sqrt{\frac{2T}{\pi m}}
\end{eqnarray}
となる。

3. 1/e値半幅

分布関数の指数部分がうまく規格化されるようにv_{th3}を定める。
\displaystyle v_{th3}=\sqrt{\frac{2T}{m}}
と定義すると、分布関数は
\displaystyle
f(v)=\left(\frac{m}{2\pi T}\right)^{\frac{1}{2}}e^{-\frac{v^2}{v_{th3}^2}}
と指数部分が速度が熱速度で規格化されたきれいな形になる。

このときのv_{th3}の意味だが、v=v_{th3}の粒子を考えると、
f(v_{th3})=f_0e^{-1}
となり、分布関数が最大値の1/eとなる速度であることがわかる。

4. で、結局どれなのか

ここまで3つの定義を述べたが、どれも使われていることがあるので、どれが使われているのかは前後の文脈から判断するしかない。

定義上係数がちがうだけだが、\sqrt{2/\pi}\simeq0.798, \sqrt{2}=1.414なので、
v_{th}=(1.106\pm0.308)\sqrt{\frac{T}{m}}
となり、相対誤差は最大で(1.414-0.798)/(0.798)=77.2%にもなる。

実際には熱速度は理論計算のときに式変形を簡単にするためであったり、数値として出てくるときは目安として出てくる。前者の場合は文脈から読み取れることも多いが、後者の場合は定義がかかれていなければまるで意味のないものになってしまう。なのでレポートに使うときはどの定義を使ったのかはっきり書いておく必要がある。

ここからは個人の感想だが、出てくる頻度としては1の定義が一番多い気がする。次に多いのは3の定義で、2の定義はwikipedia以外で見たことがない。

なお、3次元の場合でも考えることができ、そのときはさらに係数が変わってくる。計算は面倒なのでここでは書かない。

参考:この手の計算ではガウス積分の計算が大量に出てくる。わからなければ以下の拙著も参考にしてほしい。
bluepost69-tech.hatenablog.com

ガウス積分チートシート

理系学生としてあってはならないことだが、僕は頻繁にガウス積分を忘れる。導出の方法は覚えているのだが、毎回導出するのはかなりあほらしいしまちがいのもとにもなりかねないので、ここにまとめておこうと思う。

1.一番基本的なケース(e^{-x^2})

\displaystyle \int^{\infty}_{-\infty} e^{-x^2}dx

積分の積に関する可換性と変数変換を用いる。

I=\displaystyle \int^{\infty}_{-\infty} e^{-x^2}dx =\int^{\infty}_{-\infty} e^{-y^2}dyとおくと、

\begin{eqnarray} I^2 &=& \displaystyle \left( \int^{\infty}_{-\infty} e^{-x^2}dx\right) \cdot \left( \int^{\infty}_{-\infty} e^{-y^2}dy \right) \\ &=& \displaystyle \int^{\infty}_{x=-\infty}\int^{\infty}_{y=-\infty}e^{-(x^2+y^2)}dxdy \end{eqnarray}

ここで2次元極座標に変換する、すなわち

\left\{ \begin{eqnarray} r &=& \sqrt{x^2+y^2} \\ \theta &=& \mathrm{arctan}\left( \frac{y}{x} \right) \end{eqnarray} \right.

なる変数変換を行う。ただし、変域はxyも負の無限大から正の無限大だったので、点対称となり\thetaの項は2\piとなる。すなわち

\begin{eqnarray} I^2 &=& \displaystyle \int^{\infty}_{0} e^{-r^2}\cdot 2\pi rdr \\ &=&-\pi \displaystyle\int^{\infty}_{0} -2r\cdot e^{-r^2} dr \\ &=& \pi \left[e^{-r^2}\right]^{0}_{\infty} \\ &=& \pi \end{eqnarray}

となる。ここの積分がわからない場合は4を参照されたい。e^xの正値性より積分も正なので、

I = \displaystyle \int^{\infty}_{-\infty} e^{-x^2}dx = \sqrt{\pi}
を得る。

--------------

2.指数の肩が定数倍されているケース(e^{-ax^2})

\displaystyle \int^{\infty}_{-\infty} e^{-ax^2}dx \hspace{5mm}(a>0)

これは単なる置換積分の問題で、y=\sqrt{a}xと置換すれば、
\displaystyle \int^{\infty}_{-\infty} e^{-ax^2}dx=\sqrt{\frac{\pi}{a}}
となる。

--------------

3.積分区間が0以上のみのケース

\displaystyle \int^{\infty}_{0} e^{-ax^2}dx \hspace{5mm}(a>0)

これも、e^{-ax^2}が偶関数であることを考えれば単純で、2の結果を半分にすればよい。すなわち
\displaystyle \int^{\infty}_{0} e^{-ax^2}dx =\frac{1}{2}\sqrt{\frac{\pi}{a}}
また、次のように考えてもよい。1の議論で「積分は全空間だから角度積分2\piとなる」とした。それに対して積分区間が0から無限大の場合、{I^2}積分領域は座標平面でxyがともに正である第一象限のみとなり、I^2は1/4、結局Iは1/2となるのである。

--------------

4. xがかかっているケース(xe^{-x^2})

\displaystyle \int^{\infty}_{0} xe^{-ax^2}dx

1の最後の部分の積分そのものなのだが、置換積分である。詳しくやっておく。

\displaystyle \int^{\infty}_{0} xe^{-x^2}dx = -\frac{1}{2}\int^{\infty}_{0} -2xe^{-x^2}dx
u=-x^2とおくと、du=-2xdxu:0\to-\inftyとなり、
\begin{eqnarray}\displaystyle \int^{\infty}_{0} xe^{-x^2}dx &=& -\frac{1}{2}\int^{-\infty}_{0} e^{u}du \\ &=& \frac{1}{2}[e^u]^{0}_{-\infty} \\ &=& \frac{1}{2} \end{eqnarray}

ちなみに一応言っておくが、被積分関数は奇関数と偶関数の積だから、
\displaystyle \int^{\infty}_{-\infty} xe^{-x^2}dx=0
である。

係数がついて\displaystyle \int^{\infty}_{0} xe^{-ax^2}dxとなると、
\displaystyle \int^{\infty}_{0} xe^{-ax^2}dx = \frac{1}{2a}
となる。

--------------

5.x^nがかかっているケース(x^n e^{-ax^2})

I_n=\displaystyle \int^{\infty}_{0} x^n e^{-ax^2}dx\hspace{5mm}(n\ge 0)

これをaの関数と見て微分すると、
\displaystyle\frac{dI_n}{da}=-\int^{\infty}_0 x^{n+2} e^{-ax^2}dx=-I_{n+2}
となる。

3,4を見るとわかるとおり、この積分nが偶数か奇数かで振る舞いが変わる。3がI_0、4がI_1に相当するので、その結果をa微分することによって具体的なnの値に対して答えが得られる。

低次の場合についてまとめると、以下のようになる。(というかおそらくここが最も求められているところだと思う)。

n I_n 結果
0 \displaystyle\int^\infty_0 e^{-ax^2}dx \displaystyle\frac{1}{2}\sqrt{\frac{\pi}{a}}
1 \displaystyle\int^\infty_0 xe^{-ax^2}dx \displaystyle\frac{1}{2a}
2 \displaystyle\int^\infty_0 x^2e^{-ax^2}dx \displaystyle\frac{1}{4a}\sqrt{\frac{\pi}{a}}
3 \displaystyle\int^\infty_0 x^3e^{-ax^2}dx \displaystyle\frac{1}{2a^2}
4 \displaystyle\int^\infty_0 x^4 e^{-ax^2}dx \displaystyle\frac{3}{8a^2}\sqrt{\frac{\pi}{a}}
5 \displaystyle\int^\infty_0 x^5e^{-ax^2}dx \displaystyle\frac{1}{a^3}

積分が全領域の場合は、偶数次の場合については2倍すればよい。
奇数次のものは、先述のとおり0である。

計算がまちがっていたらコメントしてください。