密度汎関数法への道

パソコン上で分子を作成すると,その性質を計算してみようか,となる場合があります.これらの計算ソフトウェアはたいてい密度汎関数法を利用しています.
密度汎関数法は計算化学の手法の一つで,基底関群と汎関数から分子軌道を構築する方法です.
ということなのですが,筆者は「密度関数法って何?」というレベルです.
量子化学ソフトウェアを導入する際に,せめてイメージでも把握しようと高校数学〜大学低学年レベルの数学で勉強した内容をまとめたものです.
ヒルベルト空間の数学に基づいていますが,ここではその雰囲気を味わってみます.
高校数学のベクトルを拡張して関数と統合したような世界のようです.
厳密な記述については成書あるいは他のページを参照してください.

目次(ページ内リンク)


ヒルベルト空間についてイメージする
べクトルと関数とを統合する
関数の内積

ヒルベルト空間についてイメージする

密度汎関数法を使ったソフトウェアのドキュメンを見ると,いきなり,汎関数だの基底関数群セットだのといった術語が出てきます.
調べてみたら,これらの術語は計算の基礎の部分でヒルベルト空間の数学を使っていることを意味しているのでした.
ヒルベルト空間を高校数学の用語で表現すると,「ベクトルと関数を統合して,関数にもノルムや内積を定義した体系」あたりでしょうか.
(ヒルベルトは数学者の名前.空間とは,要素に演算が定義された集合のこと)

高校数学で勉強したように,任意のベクトルは内積を使って基底ベクトルに分解できるのでした.
ベクトルと関数とが統合されたような数学があって,そこでは関数でも内積が使えるなら,分子軌道を表現する関数(電子の確率密度関数とか)も基底関数群に分解できるはず.
逆に,性質がよく解っている基底関数群を結合して,分子軌道を表現する関数を得ることができるはず.
密度汎関数法を使った量子化学ソフトウェアに出てくる,基底関数群の意味はこういうことのようです.

べクトルと関数とを統合する

ベクトルのノルムや内積は高校数学で習います.
ここではもう少し進めて,関数のノルムや内積とはどういうものか勉強してみます.
言ってみれば,「ベクトルのノルムや内積を関数関数でも使えるように,できるだけ自然な形で拡張する」ということです.

ベクトルを,「数を並べて,演算を定義したもの」とみなします.
ここでは数の個数に制限が無いところに留意してください.数を無限個並べることが禁止されていません.

ベクトルの表現方法 その1

ベクトルの表現1

二次元ベクトルなら XY 平面に矢印で描くことができます.三次元でも二次元に投影した図を描けばなんとかなります.
高校数学ではそうでした.

次元数がもっと大きいベクトルを考えます.
例えば,下の 5 次元ベクトル(スペースがもったいないので横ベクトルにしています.以下同)を二次元に描く方法を考えます.

42024

横軸に添字,縦軸に要素をプロットする,という方法があるそうです.
図は,上のベクトルに添え字を付けて,添字を横軸に要素を縦軸にとってプロットしたものです.

添字01234
要素42024

ここで,ノルム(ユークリッドノルム,2-ノルム)は要素を二乗して足し合わせたものの平方根である,ということを確認しておきます.

√(ΣVi2) = √(42 + 22 + 02 + 22 +42)

ベクトルの表現方法 その2

ベクトルの表現2

ベクトルの添字は単に要素の順番を示すインデックスです.大小関係さえ示せれば,自然数ではなくて小数でも構わないとします.
添字を小数とした上で,次元を増やし,下の 9 次元ベクトルを描きました.

添字0.000.501.001.502.002.503.003.504.00
要素4.002.251.000.250.000.251.002.254.00

要素を増やしてプロットすると,このベクトルは二次関数上の点を取り出したものであることが明らかになります.
図では二次関数も上書きしています.
こうなると,添字を独立変数,要素を従属変数と解釈し,「関数とは要素が無限にあるベクトル」とみなせそうです.

独立変数0.000.501.001.502.002.503.003.504.00
従属変数4.002.251.000.250.000.251.002.254.00

関数の内積

関数のノルム

少し上で,ベクトルのノルムは要素を二乗して足し合わせたものの平方根,ということを確認しました.
ある関数 f(x) のノルムを l とすると,

l = √(ΣVi2)

要素が無限にあるような場合,自然な拡張に感じられるように,Σ を ∫ に換えてやるのが常法だそうです.
よって,f(x) のノルムは下のように書き換えることができます(定義域は-∞から∞.いつか数式作成ソフトで書き直します.以下同),

l = √∫f(x)2dx

関数の内積

要素数が有限のベクトルの内積は,対応する要素どうしを掛け算してすべて足し合わせるのでした.
ベクトル U と V との内積を c とすると,

c = Σ(Ui*Vi)

ノルムの場合と同じように Σ を ∫ に換えると,関数 f(x) と g(x) の内積は,

c = ∫(f(x)*g(x))dx

ということになりそうです.
内積空間では(== 内積が定義された数学体系では == 内積を使えば),任意のベクトルを基底ベクトルの線型結合に分解できるのでした.
二次元では,c1,c2 をスカラー,e1,e2 を基底ベクトルとして,

v = c1 * e1 + c2 * e2

これと同じ文脈で,関数の内積が定義されていれば,任意の関数を基底関数群に分解できそうです.
例えば,分子軌道を表現する関数を基底関数群に分解することもできそうです.
例というよりイメージを記せば,ある原子の近傍は 1s 軌道を表す基底関数群 20%,2s 軌道を表す基底関数群 30%……から構成されている,といった感じでしょうか.

ただし,これでは簡略化しすぎです.
内積が無限大になってしまうと,ここで目的としている基底分解ができません.
ヒルベルト空間に属する関数は,内積が有限の値でなければなりません.

汎関数

関数の内積を求めるということは,2 個の関数を入力して 1 個の数値を出力するとみなせそうです.
このように,関数を入力して数値を出力する関数を汎関数といいます.
「密度汎関数法」の「汎関数」です.

ここまでの理解

密度汎関数法では,適当な汎関数(例えば b3lyp)と適当な基底関数群(例えば 6-31+G*)を使って,分子軌道を構築する.
したがって,計算の入力ファイルで汎関数と基底関数群を指定する必要があるわけです.

雰囲気がつかめた気がするので,
あとは先人の計算例から学んだり,基底関数群や汎関数に関する解説記事参考にしたりして,
どのような化合物にどのような基底関数群や汎関数を設定しているかの経験値を上げていけばよさそうです.