ホーム>物理・数学のページ>物理シミュレーション>モンテ・カルロと水素原子の電子軌道 |
モンテ・カルロ法による水素原子の電子軌道表示
シミュレーションの第一弾はモンテ・カルロ法です。 水素原子の電子軌道をあらわす波動関数は、シュレーディンガー方程式を解く練習問題としても、 そこで、第1回は波動関数の分布を視覚的に表現する方法を、DirectXプログラミングの練習も兼ねて作ってみたいと思います。
1.波動関数と確率密度分布 量子力学についてはそのうち自分なりにまとめてみたいと思いますが、ここでは簡単に「波動関数とはなんぞや?」ということについて 2.電子軌道の波動関数 原子が正の電荷を持つ部分と電子で構成されるということは分かっていましたが(電子は19世紀末には発見されていましたが、原子内の正電荷がどのように分布しているかはラザフォードの実験(1911-1913)による)、それが実際どういう形なのか、ということが量子力学以前は大問題でした。 3.モンテ・カルロ法とは何か? さて、水素原子内の電子について波動関数を求めることができたわけですが、これが具体的にどういう分布なのか、ということは式をみただけではぱっとは分かりにくいです。 |
psi(x,y,z) : 波動関数 |
つまり、20000回の観測を状態に影響を与えることなく(物理的には無理なわけですが)繰り返し、
観測されたところに点を打つことで表示するわけです。
4.いざプログラム
プログラム自体は簡単です。
(最初のソースでa=のところ、不等号が逆になっていました)
ご要望がありましたので現状のソースプログラムをダウンロード可能にしておきます。
いろいろと変更したい点があるのですが、とりあえずのバージョンということで。
ソースコードのダウンロード:DxHydrogen.zip
実行ファイルのダウンロード:ShowProb.zip
実行ファイルのほうは、計算を別にして点のデータにしたものを表示するだけになっています。
計算にはけっこう時間がかかるので、実際にみてぐるぐる動かしてみたいという場合にはこれで十分だと考えました。
srand((unsigned)time(NULL)); |
変数の説明
変数名 | 説明 |
x,y,z | 乱数で発生した座標 |
p | 乱数で発生した確率用の数値 |
pp | 波動関数の絶対値の2乗 |
a | 波動関数の符号 |
vertices[] | VertexBuffer用配列 |
nn | 試行回数 |
maxpp | ppの最大値 |
L | 発生させる座標の範囲(-L〜L) |
ofs | ログファイル用ofstream |
内容は難しくないと思うので説明を省きます。
確率が高いところほど点が生成されやすく、点が密にでます。
確率が低いところは点がまばらになり、点の密度によって波動関数の大きさをみることができる、というわけです。
また波動関数の符号によって色を変えています。
あとはverticesをDirectXのVertexBufferに登録し、プリミティブトポロジーをD3D10_PRIMITIVE_TOPOLOGY_POINTLISTにして描画するだけです。
実際は、カメラ機能を実装するのに苦労したりしましたが、その辺についてはDirectXの記事に反映させるつもりです。
もうちょっと機能がかたまったらソースコードを公開する予定です。
5.いざ実行!・・・乱数発生の罠
さて、実際に動かしてみると挙動が変です。
なにか筋が入ってます。
最初は波動関数の計算かDirectXの座標変換行列の設定を間違ったかと思ったのですがちがいました。
で、半日ぐらいあれこれいじっても治らず、ふと思い出したことが。
「線形合同法の乱数でベクトルを生成するときは気をつけなくてはならない」ということです。
Visual
C++のrand()関数は線形合同法をつかっています。
これは前の乱数から1次漸化式と剰余(合同式)を使って次の乱数を発生させるものです。
そうするとベクトルのように組み合わせたときにある傾向がでてしまうのです。
そこで乱数を自前の乱数クラス(足し算法)を作ってやり直してみました。
すると・・・解決!こんなにはっきり出てしまうものとは思いませんでした。
6.これが波動関数の姿だ
では、このプログラムをつかった波動関数の画像をいくつかお見せしましょう。
まずは2py軌道から
3d3z2-r2軌道
斜め上から見た図。赤い部分(位相が正)がz軸で、それを取り囲むように負の位相部分があります。
真横から見た図。
3dzx軌道
真上(y軸方向)から見た図。xy平面とyz平面で波動関数が0になっていることが確認できる。
斜めから見た図。y方向の広がりをみることができる。
sp混成軌道 思ったより広がっているというか、きのこみたいです。
実際にマウスでぐるぐる回して眺めてみるともっとよく分かります。
混成軌道についての注意点とか、そもそも波動関数を視覚化するのはどういう方法がほかに考えられるとか、落ちている情報とか、いろいろと書きたいことはあるのですが、とりあえず実行ファイルをダウンロードして眺めてみてください。
7. 今後の展開
今回は波動関数の確率密度としての側面をとりあげたわけですが、
複素数としての波動関数には位相の部分があり、それはこの方法でみることはできません。
そして位相を微分したときにエネルギーや運動量といった物理量が出てくるので
これは今後の課題です。
また、このモンテ・カルロ法は時間がかかります。
これこそCUDAの出番だと思いますので、そのうちCUDA版も作ってみたいと思います。
<前のページへ>