第7回、乱数発生 --- 可視化 ---


目次


乱数発生 --- 可視化 ---

今回はプログラミングのテクニックの紹介というよりもむしろ計算後のデータの 解析に話題を移そうと思います。
今まではプログラミングに主体があったので、扱うデータ量(入力データ、出力 データともに)はそんなに多くありませんでした。比較的多かったのは くらいでしょうか?ですが、通常我々が研究室で取り組む問題に現れるデータ 量はこんなもんじゃあありません。1000、2000は普通です。こういう 中でデータの解析を行なうために計算機を使うわけですが、このような 1000、2000個の数字の羅列をながめていてもなかなかものごとの 本質はみえてきません。次に重要になるのは ”データの可視化”です。 例えば、グラフにしたり、時系列のデータであればアニメーションに するなどすれば、理解もしやすくなります。
今日は原子、分子の軌道を例にしてデータの可視化を行なってみようと思います。

水素原子の波動関数の表示

化学を語るのに電子の挙動を知るのは不可欠です。そのもっともシンプルな 系が水素原子になります。水素原子の電子の挙動はシュレディンガー方程式を 解くことによって完全に理解することができます。
例題1
水素原子1s軌道の波動関数Ψ、Ψ2を電子と原子核との距離に ついて計算し出力する。
解説
水素類似原子の波動関数はアトキンス物理化学(上)P.513を参照せよ。 s軌道は電子と原子核との距離のみの関数なので、角度部分はすでに積分した 動径波動関数を計算する。適当な間隔(下のプログラムでは0.01 A 間隔)で Ψ、Ψ2を計算し表として出力する。
解答
      implicit real*8(a-h,o-z)
      real*8 x, y, y2
      integer i
c
      do i = 0 , 500
         x = i / 100.0d0
         y = f1s(x)
         y2 = y**2
         write(6,'(3e20.10)') x , y, y2 
      end do
      end
c==================================================================
      real*8 function f1s(r)
c
c     1s function for hydrogen atom
c
      implicit real*8(a-h,o-z)
      parameter(r0 = 0.529d0)
c
      f1s = ( 1/r0 )**(1.5d0) * exp(-r/r0) 
c
      return
      end
上のプログラムについて説明します。このプログラムは2つのパートに分かれており、 1ー11行目までを主プログラム、残りを副プログラム(ここでは関数副プログラ ム)と呼びます。
特に難しいところはないと思います。唯一新しいのは”関数副プログラム”です。 文関数として簡単に関数を定義する方法は数値積分をやったところで紹介しまし た。ここで紹介する関数副プログラムはより複雑な関数の定義にも使用できる 汎用的な関数の定義方法です。1s関数だと結局1行ですんでしまうので、関数 副プログラムにする利点があまりありませんが、ここからすすんで2s,3s,2p関数 など、また水素分子のσ軌道、π軌道を定義したい、ということになれば関数 副プログラムを使わなければいけません。また、関数の定義だけ変えれば 主プログラムの方は変更点なしに同様の計算を行なうことができます。

さて、上のプログラムを"Intro"を使ってコンパイル、実行してみましょう。 ただし計算の出力結果は100行にもわたるので、出力ファイルを指定して おきましょう。Introの設定を変更していなければ出力ファイル名を指定 できないのですが、これをできるようにする方法を 山本君に教えてもらいました。もちろん私が口頭で以前説明したshellから 利用する方法でもよいのですが、こちらの方がわかりやすいと思います。ここでは その出力ファイル名をprog7-1.outと しておきます。
次にグラフを作成するソフトを起動します。現在みなさんが使っている NextStepの中にグラフ作成ツールはいくつかありますが、ここでは"GNUPLOT"を 使用します。
"GNUPLOT"はファイルビューアを使って起動します。場所は

/SharedApps/Gnuplot.app
にあります。NextStepにインストールされているGNUPLOTはファイルの選択などの 操作が全てマウスを使ってできるようになっており、非常に便利です。実際の 操作は演習の中で紹介します。
出力結果

電子雲の表示

