読者です 読者をやめる 読者になる 読者になる

生物物理計算化学者の雛

主に科学に関する諸々を書き留めています。

解析解と数値解

数学的な問題の解は大きく「解析解」と「数値解」に分けられます。

例えば「サイコロを2個振って両方とも1が出る確率を求めよ」という問題を考えます。

解析解は理論的・代数的に算出できる解であり、確率の知識があれば「1が出る確率は1/6であり、2回とも1が出る確率は(1/6)^2 = 1/36」と厳密な解をえられます。

一方の数値解は数値計算によって解を得るアプローチです。
この問題であれば以下のRプログラムによる数値シミュレーション(乱数によるモンテカルロ法)を行うことで、厳密解1/36に近い値が得られます。

simulateTwoDice <- function(sampleNum){
  count     <- 0  # (1,1)(2個のサイコロが両方とも1)が出た回数を記憶

  for (i in 1:sampleNum) {
    # サイコロを2個分の乱数を生成
    dice <- sample(c(1,2,3,4,5,6), 2, replace=TRUE,
                   prob=c(1/6,1/6,1/6,1/6,1/6,1/6))
    # (1,1)だったらcountに1を足す
    if(dice[1] == 1 && dice[2] == 1){
      count <- count + 1
    } 
  }
  cat(sprintf("試行回数 %d回、(1,1)の回数 %d回、(1,1)の確率 %f%%\n", 
              sampleNum, count, count/sampleNum * 100))
}

1/36*100  # 厳密解を%表示
simulateTwoDice(10)
simulateTwoDice(100)
simulateTwoDice(1000)
simulateTwoDice(10000)
simulateTwoDice(100000)
simulateTwoDice(1000000)
simulateTwoDice(10000000)

実行結果は以下の通りです

> 1/36*100  # 厳密解を%表示
[1] 2.777778
> simulateTwoDice(10) 
試行回数 10回、(1,1)の回数 0回、(1,1)の確率 0.000000%
> simulateTwoDice(100)
試行回数 100回、(1,1)の回数 2回、(1,1)の確率 2.000000%
> simulateTwoDice(1000)
試行回数 1000回、(1,1)の回数 17回、(1,1)の確率 1.700000%
> simulateTwoDice(10000)
試行回数 10000回、(1,1)の回数 266回、(1,1)の確率 2.660000%
> simulateTwoDice(100000)
試行回数 100000回、(1,1)の回数 2750回、(1,1)の確率 2.750000%
> simulateTwoDice(1000000)
試行回数 1000000回、(1,1)の回数 27817回、(1,1)の確率 2.781700%
> simulateTwoDice(10000000)
試行回数 10000000回、(1,1)の回数 278671回、(1,1)の確率 2.786710%

解析解は厳密な結果を与えるが、常に得られるとは限らない

解析解は厳密な結果を与えます。(先ほどの問題であれば1/36という真の解)

ただし解析解を得ることは難しい、あるいは不可能であるケースが多く、その場合は数値解に頼るほかありません。
以下に例を挙げます。

  • 互いに相互作用する3点以上の物体の運動は(例外はあるが一般に)解析的に解くことができない
    • 多数原子の運動を追跡する分子動力学法(MD法)は数値解析により原子の運動を追跡する
    • 多数電子・原子核間の相互作用を解く分子軌道法(MO法)は数値解析により電子状態を算出する
      • 水素原子(原子核1個+電子1個)は2体問題なので解析解(厳密解)が得られる

実際にこれら2つのケースではRによる数値解析(モンテカルロ法によるシミュレーション)によって数値解を求めました。

数値解は大抵の問題を解くことができるが、計算結果に誤差を含む

解析解が不明な場合も数値解を計算することは多くの場合可能です。

ただし、数値解には誤差が含まれていることは注意する必要があります。

サイコロ2個とも1である確率を数値的に求めた際は、乱数によってサイコロを2個振る試行を多数回行いました。
試行回数が少ない場合は解析解2.778%に十分に近い結果は得られず、解析解に近い結果を得るには1万回以上の試行が必要でした。

サイコロ2個を振るという極めてシンプルな問題であっても1万回を超える試行が必要となるように、十分な精度の数値解を得るためにはかなりの計算資源が必要となります。
さらに数値解がどれだけ解析解(厳密回)に収束しているのかを見積もるためには統計学の知識が必要となってきます。

Rクックブック

Rクックブック

今日から使える統計解析 (今日から使えるシリーズ)

今日から使える統計解析 (今日から使えるシリーズ)