ガウス積分チートシート
理系学生としてあってはならないことだが、僕は頻繁にガウス積分を忘れる。導出の方法は覚えているのだが、毎回導出するのはかなりあほらしいしまちがいのもとにもなりかねないので、ここにまとめておこうと思う。
- 1.一番基本的なケース(e^{-x^2})
- 2.指数の肩が定数倍されているケース(e^{-ax^2})
- 3.積分区間が0以上のみのケース
- 4. xがかかっているケース(xe^{-x^2})
- 5.x^nがかかっているケース(x^n e^{-ax^2})
1.一番基本的なケース(e^{-x^2})
積分の積に関する可換性と変数変換を用いる。
とおくと、
ここで2次元極座標に変換する、すなわち
なる変数変換を行う。ただし、変域はもも負の無限大から正の無限大だったので、点対称となりの項はとなる。すなわち
となる。ここの積分がわからない場合は4を参照されたい。の正値性より積分も正なので、
を得る。
--------------
3.積分区間が0以上のみのケース
これも、が偶関数であることを考えれば単純で、2の結果を半分にすればよい。すなわち
また、次のように考えてもよい。1の議論で「積分は全空間だから角度積分はとなる」とした。それに対して積分区間が0から無限大の場合、の積分領域は座標平面で、がともに正である第一象限のみとなり、は1/4、結局は1/2となるのである。
--------------
【python】fortranのnamelistで書かれた設定ファイルを読み込む(f90nml)
以前fortranのnamelistという機能を紹介した。
数字を羅列しただけの平文ファイルとちがってnamelistはfortran独自のものなので、ほかの言語で読み込む場合は何らかの工夫が必要になる。
「fortranで計算した結果をpythonのmatplotlibでグラフ化したい」というような場合は多々あるだろう。pythonではそのために「f90nml」というライブラリが用意されている。
インストールについてはpipが使える環境であれば簡単にできる。またgit cloneしてインストールすることもできる。インストールについては以下を参照されたい。
f90nml 0.2.1 : Python Package Index
ただしこのドキュメントには1ヶ所間違いがある。管理者権限のないユーザでも--userをつければインストールできるとあるが、オプションをつける位置が間違っており、正しくは以下のようにする必要がある。
python setup.py install --user
f90nmlではreadというメソッドでnamelistをリストとして読み込み、writeというメソッドで出力できる。
具体的な使い方として、前回の記事で使ったparams.inのhogeというリストのyyという要素を取得するには、次のようにする。
import f90nml
params=f90nml.read('params.in')
yy=params['params']['yy']
【fortran】設定値を別ファイルで与える(namelist)
大規模計算プログラムには大量の設定すべきパラメータがある。物理定数のように内部で与えておけばよいものもあるが、頻繁に変えて実行するものもあり、内部で与えるとその都度コンパイルしなければならず効率が悪い。
簡単に思いつくのは、「平文のまま設定値を順番に書き下してread文で読ませる」という方法だ。しかしこれだと設定ファイルが数値(時々文字列や論理値)の羅列になってしまい、可読性に欠ける。
そこで、fortranにはnamelistという機能がある。これはソースファイルとは別の設定ファイルに決まった書き方で書いた設定値を読み書きできる機能で、これを使えば比較的わかりやすい書き方で設定値を与えることができる。
使うには、まずは実行コード側でnamelistを定義する必要がある。これにはnamelist文を使って次のようにする。
namelist/hoge/ xx,yy,zz
ただしこの文の前で変数xx、yy、zzがそれぞれ定義されている必要がある。*1設定ファイルとはいえ別ファイルなのでopenで開いてreadで読む必要があり、writeで書き出すこともできる。そのためread、writeにはnmlというパラメータが準備されている。
一方で、設定ファイルのほうは次のように記述する。
注意しなければならないのは、「最後のスラッシュのあとに改行が必要」ということである。どういうわけかgfortranではこれがないと「End of file」というエラーが出るようだ。
ここではhogeというリストひとつしか記述していないが、ひとつの設定ファイルに複数個のリストを書くこともできる。この場合リスト単位で読み書きができる。
まとめて、上記の設定ファイルを「params.in」としてそれを読みとって「out.in」という名前で保存するプログラムを書くと、次のようになる。
program main
implicit none
double precision :: xx
integer :: yy
character :: zz
namelist/hoge/xx, yy, zz
open(10,file='params.in')
read(10,nml=hoge)
open(11,file='out.in')
write(11,nml=hoge)
close(10)
close(11)
end program main