波動関数の動径分布によっても電子の振舞いはある程度つかめますが、もう少し 電子の本来の姿に近い形で可視化してみましょう。つまり電子がその場所に 存在するかどうか、を確率現象であるとみなします。これを一様乱数を利用して 実現します。一様乱数とはある区間(例えば[0,1])で一様に分布するでたらめな 数列のことです。一様乱数の発生方法はいくつかありますが、ここでは 整数演算のみで乱数を発生させる方法をとります。
例題2
例題1と同じ1s波動関数の可視化を行なう。今度はある平面内に電子が どのように分布しているか、を表示する。アトキンス物理化学(上)P.522 の 図13.8をある平面(例えばxy平面)で輪切りにしたものを想像して欲しい。
解説
電子は原子核の回りをある軌道にそって運動しているのではなく、任意の 領域にみいだす確率のみ意味を持つ。これを計算機内でシミュレーションする ために以下のようなテクニックを使用する。
  1. 一様乱数を1つ発生させる
  2. それに対する波動関数の値とまた別の乱数とを比較し、波動関数の値の 方が大きければそこに電子がいるとし、小さければ棄却する。これで 原子核との距離を決める
  3. 偏角をもう一度乱数を発生させて決定する
解答
      implicit real*8(a-h,o-z)
      real*8 pi, x0, dm, s, x, y, a, rr, xx, yy
      integer i
c
      pi = atan(1.0d0)*4.0d0
      x0 = 2.0d1
      dm = 0.1d0
      s = 100.0d0 / x0
c
      do i = 1 , 50000
         x = x0 * irnd() * 1.0d-8
         y = dm * irnd() * 1.0d-8
         if( f1s(x) .gt. y ) then
            rr = s * x
            a = 2.0d0 * pi * irnd() * 1.0d-8
            xx = rr*cos(a)
            yy = rr*sin(a)
            write(6,'(2e20.10)') xx , yy 
         end if 
      end do
      end
c==================================================================
      real*8 function f1s(r)
c
c     1s function for hydrogen atom
c
      implicit real*8(a-h,o-z)
      parameter(r0 = 0.529d0)
c
      f1s = ( 1/r0 )**3 * r*r * exp(-2.0d0*r/r0) 
c
      return
      end
c==================================================================
      integer function irnd()
      integer m1, m2, m3, i
      save m1, m2, m3
c
      data m1, m2, m3/92658393, 76438567, 65428733/
 1    continue
      i = m1 + m2 + m3
      if( m2 .lt. 50000000) i = i + 1357
      if( i .ge. 100000000) i = i - 100000000
      if( i .ge. 100000000) i = i - 100000000
      m1 = m2
      m2 = m3
      m3 = i
      irnd = i
c
      return
      end
プログラムの説明をします。
(主プログラム)
こちらの計算結果の出力ファイル名を prog7-2.outとしておきます。
データの可視化は例題1と同様"GNUPLOT"を使います。
出力結果

今日の課題


今回は例題1、2の応用です。ただしプログラムの 出力結果は絶対に送信しないで下さい。 人によってはかなり大きくなることが予想されますが、そういうのが 全て送られてくると演習用にわりあてられたディスク容量をパンクしてしまいます。 パンクすると次に提出する人が提出できなくなってしまい、あとの人に非常に 迷惑がかかります。気をつけて下さい。

またコンパイル回数、実行回数の報告は特にしなくて結構です。むしろ試行錯誤を いろいろやらないとうまくいかないものもあると思います。

  1. 小テスト
  2. [7-1]例題1の応用である。水素原子の2s,3s軌道を計算し、1s軌道と合わせて その違いを議論せよ。なおプログラムの提出はどちらか1つでよい。もちろん 1つのプログラムで両方とも出力するようにしていてもかまわない。
  3. [7-2]例題1の応用である。水素原子の2s,2p軌道を計算し、その違いを 議論せよ。なおプログラムの提出はどちらか1つでよい。もちろん 1つのプログラムで両方とも出力するようにしていてもかまわない。
  4. [7-3]例題1の応用である。水素分子の1σ軌道(1s+1s)を図示せよ。 原子間距離は平衡核間距離でよい。原子の場合と比較して共有結合の 本質を語ってくれるとなおよい。
  5. [7-4]例題2の応用である。水素原子の2s,3s軌道を計算し、1s軌道と合わせて その違いを議論せよ。
  6. [7-5]例題2の応用である。水素分子の1σ軌道、2σ軌道を図示せよ。 原子間距離は平衡核間距離でよい。
  7. [7-6]例題2を応用して、水素原子の2p軌道を図示せよ。
また今回のお話の参考資料として、 数理科学美術館 というものがありました。URLのみ紹介しておきます。私の経験ではこのサイトは かなり混雑していますので、見たい人が後で自由にみてください。
本講義の目次へ戻る