├── .gitignore ├── 00_preface └── README.md ├── 01_basic ├── README.md ├── fig.pptx ├── linear_motion │ ├── linear_motion.dat │ ├── linear_motion.plt │ ├── linear_motion.png │ └── linear_motion.py ├── revolving │ ├── revolving.dat │ ├── revolving.plt │ ├── revolving.png │ ├── revolving.py │ ├── revolving_small.plt │ └── revolving_small.png ├── simulation01.pdf ├── simulation01.pptx └── spring │ ├── spring.dat │ ├── spring.plt │ ├── spring.png │ ├── spring.py │ ├── spring2.dat │ ├── spring2.plt │ ├── spring2.png │ ├── spring2.py │ ├── spring3.dat │ ├── spring3.plt │ ├── spring3.png │ └── spring3.py ├── 02_mc_basic ├── README.md ├── lattice_gas │ ├── .gitignore │ ├── lattice_gas.cpp │ ├── lattice_gas.dat │ ├── lattice_gas.plt │ ├── lattice_gas.png │ ├── makefile │ ├── n2.png │ └── sdouble.hpp ├── pi │ └── pi.py ├── rand │ ├── rand.cpp │ ├── rand.py │ └── rand2.py ├── simple │ ├── makefile │ ├── sdouble.hpp │ ├── simple.cpp │ ├── simple.dat │ ├── simple.plt │ └── simple.png ├── simulation02.pdf └── simulation02.pptx ├── 03_mc_error ├── README.md ├── bias │ ├── bias.dat │ ├── bias.plt │ ├── bias.png │ └── bias.py ├── case1 │ ├── exp1.dat │ ├── exp1.plt │ ├── exp1.png │ ├── exp1.py │ ├── exp1_line.png │ ├── exp2.dat │ ├── exp2.plt │ ├── exp2.png │ ├── exp2.py │ └── exp2_line.png ├── case2 │ ├── corr1.dat │ ├── corr1.plt │ ├── corr1.png │ ├── corr1.py │ ├── corr1_line.png │ ├── corr2.dat │ ├── corr2.plt │ ├── corr2.png │ ├── corr2.py │ └── corr2_line.png ├── case3 │ ├── langevin.dat │ ├── langevin.plt │ ├── langevin.png │ ├── langevin.py │ ├── langevin2.dat │ ├── langevin2.plt │ ├── langevin2.png │ ├── langevin2.py │ ├── langevin_line.png │ ├── langevin_long.png │ ├── langevin_raw.dat │ ├── langevin_raw.plt │ ├── langevin_raw.png │ └── langevin_raw.py ├── errorbar │ ├── errorbar.dat │ ├── errorbar.plt │ ├── errorbar.png │ └── errorbar.py ├── histogram │ ├── compare.png │ ├── histogram.py │ ├── histogram2.py │ ├── n1000.png │ ├── n2.png │ ├── n4.png │ └── population.png ├── simulation03.pdf └── simulation03.pptx ├── 04_mc_advanced ├── README.md ├── improved_estimator │ ├── L064.dat │ ├── binder.png │ ├── graph.plt │ ├── ising_sw.cpp │ ├── m2.png │ ├── m4.png │ └── makefile ├── simulation04.pdf ├── simulation04.pptx ├── simulation04_0511.pptx └── simulation04_old.pptx ├── 05_md_basic ├── README.md ├── integration │ ├── euler.dat │ ├── euler.plt │ ├── euler.png │ ├── euler.py │ ├── vv.dat │ ├── vv.plt │ ├── vv.png │ └── vv.py ├── simulation05.pdf └── simulation05.pptx ├── 06_md_observable ├── README.md ├── simulation06.pdf └── simulation06.pptx ├── 07_md_implementation ├── bf │ └── bf.py ├── lj │ ├── lj.plt │ └── lj.png ├── simulation07.pdf └── simulation07.pptx ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | a.out 2 | -------------------------------------------------------------------------------- /00_preface/README.md: -------------------------------------------------------------------------------- 1 | # はじめに 2 | 3 | この講義では、主にモンテカルロ法と分子動力学法を題材として、数値シミュレーションとはどういうものかを理解することを目的とする。受講者の想定は修士課程の学生、特に一年生である。数値シミュレーションの応用範囲は非常に広く、本講義がカバーする範囲は限られている。また、この講義の受講者で、卒業後に仕事でモンテカルロ法や分子動力学法を使う可能性は低いであろう。したがって、この講義が今後の人生に直接的に役に立つことはなく、またそれを目指してもいない。この講義の目的は、数値シミュレーションという題材を通して、何が当たり前で、何が当たり前でないかをもう一度考えてもらうことだ。 4 | 5 | 数値シミュレーションは、プログラムを書き、実行し、結果を解釈することで新たな知見を得る方法論である。プログラムを書いたのは自分である以上、そのプログラムが何をするものかは完全に理解しているはずだ。にもかかわらず、そこから何か新しいものが生まれる(かもしれない)というのは、一見すると奇妙なことのようにも見える。この講義を通して、数値シミュレーションにおいて「何が自明で、何が非自明か」は意外に非自明な問題であることを知って欲しい。 6 | 7 | 数値計算は、原理や実装は簡単であることが多い。しかし、「数値計算ではいったい何を計算しているのか」「なぜこの量を温度だと定義するのか」「そもそも温度とは何か」などと考え出すと、際限なく深みにはまっていく。これらの問いについて、この講義で用意した答えに納得できないかもしれない。そもそも本当は答えなど無い問いなのかもしれない。本講義では、これまで「あたり前」と思っていたことが、実は「あたり前」ではない例をいくつか紹介する。それにより、この講義で扱っていない、これまであたり前と思っていた事象についても、「それは本当にあたり前なのか」「何を前提にしており、何が非自明な帰結なのか」を気にするようになること、それが本講義の目的である。 8 | 9 | 「あたり前を疑え」とはよく聞くスローガンだ。しかし、十分な基礎知識なく手当たり次第に疑っても、単なる言葉遊びにしかならない。基礎となる「型」があるから「型破り」なのであり、「型」がなければ「型無し」にしかならない。本講義で出てくる細かい数式や用語などを覚える必要はない。それより、「何を前提として、何を得ているのか」を意識するようにして欲しい。この講義を通じて、筆者が感じている数値シミュレーションの面白さが少しでも伝われば幸いだ。 10 | -------------------------------------------------------------------------------- /01_basic/README.md: -------------------------------------------------------------------------------- 1 | # 数値計算の基礎 2 | 3 | * なぜ数値計算が必要なのか? 4 | * 数値実験とはどのような実験か? 5 | * 数値計算の種類 6 | * 単位とスケーリング 7 | 8 | ## 数値シミュレーションとは 9 | 10 | シミュレーションとは、あるルールに従う系の振る舞いを再現、予想することだ。例えば、運転免許を取得する際、ドライブシミュレータを利用した人もいるだろう。ドライブシミュレータは、「ハンドルを切ると曲がり、アクセルを踏むと加速する」といったルールに従って、「もしこのような運転を行ったらどんな結果になるだろうか?」という振る舞いを予想するためのツールだ。同様に、飛行機のパイロットは、計器や操縦桿が実機と同じ場所に配置されているフライトシミュレータを使って訓練する。フライトシミュレータを使えば、現実ではなかなか起きない悪天候での飛行訓練や、エンジン停止など、現実に実施すると危険なアクシデントへの対応を訓練することができる。このシミュレーションを数値的に行うのが数値シミュレーションだ。世の中には様々な数値シミュレーションが存在するが、数値シミュレーションを用いて科学を研究するのが計算科学という分野だ。本講義では計算科学に用いられる数値シミュレーションについて扱う。 11 | 12 | あるルールに従う系の振る舞いを再現、予想するのがシミュレーションであるから、数値シミュレーションとは、あるルールに従う系の振る舞いを **数値的に** 再現、予想するものだ。コンピュータが計算を実施するためには、そのルールはコンピュータがわかる形で厳密に定められていなければならない。あらかじめルールが分かっているのに、そのルールにしたがって何か系が時間発展した結果を「予想」するとはどういうことだろうか?一つ、簡単な例を挙げよう。 13 | 14 | リボ払い、という仕組みを聞いたことがあるだろう。借金を毎月一定額ずつ返済する仕組みだ。返済方法は「残高スライド方式」と「定額方式」の二通りがあるが、ここでは仕組みが簡単な「定額方式」を考える。定額方式は、残高にかかわらず毎月の返済額を固定する仕組みだ。この支払額には金利手数料が含まれており、毎月の支払額から金利手数料を除いた額だけ借入残高が減っていく。 15 | 16 | 例えば、金利15%で、10万円を借りて、毎月1万円の定額方式で返済することを考える。毎月の金利手数料は日割りで計算するが、簡単のため、毎月の金利を1年の金利の12分の1としよう。すると、最初の支払いは以下のように計算される。 17 | 18 | まず、月の金利は、15%の1/12、つまり1.25%だ。残高が10万円なので、金利手数料はその1.25%である1250円である。毎月の支払いは1万円で固定なので、残りの8750円だけ残高が減ることになる。2回目の支払いは、まず残高9万1250円の1.25%である1140円が金利手数料となり、残りの8860円だけ残高が減る。このように定額方式は、毎月の支払いは一定だが、そのうち金利手数料が占める割合が変わっていく仕組みだ。 19 | 20 | さて、このように支払いを進めていくとき、返済回数は何回になり、返済総額はいくらになるか、すぐに計算できるだろうか?少なくとも私は暗算できないし、紙と鉛筆で計算もしたくない。そこで数値計算の出番だ。例えばPythonならこのように書けるだろう。 21 | 22 | ```py 23 | def show_schedule(balance, y_rate, payment): 24 | m_rate = y_rate / 12.0 25 | i = 0 26 | total = 0 27 | while balance > 0: 28 | i = i + 1 29 | interest = int(balance * m_rate) 30 | pay = payment - interest 31 | if balance < pay: 32 | pay = balance 33 | total += pay 34 | total += interest 35 | balance -= pay 36 | print(f"{i} {interest} {pay} {interest + pay} {balance}") 37 | print(f"Total = {total}, {i} times") 38 | ``` 39 | 40 | 例えば10万円を15%の金利で借りて毎月1万円返す場合は`show_schedule(100000,0.15, 10000)`として呼び出す。実行結果はこうなる。 41 | 42 | ```txt 43 | 1 1250 8750 10000 91250 44 | 2 1140 8860 10000 82390 45 | 3 1029 8971 10000 73419 46 | 4 917 9083 10000 64336 47 | 5 804 9196 10000 55140 48 | 6 689 9311 10000 45829 49 | 7 572 9428 10000 36401 50 | 8 455 9545 10000 26856 51 | 9 335 9665 10000 17191 52 | 10 214 9786 10000 7405 53 | 11 92 7405 7497 0 54 | Total = 107497, 11 times 55 | ``` 56 | 57 | つまり、11回の支払いで、返済総額が10万7497円となることがわかった。 58 | 59 | さて、この「数値計算」から何か得るものはあっただろうか?単に定められたルールにしたがって、返済のシミュレーションを行っただけだ。この計算を行って、何か賢くなっただろうか? 60 | 61 | もう少しだけ調べてみよう。借入金額が増えれば増えるほど、返済額に占める金利手数料の割合が増え、返済回数および返済総額が増えるであろう、という予想がつく。借入金額をいろいろ変えて計算し、返済総額の関係をプロットしてみよう。 62 | 63 | ![借入金額と返済総額の関係](revolving/revolving.png) 64 | 65 | 金額が小さいうちは返済総額も対して増えないが、80万円に近づくと急激に返済額が増えて、発散するように見える。 66 | 67 | 実際、80万円を年率15%で借りると、年に金利が12万円となる。月に1万円ずつ返済するのであるから、返済額は金利手数料のみとなり、元本は全く減らなくなる。すなわち、返済回数、および返済総額は無限大だ。 68 | 69 | 「年率15%でお金を借りて、月に1万円ずつ定額で返すリボ払い」は80万円借りると破綻する。これは、言われてみればそうだな、とわかる。しかし、「年率15%でお金を借りて、月に1万円ずつ定額で返すリボ払い」とだけ言われて、「80万円借りると破綻するな」と気づけただろうか?このように、全てのルールがきっちり決まっていて、あとは計算するだけ、という世界で、実際に計算してみると、それまで気が付かなかった知識に気が付くことがある。これが数値計算の意義の一つだ。 70 | 71 | ## なぜ数値計算が必要なのか? 72 | 73 | 数値計算は、プログラムを書いて、そのプログラムになにか入力を与え、その結果を解析することでなにか知見を得る方法論だ。同じプログラムに同じ入力を与えたならば、同じ結果が出てくるはずで、そういう意味においては結果は原理的には予測可能だ。しかし数値計算は時として「すべてのルールがわかっているのに、その予想外の結果を生み出す」ことがある。その例として、パーコレーションと剛体球の相転移問題を取り上げよう。 74 | 75 | ### パーコレーション 76 | 77 | TODO: 書く 78 | 79 | ### 剛体球 80 | 81 | TODO: 書く 82 | 83 | ## 計算物理の基礎 84 | 85 | 数値計算と言っても様々なものがあるが、本講義では計算物理を扱う。計算物理とは、数値計算により物理を研究する学問分野だ。そもそも物理とは、この世の中の現象を理解、記述し、予測する学問だ。そして、なぜかはわからないが、この世の中は微分方程式で記述されている。したがって極言すれば、物理とは微分方程式を解く学問だ。しかし、微分方程式は、ほとんどの場合において厳密に解くことはできない。そこで、微分方程式を数値的に解くことで現象を理解、記述、予測しよう、というのが計算物理である。 86 | 87 | 88 | ここでは、計算物理の基礎的な話題として、離散化と数値の意味について説明する。 89 | 90 | ### 支配方程式と離散化 91 | 92 | 数値計算の守備範囲は非常に広いが、ここではなんらかの時間発展について考えよう。この世界は(人間が観測できる範囲では)時間も空間も連続的であるように見える。しかし、計算機は原則として離散的な値しか扱うことができない。「離散的」とは、1,2,3...と「一つ一つ個別に数えられる」状態のことだ。計算機でも浮動小数点という、一見連続に見える数を扱うことができるが、実際には数を非常に細かく分割しており、連続的に見せているだけに過ぎない。したがって、計算機の中で「世界」を記述するには、本質的になんらかの離散化が必要となる。 93 | 94 | さて、離散化には、「空間の離散化」と「時間の離散化」が存在する。 95 | 96 | TODO: 場の時間発展 97 | 98 | TODO: 要素の時間発展 99 | 100 | 101 | 102 | ### 次元とスケーリング 103 | 104 | この講義で扱う狭義の数値計算は、基本的には微分方程式を数値的に解く手法であった。微分方程式を解くのは、なにか現実を予測したいからだ。したがって、数値計算の結果を現実にあてはめたら何が起きているかを知る必要がある。さて、数値計算を行った結果、得られるのは数値の羅列だ。その数値の羅列がいったい何を意味しているのかは、実は我々が定義してやらなければならない。この時、「いまどのようなスケールの計算をしているか」が問題となる。 105 | 106 | 簡単な例を挙げよう。無重力空間で、何も力が働いていない物体の運動方程式を考える。$x$を位置、$t$を時間、$v$を速度とすると、以下の単純な常微分方程式になる。 107 | 108 | $$ 109 | \frac{dx}{dt} = v 110 | $$ 111 | 112 | これを数値的に解くのは簡単だ。例えばPythonならこんなコードになるだろう。 113 | 114 | ```py 115 | h = 0.1 116 | T = 10 117 | x = 0.0 118 | v = 1.0 119 | steps = int(T/h) 120 | for i in range(steps): 121 | x += v * h 122 | t = i * h 123 | print(f"{t} {x}") 124 | ``` 125 | 126 | 実行するとこんな表示がされる。 127 | 128 | ```txt 129 | 0.0 0.1 130 | 0.1 0.2 131 | 0.2 0.30000000000000004 132 | 0.30000000000000004 0.4 133 | 0.4 0.5 134 | 0.5 0.6 135 | 0.6000000000000001 0.7 136 | 0.7000000000000001 0.7999999999999999 137 | ... 138 | ``` 139 | 140 | この結果をグラフにするとこうなる。 141 | 142 | ![linear_motion](linear_motion/linear_motion.png) 143 | 144 | 時刻$t=0$で位置$x=0$にいた物体が、速度$v=1$を持っていたら、時刻$t=10$には$x=10$にいたよ、という、ただそれだけの計算である。 145 | 146 | さて、ここで出てきた$t=10$とは何秒なんだろうか?また、$x=10$とは何mなのか?それとも何nmなのか?実は、これは我々が勝手に決めて良い。例えば、秒速1mの物体をシミュレーションしていると思えば、シミュレーションの単位時間は1秒、単に長さは1mになるし、時速1kmの物体をシミュレーションしている思えば、このシミュレーションの単位時間は1時間、単位長さは1kmになる。時速1kmと秒速1mは、速度としては全く異なるのに、どちらも同じ方程式の解であるから、どちらも同じ振る舞いを示していることになる。異なる現象が、見る長さのスケールを変えてみることで同じように見えることを「スケーリング」と呼ぶ。スケーリングは単純だが、奥が深い概念だ。 147 | 148 | スケーリングに関して、もう少し調べてみよう。バネで壁に固定された物体の運動を考える。摩擦は考えないものとしよう。質量を$m$、バネ定数を$k$とすると、運動方程式はこう書けるだろう。 149 | 150 | $$ 151 | \begin{aligned} 152 | m\frac{dv}{dt} &= -kx \\ 153 | \frac{dx}{dt} &= v 154 | \end{aligned} 155 | $$ 156 | 157 | これをプログラムに落とすとこうなる。 158 | 159 | ```py 160 | h = 0.1 161 | T = 10 162 | x = 0.0 163 | k = 1.0 164 | m = 1.0 165 | v = 1.0 166 | steps = int(T/h) 167 | for i in range(steps): 168 | v -= x * h 169 | x += v * h 170 | t = i * h 171 | print(f"{t} {x}") 172 | ``` 173 | 174 | 特に難しいことはないだろう。実行するとやはり数値列が表示されるが、グラフにすると以下のような単振動を得る。 175 | 176 | ![spring](spring/spring.png) 177 | 178 | このグラフに出てくる「10」を「10秒」だと思うか「10分」だと思うかによって、表現している現象が変わる。バネ定数が同じであれば、単振動の周期は質量が大きいほど長くなるから、単位時間を「秒」から「分」に変えると、質量が大きくなったように見える。つまり、動画をスロー再生すると、質量が大きく感じられることになる。実はこれがウルトラマンやゴジラといった特撮で古くから使われている手法だ。 179 | 180 | ここで現れるスケーリングについて、きちんと定式化しておこう。数値計算では、値がメートルや秒といった単位を持っているといろいろ不便だし、そもそもあまり意味を持たない。そこで、「数値計算に登場する物理量は、すべて基本的なスケールで無次元化している」と約束する。 181 | 182 | 例えば、質量をキログラム、時間を1秒、長さを1メートルで測った運動方程式が以下で与えられたとする。 183 | 184 | $$ 185 | m\frac{dv}{dt} = -kx 186 | $$ 187 | 188 | この方程式に登場する全ての量は次元を持っている。ここで、$t_0 = 1 [s]$、$m_0 = 1 [kg]$、$l_0 = 1 [m]$という、単位を持った量を用意して、 189 | 190 | $$ 191 | \begin{aligned} 192 | \tilde{t} &= \frac{t}{t_0} \\ 193 | \tilde{x} &= \frac{x}{l_0} \\ 194 | \tilde{m} &= \frac{m}{m_0} \\ 195 | \tilde{v} &= \frac{t_0}{l_0} v 196 | \end{aligned} 197 | $$ 198 | 199 | として、無次元化した量で方程式を書き直そう。代入して整理すると、 200 | 201 | $$ 202 | \tilde{m} \frac{d \tilde{v}}{d \tilde{t}} 203 | = - \frac{t_0^2}{m_0} k \tilde{x} 204 | $$ 205 | 206 | という方程式となる。そこで、 207 | 208 | $$ 209 | \tilde{k} = \frac{m_0}{t_0^2} k 210 | $$ 211 | 212 | として、無次元化したバネ定数$\tilde{k}$を導入すると、先ほどの運動方程式は 213 | 214 | $$ 215 | \tilde{m} \frac{d \tilde{v}}{d \tilde{t}} 216 | = - \tilde{k} \tilde{x} 217 | $$ 218 | 219 | と、元の運動方程式と同じ形になる。そこで、我々は最初から、数値計算に用いる運動方程式は、$m_0$や$l_0$といった「基準となる量」で無次元化した値を使うと約束し、現れる全ての量が無次元化されているとする。 220 | 例えば数値で$\tilde{x}=2.0$と出てきたら、それに$l_0$をかければ「無次元化する前の、元の世界での長さ$x$」を得ることができる。ここで、時間スケール$t_0$や、質量のスケール$m_0$は好きに決めてよいが、それらを決めたらバネ定数のスケールは自動的に決まることに注意しよう。プログラムではパラメータとして$\tilde{k}=1.0$を与えているが、$m_0$として1kg、$t_0$として1秒を選ぶと、 221 | 222 | $$ 223 | k = \frac{t_0^2}{m_0} \tilde{k} 224 | $$ 225 | 226 | であるから、バネ定数は$1 [N/m]$となる。$m_0$として1トンを選ぶと、バネ定数は$10^3 [N/m]$になる。このように、物理量のスケーリングでは独立に決められるスケールの数が決まっており、他を決めたら自動的に決まる量が存在する。 227 | 228 | TODO: まとめ -------------------------------------------------------------------------------- /01_basic/fig.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/fig.pptx -------------------------------------------------------------------------------- /01_basic/linear_motion/linear_motion.dat: -------------------------------------------------------------------------------- 1 | 0.0 0.1 2 | 0.1 0.2 3 | 0.2 0.30000000000000004 4 | 0.30000000000000004 0.4 5 | 0.4 0.5 6 | 0.5 0.6 7 | 0.6000000000000001 0.7 8 | 0.7000000000000001 0.7999999999999999 9 | 0.8 0.8999999999999999 10 | 0.9 0.9999999999999999 11 | 1.0 1.0999999999999999 12 | 1.1 1.2 13 | 1.2000000000000002 1.3 14 | 1.3 1.4000000000000001 15 | 1.4000000000000001 1.5000000000000002 16 | 1.5 1.6000000000000003 17 | 1.6 1.7000000000000004 18 | 1.7000000000000002 1.8000000000000005 19 | 1.8 1.9000000000000006 20 | 1.9000000000000001 2.0000000000000004 21 | 2.0 2.1000000000000005 22 | 2.1 2.2000000000000006 23 | 2.2 2.3000000000000007 24 | 2.3000000000000003 2.400000000000001 25 | 2.4000000000000004 2.500000000000001 26 | 2.5 2.600000000000001 27 | 2.6 2.700000000000001 28 | 2.7 2.800000000000001 29 | 2.8000000000000003 2.9000000000000012 30 | 2.9000000000000004 3.0000000000000013 31 | 3.0 3.1000000000000014 32 | 3.1 3.2000000000000015 33 | 3.2 3.3000000000000016 34 | 3.3000000000000003 3.4000000000000017 35 | 3.4000000000000004 3.5000000000000018 36 | 3.5 3.600000000000002 37 | 3.6 3.700000000000002 38 | 3.7 3.800000000000002 39 | 3.8000000000000003 3.900000000000002 40 | 3.9000000000000004 4.000000000000002 41 | 4.0 4.100000000000001 42 | 4.1000000000000005 4.200000000000001 43 | 4.2 4.300000000000001 44 | 4.3 4.4 45 | 4.4 4.5 46 | 4.5 4.6 47 | 4.6000000000000005 4.699999999999999 48 | 4.7 4.799999999999999 49 | 4.800000000000001 4.899999999999999 50 | 4.9 4.999999999999998 51 | 5.0 5.099999999999998 52 | 5.1000000000000005 5.1999999999999975 53 | 5.2 5.299999999999997 54 | 5.300000000000001 5.399999999999997 55 | 5.4 5.4999999999999964 56 | 5.5 5.599999999999996 57 | 5.6000000000000005 5.699999999999996 58 | 5.7 5.799999999999995 59 | 5.800000000000001 5.899999999999995 60 | 5.9 5.999999999999995 61 | 6.0 6.099999999999994 62 | 6.1000000000000005 6.199999999999994 63 | 6.2 6.299999999999994 64 | 6.300000000000001 6.399999999999993 65 | 6.4 6.499999999999993 66 | 6.5 6.5999999999999925 67 | 6.6000000000000005 6.699999999999992 68 | 6.7 6.799999999999992 69 | 6.800000000000001 6.8999999999999915 70 | 6.9 6.999999999999991 71 | 7.0 7.099999999999991 72 | 7.1000000000000005 7.19999999999999 73 | 7.2 7.29999999999999 74 | 7.300000000000001 7.39999999999999 75 | 7.4 7.499999999999989 76 | 7.5 7.599999999999989 77 | 7.6000000000000005 7.699999999999989 78 | 7.7 7.799999999999988 79 | 7.800000000000001 7.899999999999988 80 | 7.9 7.999999999999988 81 | 8.0 8.099999999999987 82 | 8.1 8.199999999999987 83 | 8.200000000000001 8.299999999999986 84 | 8.3 8.399999999999986 85 | 8.4 8.499999999999986 86 | 8.5 8.599999999999985 87 | 8.6 8.699999999999985 88 | 8.700000000000001 8.799999999999985 89 | 8.8 8.899999999999984 90 | 8.9 8.999999999999984 91 | 9.0 9.099999999999984 92 | 9.1 9.199999999999983 93 | 9.200000000000001 9.299999999999983 94 | 9.3 9.399999999999983 95 | 9.4 9.499999999999982 96 | 9.5 9.599999999999982 97 | 9.600000000000001 9.699999999999982 98 | 9.700000000000001 9.799999999999981 99 | 9.8 9.89999999999998 100 | 9.9 9.99999999999998 101 | -------------------------------------------------------------------------------- /01_basic/linear_motion/linear_motion.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "linear_motion.png" 3 | 4 | set xlabel "Time" 5 | set ylabel "Position" 6 | unset key 7 | p "linear_motion.dat" pt 6 8 | 9 | -------------------------------------------------------------------------------- /01_basic/linear_motion/linear_motion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/linear_motion/linear_motion.png -------------------------------------------------------------------------------- /01_basic/linear_motion/linear_motion.py: -------------------------------------------------------------------------------- 1 | h = 0.1 2 | T = 10 3 | x = 0.0 4 | v = 1.0 5 | steps = int(T/h) 6 | for i in range(steps): 7 | x += v * h 8 | t = i * h 9 | print(f"{t} {x}") 10 | -------------------------------------------------------------------------------- /01_basic/revolving/revolving.dat: -------------------------------------------------------------------------------- 1 | 100000 11 107497 2 | 200000 24 231576 3 | 300000 38 378329 4 | 400000 56 557950 5 | 500000 79 789500 6 | 700000 168 1673673 7 | 780000 297 2968009 8 | 790000 353 3524484 9 | 799999 787 7866683 10 | -------------------------------------------------------------------------------- /01_basic/revolving/revolving.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "revolving.png" 3 | 4 | unset key 5 | p "revolving.dat" u 1:3 w linespoints pt 6 6 | -------------------------------------------------------------------------------- /01_basic/revolving/revolving.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/revolving/revolving.png -------------------------------------------------------------------------------- /01_basic/revolving/revolving.py: -------------------------------------------------------------------------------- 1 | def show_schedule(balance, y_rate, payment): 2 | m_rate = y_rate / 12.0 3 | i = 0 4 | total = 0 5 | while balance > 0: 6 | i = i + 1 7 | interest = int(balance * m_rate) 8 | pay = payment - interest 9 | if balance < pay: 10 | pay = balance 11 | total += pay 12 | total += interest 13 | balance -= pay 14 | print(f"{i} {interest} {pay} {interest + pay} {balance}") 15 | print(f"Total = {total}, {i} times") 16 | 17 | 18 | 19 | def num_payment(balance, y_rate, payment): 20 | m_rate = y_rate / 12.0 21 | i = 0 22 | total = 0 23 | while balance > 0: 24 | i = i + 1 25 | interest = int(balance * m_rate) 26 | pay = payment - interest 27 | if balance < pay: 28 | pay = balance 29 | total += pay 30 | total += interest 31 | balance -= pay 32 | #print(f"{i} {interest} {pay} {interest + pay} {balance}") 33 | return i, total 34 | 35 | def main(): 36 | y_rate = 0.15 # Yearly rate 37 | payment = 10000 # Monthly payment 38 | b = [100000, 200000, 300000, 400000, 500000, 700000, 780000, 790000, 799999] 39 | for balance in b: 40 | n, total = num_payment(balance, y_rate, payment) 41 | print(balance, n, total) 42 | 43 | if __name__ == '__main__': 44 | #main() 45 | show_schedule(100000,0.15, 10000) 46 | -------------------------------------------------------------------------------- /01_basic/revolving/revolving_small.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "revolving_small.png" 3 | 4 | unset key 5 | p [0:410000] [0:]"revolving.dat" u 1:3 with linespoints pt 6,x lc "black" 6 | -------------------------------------------------------------------------------- /01_basic/revolving/revolving_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/revolving/revolving_small.png -------------------------------------------------------------------------------- /01_basic/simulation01.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/simulation01.pdf -------------------------------------------------------------------------------- /01_basic/simulation01.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/simulation01.pptx -------------------------------------------------------------------------------- /01_basic/spring/spring.dat: -------------------------------------------------------------------------------- 1 | 0.0 0.1 2 | 0.1 0.199 3 | 0.2 0.29601 4 | 0.30000000000000004 0.3900599 5 | 0.4 0.48020920100000003 6 | 0.5 0.56555640999 7 | 0.6000000000000001 0.6452480548801001 8 | 0.7000000000000001 0.718487219221399 9 | 0.8 0.784541511370484 10 | 0.9 0.8427503884058641 11 | 1.0 0.8925317615571856 12 | 1.1 0.9333878170929353 13 | 1.2000000000000002 0.9649099944577556 14 | 1.3 0.9867830718779984 15 | 1.4000000000000001 0.9987883185794612 16 | 1.5 1.0008056820951292 17 | 1.6 0.9928149887898461 18 | 1.7000000000000002 0.9748961455966645 19 | 1.8 0.9472283409475162 20 | 1.9000000000000001 0.9100882528888927 21 | 2.0 0.8638472823013804 22 | 2.1 0.8089678388908542 23 | 2.2 0.7459987170914195 24 | 2.3000000000000003 0.6755696081210706 25 | 2.4000000000000004 0.598384803069511 26 | 2.5 0.5152161499872563 27 | 2.6 0.42689533540512903 28 | 2.7 0.33430556746895046 29 | 2.8000000000000003 0.23837274385808238 30 | 2.9000000000000004 0.14005619280863352 31 | 3.0 0.0403390798310983 32 | 3.1 -0.05978142394474789 33 | 3.2 -0.1593041134811466 34 | 3.3000000000000003 -0.25723376188273384 35 | 3.4000000000000004 -0.3525910726654937 36 | 3.5 -0.4444224727215987 37 | 3.6 -0.5318096480504877 38 | 3.7 -0.6138787268988718 39 | 3.8000000000000003 -0.6898090184782671 40 | 3.9000000000000004 -0.7588412198728799 41 | 4.0 -0.8202850090687638 42 | 4.1000000000000005 -0.87352594817396 43 | 4.2 -0.9180316277974166 44 | 4.3 -0.9533569911428992 45 | 4.4 -0.9791487845769526 46 | 4.5 -0.9951490901652367 47 | 4.6000000000000005 -1.0011979048518682 48 | 4.7 -0.9972347404899812 49 | 4.800000000000001 -0.9832992287231943 50 | 4.9 -0.9595307246691755 51 | 5.0 -0.926166913368465 52 | 5.1000000000000005 -0.8835414329340698 53 | 5.2 -0.8320805381703339 54 | 5.300000000000001 -0.7722988380248946 55 | 5.4 -0.7047941494992064 56 | 5.5 -0.6302415194785261 57 | 5.6000000000000005 -0.5493864742630606 58 | 5.7 -0.4630375643049645 59 | 5.800000000000001 -0.37205827870381875 60 | 5.9 -0.2773584103156348 61 | 6.0 -0.17988495782429448 62 | 6.1000000000000005 -0.08061265575471122 63 | 6.2 0.019465772872419157 64 | 6.300000000000001 0.11934954377082534 65 | 6.4 0.21803981923152327 66 | 6.5 0.31454969649990594 67 | 6.6000000000000005 0.40791407680328956 68 | 6.7 0.4971993163386403 69 | 6.800000000000001 0.5815125627106046 70 | 6.9 0.6600106834554629 71 | 7.0 0.7319086973657665 72 | 7.1000000000000005 0.7964876243024125 73 | 7.2 0.8531016749960344 74 | 7.300000000000001 0.9011847089396959 75 | 7.4 0.9402558957939605 76 | 7.5 0.9699245236902855 77 | 7.6000000000000005 0.9898939063497075 78 | 7.7 0.9999643499456325 79 | 7.800000000000001 1.0000351500421012 80 | 7.9 0.9901055986381488 81 | 8.0 0.970274991247815 82 | 8.1 0.9407416339450031 83 | 8.200000000000001 0.9018008603027411 84 | 8.3 0.8538420780574517 85 | 8.4 0.7973448750315878 86 | 8.5 0.732874223255408 87 | 8.6 0.6610748292466742 88 | 8.700000000000001 0.5826646869454736 89 | 8.8 0.4984278977748182 90 | 8.9 0.4092068296264147 91 | 9.0 0.31589369318174704 92 | 9.1 0.2194216198052619 93 | 9.200000000000001 0.12075533023072413 94 | 9.3 0.020881487353879125 95 | 9.4 -0.07920117039650466 96 | 9.5 -0.1784918164429234 97 | 9.600000000000001 -0.2759975443249129 98 | 9.700000000000001 -0.3707432967636533 99 | 9.8 -0.46178161623475716 100 | 9.9 -0.5482021195435134 101 | -------------------------------------------------------------------------------- /01_basic/spring/spring.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "spring.png" 3 | 4 | set xlabel "Time" 5 | set ylabel "Position" 6 | unset key 7 | p "spring.dat" pt 6 8 | 9 | -------------------------------------------------------------------------------- /01_basic/spring/spring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/spring/spring.png -------------------------------------------------------------------------------- /01_basic/spring/spring.py: -------------------------------------------------------------------------------- 1 | h = 0.1 2 | T = 10 3 | x = 0.0 4 | k = 1.0 5 | m = 1.0 6 | v = 1.0 7 | steps = int(T/h) 8 | for i in range(steps): 9 | v -= k * x / m * h 10 | x += v * h 11 | t = i * h 12 | print(f"{t} {x}") 13 | -------------------------------------------------------------------------------- /01_basic/spring/spring2.dat: -------------------------------------------------------------------------------- 1 | 0.0 0.1 2 | 0.1 0.19975 3 | 0.2 0.299000625 4 | 0.30000000000000004 0.3975037484375 5 | 0.4 0.4950131125039063 6 | 0.5 0.5912849437890528 7 | 0.6000000000000001 0.6860785627147267 8 | 0.7000000000000001 0.7791569852336138 9 | 0.8 0.8702875152894167 10 | 0.9 0.9592423265569963 11 | 1.0 1.0457990320081834 12 | 1.1 1.1297412398793498 13 | 1.2000000000000002 1.210859094650818 14 | 1.3 1.288949801685659 15 | 1.4000000000000001 1.363818134216286 16 | 1.5 1.4352769214113723 17 | 1.6 1.5031475163029302 18 | 1.7000000000000002 1.5672602424037307 19 | 1.8 1.627454817898522 20 | 1.9000000000000001 1.6835807563485667 21 | 2.0 1.7354977429077403 22 | 2.1 1.7830759851096443 23 | 2.2 1.8261965373487743 24 | 2.3000000000000003 1.8647515982445324 25 | 2.4000000000000004 1.898644780144679 26 | 2.5 1.9277913500944641 27 | 2.6 1.952118441669013 28 | 2.7 1.9715652371393892 29 | 2.8000000000000003 1.986083119516917 30 | 2.9000000000000004 1.9956357940956526 31 | 3.0 2.0001993791891493 32 | 3.1 1.9997624658346729 33 | 3.2 1.9943261463156097 34 | 3.3000000000000003 1.9839040114307576 35 | 3.4000000000000004 1.9685221165173286 36 | 3.5 1.9482189163126062 37 | 3.6 1.9230451688171024 38 | 3.7 1.8930638083995557 39 | 3.8000000000000003 1.85834978846101 40 | 3.9000000000000004 1.818989894051312 41 | 4.0 1.7750825249064857 42 | 4.1000000000000005 1.726737449449393 43 | 4.2 1.674075530368677 44 | 4.3 1.6172284224620392 45 | 4.4 1.5563382434992463 46 | 4.5 1.4915572189277053 47 | 4.6000000000000005 1.4230473013088452 48 | 4.7 1.3509797654367128 49 | 4.800000000000001 1.2755347801509886 50 | 4.9 1.196900957914887 51 | 5.0 1.1152748832839983 52 | 5.1000000000000005 1.0308606214448994 53 | 5.2 0.9438692080521884 54 | 5.300000000000001 0.8545181216393469 55 | 5.4 0.763030739922407 56 | 5.5 0.669635781355661 57 | 5.6000000000000005 0.574566733335526 58 | 5.7 0.4780612684820521 59 | 5.800000000000001 0.3803606504573731 60 | 5.9 0.2817091308065507 61 | 6.0 0.1823533383287119 62 | 6.1000000000000005 0.08254166250505132 63 | 6.2 -0.017476367474871884 64 | 6.300000000000001 -0.11745070653610791 65 | 6.4 -0.21713141883100368 66 | 6.5 -0.3162693025788219 67 | 6.6000000000000005 -0.4146165130701931 68 | 6.7 -0.5119271822788888 69 | 6.800000000000001 -0.6079580335318873 70 | 6.9 -0.7024689897010561 71 | 7.0 -0.7952237733959722 72 | 7.1000000000000005 -0.8859904976573983 73 | 7.2 -0.9745422456746811 74 | 7.300000000000001 -1.060657638077777 75 | 7.4 -1.1441213863856785 76 | 7.5 -1.2247248312276158 77 | 7.6000000000000005 -1.302266463991484 78 | 7.7 -1.3765524305953736 79 | 7.800000000000001 -1.4473970161227747 80 | 7.9 -1.514623109109869 81 | 8.0 -1.5780626443241885 82 | 8.1 -1.6375570229276977 83 | 8.200000000000001 -1.6929575089738875 84 | 8.3 -1.7441256012476427 85 | 8.4 -1.7909333795182787 86 | 8.5 -1.833263824340119 87 | 8.6 -1.8710111096011088 88 | 8.700000000000001 -1.904080867088096 89 | 8.8 -1.932390422407363 90 | 8.9 -1.9558690016706115 91 | 9.0 -1.9744579084296836 92 | 9.1 -1.9881106704176814 93 | 9.200000000000001 -1.996793155729635 94 | 9.3 -2.0004836581522647 95 | 9.4 -1.9991729514295136 96 | 9.5 -1.9928643123281886 97 | 9.600000000000001 -1.9815735124460432 98 | 9.700000000000001 -1.9653287787827827 99 | 9.8 -1.9441707231725653 100 | 9.9 -1.9181522407544165 101 | -------------------------------------------------------------------------------- /01_basic/spring/spring2.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "spring2.png" 3 | 4 | set xlabel "Time" 5 | set ylabel "Position" 6 | unset key 7 | p "spring.dat" t "m=1" pt 6 ps 1.5,"spring2.dat" t "m=4" pt 7 ps 1.5 8 | 9 | -------------------------------------------------------------------------------- /01_basic/spring/spring2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/spring/spring2.png -------------------------------------------------------------------------------- /01_basic/spring/spring2.py: -------------------------------------------------------------------------------- 1 | h = 0.1 2 | T = 10 3 | x = 0.0 4 | k = 1.0 5 | m = 4.0 6 | v = 1.0 7 | steps = int(T/h) 8 | for i in range(steps): 9 | v -= k * x / m * h 10 | x += v * h 11 | t = i * h 12 | print(f"{t} {x}") 13 | -------------------------------------------------------------------------------- /01_basic/spring/spring3.dat: -------------------------------------------------------------------------------- 1 | 0.0 0.2 2 | 0.2 0.398 3 | 0.4 0.59202 4 | 0.6000000000000001 0.7801198 5 | 0.8 0.9604184020000001 6 | 1.0 1.13111281998 7 | 1.2000000000000002 1.2904961097602001 8 | 1.4000000000000001 1.436974438442798 9 | 1.6 1.569083022740968 10 | 1.8 1.6855007768117283 11 | 2.0 1.7850635231143712 12 | 2.2 1.8667756341858706 13 | 2.4000000000000004 1.9298199889155112 14 | 2.6 1.9735661437559968 15 | 2.8000000000000003 1.9975766371589223 16 | 3.0 2.0016113641902584 17 | 3.2 1.9856299775796922 18 | 3.4000000000000004 1.949792291193329 19 | 3.6 1.8944566818950324 20 | 3.8000000000000003 1.8201765057777854 21 | 4.0 1.7276945646027608 22 | 4.2 1.6179356777817084 23 | 4.4 1.491997434182839 24 | 4.6000000000000005 1.3511392162421412 25 | 4.800000000000001 1.196769606139022 26 | 5.0 1.0304322999745126 27 | 5.2 0.8537906708102581 28 | 5.4 0.6686111349379009 29 | 5.6000000000000005 0.47674548771616476 30 | 5.800000000000001 0.28011238561726703 31 | 6.0 0.0806781596621966 32 | 6.2 -0.11956284788949578 33 | 6.4 -0.3186082269622932 34 | 6.6000000000000005 -0.5144675237654677 35 | 6.800000000000001 -0.7051821453309874 36 | 7.0 -0.8888449454431974 37 | 7.2 -1.0636192961009754 38 | 7.4 -1.2277574537977436 39 | 7.6000000000000005 -1.3796180369565343 40 | 7.800000000000001 -1.5176824397457598 41 | 8.0 -1.6405700181375276 42 | 8.200000000000001 -1.74705189634792 43 | 8.4 -1.8360632555948333 44 | 8.6 -1.9067139822857984 45 | 8.8 -1.9582975691539053 46 | 9.0 -1.9902981803304733 47 | 9.200000000000001 -2.0023958097037364 48 | 9.4 -1.9944694809799624 49 | 9.600000000000001 -1.9665984574463886 50 | 9.8 -1.919061449338351 51 | 10.0 -1.85233382673693 52 | 10.200000000000001 -1.7670828658681397 53 | 10.4 -1.6641610763406678 54 | 10.600000000000001 -1.5445976760497893 55 | 10.8 -1.4095882989984128 56 | 11.0 -1.2604830389570523 57 | 11.200000000000001 -1.0987729485261213 58 | 11.4 -0.926075128609929 59 | 11.600000000000001 -0.7441165574076375 60 | 11.8 -0.5547168206312696 61 | 12.0 -0.35976991564858896 62 | 12.200000000000001 -0.16122531150942243 63 | 12.4 0.038931545744838314 64 | 12.600000000000001 0.23869908754165067 65 | 12.8 0.43607963846304654 66 | 13.0 0.6290993929998119 67 | 13.200000000000001 0.8158281536065791 68 | 13.4 0.9943986326772806 69 | 13.600000000000001 1.1630251254212092 70 | 13.8 1.3200213669109258 71 | 14.0 1.463817394731533 72 | 14.200000000000001 1.592975248604825 73 | 14.4 1.7062033499920688 74 | 14.600000000000001 1.8023694178793919 75 | 14.8 1.880511791587921 76 | 15.0 1.939849047380571 77 | 15.200000000000001 1.979787812699415 78 | 15.4 1.999928699891265 79 | 15.600000000000001 2.0000703000842024 80 | 15.8 1.9802111972762977 81 | 16.0 1.94054998249563 82 | 16.2 1.8814832678900062 83 | 16.400000000000002 1.8036017206054822 84 | 16.6 1.7076841561149034 85 | 16.8 1.5946897500631756 86 | 17.0 1.465748446510816 87 | 17.2 1.3221496584933483 88 | 17.400000000000002 1.1653293738909472 89 | 17.6 0.9968557955496364 90 | 17.8 0.8184136592528294 91 | 18.0 0.6317873863634941 92 | 18.2 0.4388432396105238 93 | 18.400000000000002 0.24151066046144826 94 | 18.6 0.04176297470775825 95 | 18.8 -0.15840234079300933 96 | 19.0 -0.3569836328858468 97 | 19.200000000000003 -0.5519950886498258 98 | 19.400000000000002 -0.7414865935273066 99 | 19.6 -0.9235632324695143 100 | 19.8 -1.0964042390870268 101 | -------------------------------------------------------------------------------- /01_basic/spring/spring3.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "spring3.png" 3 | 4 | set xlabel "Time" 5 | set ylabel "Position" 6 | unset key 7 | p [0:10] "spring2.dat" pt 6,"spring3.dat" pt 7 8 | 9 | -------------------------------------------------------------------------------- /01_basic/spring/spring3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/01_basic/spring/spring3.png -------------------------------------------------------------------------------- /01_basic/spring/spring3.py: -------------------------------------------------------------------------------- 1 | h = 0.1 2 | T = 10 3 | x = 0.0 4 | k = 1.0 5 | m = 1.0 6 | v = 2 7 | steps = int(T/h) 8 | for i in range(steps): 9 | v -= k * x / m * h 10 | x += v * h 11 | t = i * h 12 | print(f"{2.0*t} {x}") -------------------------------------------------------------------------------- /02_mc_basic/README.md: -------------------------------------------------------------------------------- 1 | # モンテカルロ法(1)基礎的な話題 2 | 3 | * 乱数とはなにか 4 | * モンテカルロ法 5 | * マルコフ連鎖モンテカルロ法 6 | 7 | ## はじめに 8 | 9 | モンテカルロ法とは、乱数を使って何かを評価する方法だ。一般には単純なモンテカルロ法が使われることは稀で、ほとんどの場合「モンテカルロ法」と言うとマルコフ連鎖モンテカルロ法のことを指す。モンテカルロ法の原理は非常に単純であり、コードも比較的容易だ。しかし、その本質の理解はかなり難しい。以下では、乱数の説明からはじめ、モンテカルロ法とはなにか、なぜ必要なのか、何が難しいのかをなるべく平易に説明する。 10 | 11 | ## 乱数とはなにか? 12 | 13 | まずは乱数を定義しよう。何か数列$r_i$があるとする。$r_0$から$r_i$まで既知である時に$r_{i+1}$を全く予想できない時、この数列を**乱数列(random sequence)**、乱数列のそれぞれの要素を**乱数(random number)**と呼ぶ。簡単な例はサイコロだ。$i$回目に振った時のサイコロの目を$r_i$としよう。この時、$r_i$は1から6までのどれかの値を取る。さて、いま5回サイコロを振って、「1,5,3,2,2,2」という目が出たとする。この時、7回目のサイコロの目$r_7$を予想できるだろうか?イカサマの無いサイコロであれば、$r_7$が取る値は1から6まで等確率であるから、過去の履歴を知っているからといって、値を当てる確率は増えない。このように、過去の履歴から次の値が全く予想できないため、「サイコロを振ってでてきた目の履歴」は乱数列とみなすことができる。 14 | 15 | 乱数はコンピュータでよく使われている。例えばゲームでは乱数は欠かせない。ソシャゲのガチャや、RPGの「会心の一撃」、ポケットモンスターの個体差などに乱数が使われている。コンピュータで使われる乱数は、これまでの履歴から次の数を作っているため、原理的には次の数が予想可能だ。このような乱数を**疑似乱数(pseudo random number)**と呼ぶ。数値計算で使う乱数は疑似乱数であるため、単に乱数と言うと疑似乱数のことを指す。 16 | 17 | 一方、真の意味で次の数が予想できない「本当の乱数」を「真乱数」と呼び、疑似乱数と区別することがある。真乱数は、熱雑音や、放射性物質の崩壊など、物理現象を利用して生成する。このような装置を物理乱数生成器と呼ぶ。サイコロも一種の物理乱数生成器と言える。一部のCPUには、物理乱数生成器を搭載しているものもある(例えばIntelのrdrandなど)。 18 | 19 | 疑似乱数は、一見すると乱数に見えるが、周期性があったり、十分に長い履歴を知ると次の値が予想できたりするため、たとえばセキュリティ目的などに使う場合は注意が必要だ。しかし、数値計算で使う乱数は 20 | 21 | * 十分に周期性が長い(相関がほとんど無い) 22 | * 出現する数に偏りがない(一様性) 23 | 24 | という条件さえ満たされていれば、予測可能であっても問題ないことが多い。逆に、同じ乱数の種からは同じ乱数列が生成されることを積極的に利用し、乱数を使ったコードのデバッグを行う。疑似乱数を生成するアルゴリズムはいろいろあるが、現在広く使われているのはメルセンヌ・ツイスター法で、ほとんどのプログラミング言語において、乱数を生成する関数のデフォルトに選ばれている。一方、Xorshift法という、極めて高速に動作し、乱数の性質も(メルセンヌ・ツイスターには及ばないものの)非常に良い手法も提案されており、Google ChromeのJavaScriptの乱数生成関数`Math.random()`に採用されている。 25 | 26 | 疑似乱数生成アルゴリズムについては詳しくは触れないが、その性質と使い方だけ簡単に見ておこう。例えばPythonで乱数を使うには`random`を`import`してから`random.random()`を呼び出す。これは、呼び出すたびに異なる0から1までの浮動小数点数を返す関数だ。 27 | 28 | ```py 29 | import random 30 | for _ in range(5): 31 | print(random.random()) 32 | ``` 33 | 34 | 実行するたびに異なる値が表示される。 35 | 36 | ```sh 37 | $ python3 rand.py 38 | 0.7183142085184294 39 | 0.625356371754038 40 | 0.8206028825940407 41 | 0.5122008096362916 42 | 0.7253633754087734 43 | 44 | $ python3 rand.py 45 | 0.3618195051209263 46 | 0.7496549080606681 47 | 0.3396919019733251 48 | 0.9722928645993307 49 | 0.3532634875426808 50 | ``` 51 | 52 | しかし、「乱数の種」を指定すると、何度実行しても同じ数列が表示される。 53 | 54 | ```py 55 | import random 56 | random.seed(1) 57 | for _ in range(5): 58 | print(random.random()) 59 | ``` 60 | 61 | ```sh 62 | $ python3 rand.py 63 | 0.13436424411240122 64 | 0.8474337369372327 65 | 0.763774618976614 66 | 0.2550690257394217 67 | 0.49543508709194095 68 | 69 | $ pyton3 rand.py 70 | 0.13436424411240122 71 | 0.8474337369372327 72 | 0.763774618976614 73 | 0.2550690257394217 74 | 0.49543508709194095 75 | ``` 76 | 77 | 疑似乱数生成は、これまでの履歴をうまいこと使って次の数を作るアルゴリズムであるから、乱数の「種」が同じならば、履歴が同じになり、必ず同じ数列が得られる。Pythonで種を指定しなかった場合に毎回異なる数列が得られたのは、種を指定しなかった場合にシステム時刻が指定されるからだ。 78 | 79 | 一方、C++では、乱数の種を指定しなければ同じ種が使われるため、何度実行しても同じ結果になる。 80 | 81 | ```cpp 82 | #include 83 | #include 84 | 85 | int main() { 86 | std::mt19937 mt; 87 | std::uniform_real_distribution<> ud(0.0, 1.0); 88 | for (int i = 0; i < 5; i++) { 89 | std::cout << ud(mt) << std::endl; 90 | } 91 | } 92 | ``` 93 | 94 | ```sh 95 | $ g++ rand.cpp 96 | $ ./a.out 97 | 0.135477 98 | 0.835009 99 | 0.968868 100 | 0.221034 101 | 0.308167 102 | 103 | $ ./a.out 104 | 0.135477 105 | 0.835009 106 | 0.968868 107 | 0.221034 108 | 0.308167 109 | ``` 110 | 111 | このように、乱数生成にい同じアルゴリズムを使っていても、異なる言語では異なる仕様になっていたりするので注意が必要だ。 112 | 113 | ## モンテカルロ法 114 | 115 | モンテカルロ法とは、乱数を使ってなにかの期待値を計算する手法の総称だ。数値計算において、なにかの期待値を計算したいことがよくある。しかし、興味ある系において期待値が厳密に計算できることはほとんどないため、乱数を使ったサンプリングにより期待値を求めることになる。 116 | 117 | モンテカルロ法の例として「円周率の計算」がよく出てくる。0から1の間の一様乱数を$x$、$y$と二つ作り、その二乗和$x^2+y^2$が1より小さい確率を求めることで、それが$\pi/4$となることから円周率が求まる。 118 | 119 | たとえばコードはこんな感じになるだろう。 120 | 121 | ```py 122 | import random 123 | 124 | random.seed(1) 125 | pi = 0.0 126 | N = 1000000 127 | for _ in range(N): 128 | x = random.random() 129 | y = random.random() 130 | if x**2 + y**2 < 1.0: 131 | pi = pi + 1.0 132 | pi = pi/N*4 133 | print(pi) 134 | ``` 135 | 136 | 実行結果はこうなる。 137 | 138 | ```sh 139 | $ python3 pi.py 140 | 3.14138 141 | ``` 142 | 143 | この計算は、数式で表すなら以下の積分を実行していることに対応する。 144 | 145 | $$ 146 | \frac{\pi}{4} = \int_0^1 \int_0^1 \Theta (1- x^2 + y^2) dx dy 147 | $$ 148 | 149 | ここで$\Theta(x)$は、$x>0$なら$1$、$x<0$なら$0$となる関数(ヘヴィサイドの階段関数)だ。先程のコードは、サンプリングによりこの積分値を評価していることに対応する。このように、モンテカルロ法は「式は書けるけれど、厳密に評価することが難しい和や積分」の評価に使われる。 150 | 151 | さて、ここで使われた手法は単純サンプリングと呼ばれ、効率がよくない。数値計算で使われるモンテカルロ法は、ほぼ「マルコフ連鎖モンテカルロ法」のことを指す。以下では、まず単純サンプリングで用語の説明をした後、マルコフ連鎖モンテカルロ法について説明する。 152 | 153 | ### 単純サンプリング 154 | 155 | いま、公平なサイコロがあったとしよう。1から6までの目が書いてある。それぞれの目の出る確率が等しい時、サイコロの目の期待値はどれくらいだろうか?答えはすぐに「3.5」だとわかるが、後のために用語を定義しながらきちんと議論しておく。しばらく「当たり前」の議論が続くが、我慢してついてきて欲しい。 156 | 157 | サイコロの目の状態に通し番号をつけ、$k$番目の状態の目の値を$Y_k$で表現する。$k$は1から6までで、$Y_k = k$だ。状態$k$が出る確率を$p_k$としよう。この時、サイコロの目の期待値$\bar{X}$は、以下のように表現できる。 158 | 159 | $$ 160 | \bar{X} = \sum_{k=1}^6 Y_k p_k = \sum_{k=1}^6 k p_k 161 | $$ 162 | 163 | 公平なサイコロであれば、全ての目の出る確率が等しいため、$p_k$は$k$に寄らず$1/6$だ。したがって、 164 | 165 | $$ 166 | \bar{X} = \sum_{k=1}^6 \frac{k}{6} = 3.5 167 | $$ 168 | 169 | と期待値が厳密に計算できる。さて、サイコロが公平であることを事前に知らない、もしくは確信が持てないとしよう。すると、どの目がどれくらい出るかわからない。したがって、目として$k$が出る確率$p_k$を推定してやる必要がある。 170 | 171 | まずは何度もサイコロを振って、$k$が出た回数を数えよう。これを$w_k$とする。サイコロを振った回数の総数$N$は、$w_k$の和で表せる。 172 | 173 | $$ 174 | N = \sum_k w_k 175 | $$ 176 | 177 | サイコロにおいて$k$の目がでる確率は$w_k$に比例すると考えられるから、$k$が出る確率$p_k$は、$N$と$w_k$の比として推定できる。 178 | 179 | $$ 180 | p_i \sim \frac{w_k}{N} 181 | $$ 182 | 183 | 以上から、サイコロの目の期待値は 184 | 185 | $$ 186 | \bar{X} = \sum_k k p_k \sim \sum_k k \frac{w_k}{N} 187 | $$ 188 | 189 | ここで$w_k$を状態$k$の **重み(weight)** と呼ぶ。 190 | 191 | さて、サイコロを何度も振り、$i$回目に出た目が$\hat{X}_i$だったとしよう。サイコロを$N$回振って、出た目が$k$であった回数は以下のように書ける。 192 | 193 | $$ 194 | w_k = \sum_{i=1}^N \delta_{\hat{X}_i, k} 195 | $$ 196 | 197 | $\delta_{\mu,\nu}$はクロネッカーのデルタで、$\mu=\nu$の時に1、そうでなければ0となるものだ。わざわざ式で書いているが、サイコロの目が出た回数を数えているだけだ。確率の問題では、このように「当たり前」のことを式で表現すると面倒な形になることが多い。 198 | 199 | さて、$w_k$を先の式に代入しよう。 200 | 201 | $$ 202 | \bar{X} \sim \sum_k k \frac{w_k}{N} = 203 | \frac{1}{N} \sum_k k \sum_{i=1}^N \delta_{\hat{X}_i, k} 204 | $$ 205 | 206 | 和を入れ替える。 207 | 208 | $$ 209 | \sum_k k \sum_{i=1}^N \delta_{\hat{X}_i, k} 210 | = \sum_{i=1}^N \sum_k k \delta_{\hat{X}_i, k} 211 | $$ 212 | 213 | $k\delta_{\hat{X}_i, k}$は、$\hat{X}_i = k$の時にkに、それ以外は$0$となるから、$k$に関して和を取ると、単純に$\hat{X}_i$になる。 214 | 215 | 以上から、 216 | 217 | $$ 218 | \hat{X} \sim \frac{1}{N} \sum_{i=1}^N \hat{X}_i 219 | $$ 220 | 221 | を得た。要するに何度もサイコロを振って、その平均を取りなさい、と言ってるだけだ。 222 | 223 | さて、上記の議論では、サイコロの目$k$が出る時の重み$w_k$が未知だが、実際にサイコロを振ることで、サイコロの目$k$が$p_k$に従って出現することを利用していた。しかし、数値計算では、$w_k$も$p_k$も未知だが、$p_k$に従って状態$k$が出現してくれるようなシチュエーションは存在せず、状態$k$の重み$w_k$が既知だが、その総和$Z$を求めることができず、結果として$p_k$が未知である状態であることがほとんどだ。その場合にどのように期待値を推定するか見てみよう。 224 | 225 | 我々は状態$k$の重み$w_k$が既知であるが、その総和$Z$が未知であるとする。その状態で、 226 | 227 | $$ 228 | \bar{X} = \sum_k k p_k 229 | $$ 230 | 231 | を推定したい。 232 | 233 | $$ 234 | p_k = \frac{w_k}{\sum_k w_k} 235 | $$ 236 | 237 | であるから、 238 | 239 | $$ 240 | \bar{X} = \frac{\sum_k k w_k}{\sum_k w_k} 241 | $$ 242 | 243 | となる。まずは分母を評価することを考えよう。 244 | 245 | $$ 246 | Z = \sum_k w_k 247 | $$ 248 | 249 | 和のままでも議論できるが、積分の方がわかりやすいので、$k$が十分に大きいとして積分だと思うことにしよう(もとがサイコロなので$k$は大きくないが、ここでは見逃してもらうことにする)。$k$の最小値、最大値をそれぞれ$k_\mathrm{min},k_\mathrm{max}$とすると、 250 | 251 | $$ 252 | Z = \int_{k_\mathrm{min}}^{k_\mathrm{max}} w(k) dk 253 | $$ 254 | 255 | となる。この積分を、乱数を使って評価しよう。$k_\mathrm{min} < \hat{X}_i < k_\mathrm{max}$であるような一様乱数を考える。この乱数を$N$回生成させ、その$i$番目の値を$\hat{X}_i$とする。一度出現させた乱数$\hat{X}_i$に、領域を$N$等分した範囲 256 | 257 | $$ 258 | \Delta k \equiv \frac{k_\mathrm{max}- k_\mathrm{min}}{N} 259 | $$ 260 | 261 | をかけて、小さい短冊の和として積分を評価してやる。すると、 262 | 263 | $$ 264 | Z = \sum_k w_k \sim \sum_i w_{\hat{X}_i} \Delta k 265 | $$ 266 | 267 | となる。同様に分子も、 268 | 269 | $$ 270 | \sum_k k w_k \sim \sum_i \hat{X}_i w_{\hat{X}_i} \Delta k 271 | $$ 272 | 273 | となる。以上から、平均値の推定値は 274 | 275 | $$ 276 | \bar{X} = \frac{\sum_k k w_k}{\sum_k w_k} 277 | \sim \frac{\sum_i \hat{X}_i w_{\hat{X}_i}}{\sum_i w_{\hat{X}_i}} 278 | $$ 279 | 280 | と推定される。このように、なにかの期待値をランダムな標本を使って推定する手法を**サンプリング**と呼ぶ。特に、まずは重みに関係なく状態を一様に生成し、その後で重みをかけて平均をとる手法を **単純サンプリング**と呼ぶ。 281 | 282 | サイコロのように、もし$w_k$が全て等しいのなら、$w_k = 1$とおいて良いから、 283 | 284 | $$ 285 | \bar{X} = \frac{1}{N} \sum_i \hat{X}_i 286 | $$ 287 | 288 | と、先程の式と一致する。また、前述の円周率の推定では、重みは四分円の中なら1、外なら0とした単純サンプリングになっている。 289 | 290 | 単純サンプリングについてまとめて置こう。 291 | 292 | * 一般には、ある状態の重みは既知だが、重みの総和が求まらないために、状態の出現確率が未知であることが多い 293 | * なにかを調べたい時に、全てを調べるのではなく、一部の標本を抜き出して調べることをサンプリングと呼ぶ 294 | * なにかの期待値を乱数を使って評価する手法をモンテカルロ法と呼ぶ。 295 | * 出現可能な状態を一様に選び、重みをかけて期待値を推定する手法を単純サンプリングと呼び、モンテカルロ法の最も簡単な例 296 | 297 | ### 状態数 298 | 299 | 公平なサイコロの要件は、全ての目の出現重みが等しいことだ。$w_k$はお互いの比だけが問題となるので、$w_k = 1$としよう。すると、$Z=6$、$p_k = 1/6$となる。我々が「公平なサイコロを振ったら、各目が出る確率が1/6だ」という時には、 300 | 301 | * 各サイコロの目がでる重みは等しい $w_k = 1$ 302 | * サイコロには目の種類が6個あるので、重みの和は$Z = \sum_k w_k = 6$となる 303 | * したがって、各目の出現確率は$p_k = w_k/Z = 1/6$となる 304 | 305 | という論理を無意識に使っている。 306 | 307 | さて、普通のサイコロでは、全ての目が異なっていたため、$k$番目の状態の目の値$Y_k$は$k$に等しく、単に$k$で置き換えればよかった。後の布石のために、目に重複のあるサイコロを考えてみよう。 308 | 309 | 6面に「1,2,2,3,3,3」と描かれたサイコロがあるとしよう。この6つの状態の出現頻度は等しいとする。$k$番目の状態の目の値を$Y_k$とする。つまり、 310 | $$ 311 | Y_1 = 1, Y_2 = 2, Y_3 = 2, Y_4 = 3,Y_5 = 3,Y_6 = 3 312 | $$ 313 | だ。もともとが公平なサイコロなので、6つの状態が等しい重み$w_i=1$を持っているとしよう。すると、このサイコロの目の期待値は 314 | 315 | $$ 316 | \bar{X} = Z^{-1} \sum_{k=1}^6 Y_k w_k 317 | $$ 318 | 319 | と書ける。ただし$Z = \sum_k w_k$だ。ここで、状態は6種類あるが、値は1,2,3の3種類しかないことに注目し、値について和をまとめてしまおう。いま、値$j$を取る状態の数を$g_j$とする。今回のケースでは$g_1 = 1, g_2 = 2, g_3 = 3$だ。 320 | 321 | すると、和を値で取りなおすことができる。 322 | 323 | $$ 324 | \bar{X} = Z^{-1} \sum_{j=1}^3 j g_j w_j 325 | $$ 326 | 327 | となる。 328 | 329 | ここまでの用語の整理をすると、 330 | 331 | * 値$j$を持つ状態の重みが$w_j$ 332 | * 値$j$を持つ状態の状態数が$g_j$個である時、 333 | * 重みの総和を$Z=\sum_j g_j w_j$として、 334 | * 値の期待値は$Z^{-1} \sum j g_j p_j$で書ける 335 | 336 | という、至極当たり前のことを言っているだけだ。 337 | 338 | 「値が重複するサイコロ」をもう少し深堀りしよう。今は6つの状態全ての重みが等しかったが、状態に重複があったため、「値」で和を取ると状態数がかかった。そこで$w_j g_j$を、改めて値$j$を取る状態の重み$w'_j$だと考えよう。 339 | 340 | とり得る状態は3つ、値は$1,2,3$、重みは$w'_1 = 1, w'_2 = 2, w'_3 =3$となる。すると、期待値は 341 | 342 | $$ 343 | \bar{X} = \frac{\sum_j k w'_k}{\sum_j w'_k} 344 | $$ 345 | 346 | と表現できる。先程と同様に、全ての状態$j$の重み$w'_j$は既知だが、その総和が未知である時、この和を単純サンプリングで評価することを考えよう。1,2,3のいずれかの値を当確率で取る乱数を$N$個作成し、その$i$番目の値を 347 | $\hat{X}_i$をとすると、期待値は以下のように推定できる。 348 | 349 | $$ 350 | \bar{X} \sim \frac{\sum_i^N \hat{X}_i w'_{\hat{X}_i}}{\sum_i^N w'_{\hat{X}_i}} 351 | $$ 352 | 353 | 手続きを言葉で書くと以下の通り。 354 | 355 | 1. 1,2,3のいずれかの値を取る乱数をを作る 356 | 2. 出現した値に対応する重みに値をかけて和をとる(分子の推定) 357 | 3. 出現した値に対応する重みの和をとる(分母の推定) 358 | 4. 十分な和が取れたら、それらの比を取る 359 | 360 | こちらのケースでは、重みが一様ではないので、分子と分母がキャンセルせず、簡単な形にならないことに注意。 361 | 362 | ## マルコフ連鎖モンテカルロ法 363 | 364 | ### 格子ガス模型 365 | 366 | なにかランダムな値の期待値を計算したい時、その値を取る状態の出現頻度(重み)と、その値を取る状態の数(状態数)を知る必要があった。たとえば公平なサイコロの例では、重みも状態数も1であり、重複のあるサイコロでは、「重みが一様で状態数が異なる」もしくは「状態数が一様で、重みが異なる」であった。一般には、状態数も重みも一様ではなく、かつ重みの総和も状態数も厳密に求めることは難しい。以下では、サイコロより非自明で、かつ物理的にも興味深い例として気液相転移を考えよう。相転移とは、温度等を変化させた時に、ミクロな性質は変わらないにも関わらず、マクロな性質が大きく変化することだ。例えば、大気圧下において水は100度で沸騰して水蒸気になるが、ミクロにみれば水分子の性質は全く変わっていない。水分子同士の相互作用は温度に依存しないと思われるのに、温度により固体、液体、気体と、全く振る舞いが異なる状態になる。このうち、気体と液体の相転移を考えてみよう。原子が近距離で斥力、中間距離で引力、遠距離で相互作用しないという条件を満たすと気体と液体の相転移がおきる。これを非常に単純化し、格子上に原子を置く格子ガス模型を考えてみる。 367 | 368 | $V = L x L$の正方格子を考える。この格子の上に$N$個の原子を置こう。「近距離で斥力」を表現するため、原子は一つのサイトに一つしか置けないことにする。また、「中間距離で引力」を表現するため、原子が上下左右に隣り合う場合は、$\epsilon$だけエネルギーが下がることにする。原子が上下左右に隣り合っていない時には、なんら相互作用をしないことで、遠距離で相互作用しないことを表現しよう。後の簡単のため、周期境界条件を採用する。 369 | 370 | 系は離散的であり、状態の数え上げが可能なので、全ての状態に通し番号$k$をつけよう。状態$k$のエネルギーを$E_k$とする。この状態の出現確率は、ボルツマン重み 371 | $$ 372 | w_k = \exp(-\beta E_k) 373 | $$ 374 | に比例するのであった。ここで、$\beta$は$k_B$はボルツマン定数、$T$は絶対温度として$\beta = 1/k_B T$で表される逆温度だ。これは、エネルギーが低い状態ほど出現しやすいことを表現している。 375 | 376 | 状態$k$の出現確率$p_k$は、重み$w_k$の総和 377 | $$ 378 | Z = \sum_k w_k 379 | $$ 380 | を使って 381 | $$ 382 | p_k = \frac{w_k}{Z} 383 | $$ 384 | と書ける。すると、ある温度におけるエネルギーの期待値は 385 | $$ 386 | U(T) = \sum_k E_k p_k = Z^{-1} \sum_k E_k w_k 387 | $$ 388 | 389 | と表すことができる。この$U(T)$を様々な温度$T$で計算するのが目的だ。なんとなく、温度が低い時には偏った状態(液相)となってエネルギーが下がり、温度が高いと原子がバラバラな状態(気相)になってエネルギーが上がりそうな気がする。それを確認しよう。 390 | 391 | 簡単のため、二原子系($N=2$)を考える。原子が二つなので、それが隣り合っていればエネルギーは$-\epsilon$、そうでなければ$0$と、エネルギーのとり得る値は二種類だ。それを$E_0 = -\epsilon$、$E_1 = 0$と名前をつけて、先程の「値が重複しているサイコロ」の例にならって、同じエネルギーを持つ状態で和をまとめよう。エネルギー$E_j$をとる状態の重みを$w_j$、状態数を$g_j$とすると、重みの和$Z$は 392 | 393 | $$ 394 | \begin{aligned} 395 | Z &= \sum_k w_k \\ 396 | &= \sum_j g_j w_j \\ 397 | &= g_0 w_0 + g_1 w_1 \\ 398 | &= g_0 \mathrm{e}^{\beta \epsilon} + g_1 \\ 399 | &= g_0 \mathrm{e}^K + g_1 \\ 400 | \end{aligned} 401 | $$ 402 | 403 | と書ける。ただし$K=\beta \epsilon$とした。 404 | 405 | すると、エネルギーの期待値は 406 | 407 | $$ 408 | \begin{aligned} 409 | U(T) &= Z^{-1} \sum_j E_j g_j w_j\\ 410 | &= \frac{E_0 g_0 w_0 +E_1 g_1 w_1}{Z} \\ 411 | &= \frac{-\epsilon g_0 \mathrm{e}^K}{g_0 \mathrm{e}^K + g_1} 412 | \end{aligned} 413 | $$ 414 | 415 | と書けた。以上から、エネルギーの期待値の温度依存性は、あるエネルギーを取る状態数$g_0$、$g_1$を求めることに帰着された。 416 | 417 | いま、格子の数は$V$個なので、そこに二つ原子を置く方法は全部で$V(V-1)/2$通りだ。したがって、 418 | 419 | $$ 420 | g_0 + g_1 = \frac{V(V-1)}{2} 421 | $$ 422 | 423 | となる。次に$g_0$は、二つの原子が隣り合っている状態の数だ。二原子分子の位置が$V$通り、分子の方向が$2$通りなので、合わせて$2V$通りとなる。以上から、 424 | 425 | $$ 426 | \begin{aligned} 427 | g_0 &= 2V \\ 428 | g_1 &= \frac{V(V-5)}{2} 429 | \end{aligned} 430 | $$ 431 | 432 | となり、これで内部エネルギーの厳密解がわかった。$V = 10^2$、$\epsilon = 1$として、内部エネルギーを$K$の関数としてプロットすると以下のようになる。 433 | 434 | ![n2.png](lattice_gas/n2.png) 435 | 436 | $K=\beta \epsilon = \epsilon/k_B T$なので、$K$が小さいところが高温、大きいところが低温になる。高温(左側)でエネルギーが0となり、低温(右側)でエネルギーが$-1$に漸近しており、相転移っぽいものが見えていることがわかる。 437 | 438 | さて、相転移は多数の自由度が集まることで起きる現象であるから、$N$を増やしたい。とりあえず次は三原子系としよう。すると、エネルギーとしてとり得る値は 439 | $$ 440 | E_0=-2\epsilon, E_1 = -\epsilon, E_2 = 0 441 | $$ 442 | の三種類だ。エネルギーの温度依存性を調べるためには、あるエネルギー$E_j$を取る状態の状態数$g_j$を求めなければならない。 443 | 444 | エネルギーが$E_0$となる状態は、原子が3つつながった三原子分子となっている状態だ。3つが横並びになっているか、曲がった状態でつながっているかで場合分けすれば状態数$g_1$を求めることができる。 445 | 446 | エネルギーが$E_1$となる状態は、三つの原子のうち、二つが二原子分子を構成し、残りがどこかにいる、という状態だ。これも頑張れば状態数$g_2$を計算できる。 447 | 448 | $g_1$と$g_2$がわかれば、状態の総数はわかっているので$g_3$も計算できる。 449 | 450 | では$N=4$の時は?$N=5$は?少し考えれば、$N$が増えるにつれて指数関数的に考えるべき条件が増え、一般の状態数を求めることができないことがわかるであろう。状態数$g_j$がわからないため、重みの総和$Z$も求めることができない。したがって、あるエネルギーを持つ一つの状態の出現確率も求めることができない。したがって、エネルギーの期待値を厳密に求めることができないので、モンテカルロ法によるサンプリングで求めることになる。 451 | 452 | まずは単純サンプリングで求めることを考えよう。格子ガス模型に単純サンプリングを適用すると、以下のような手続きとなる。 453 | 454 | 1. $V$個のサイトから無作為に$N$個選び、そこに原子を置いた状態を$i$とする 455 | 2. その状態のエネルギー$E_i$を計算する 456 | 3. エネルギーから重み$w_i$を計算する 457 | 4. これを繰り返し、$\sum E_i w_i$と$\sum w_i$の比を計算する 458 | 459 | こうして計算したエネルギーの温度依存性をプロットすると以下のようになる。 460 | 461 | ![simple](simple/simple.png) 462 | 463 | 各温度$K$において、エネルギーを50回計算し、それを100サンプル取ることで誤差を推定した。$K$が大きいところ、すなわち低温で理論曲線から大きくずれていることがわかる。これは、、非常に稀に出現するエネルギーの低い状態が非常に大きな重みを持つためだ。低温、すなわち$K$が大きところでは、重み$\exp(K)$が大きくなる。しかし、エネルギーの低い状態、つまり原子が隣り合う状態数は、全体の状態数が$O(V^2)$であるのに対して$O(V)$しかない。したがって、無作為に状態を選んだ場合、原子が隣り合う状態が出現する確率は$O(1/V)$となる。小さい確率で出現する状態が大きな重みを持つため、正しい値に収束させるためには、小さい確率で出現する状態を十分な数だけ出現させなければならず、非常に大きなサンプル数が要求される。 464 | 465 | ここまでをまとめておこう。 466 | 467 | * 状態が与えられた時、エネルギーは計算できるため、重みもすぐにわかる 468 | * 逆に、エネルギーが与えられた時に、そのエネルギーを持つ状態の数はわからない 469 | * 状態数がわからないため、重みの総和も計算できず、期待値を厳密に求めることはできない 470 | * 低温においては稀にしか出現しない状態が大きな重みを持っており、それゆえに単純サンプリングで精度がでない 471 | 472 | ## マルコフ連鎖モンテカルロ法 473 | 474 | 長々と当たり前のことを説明してきたが、ここでようやくマルコフ連鎖モンテカルロ法の説明に入ることができる。単純サンプリングの問題点は、状態によって重みに非常に差があるのにもかかわらず、重みを無視して状態を選んでいたことによる。数は少ないが重みが大きい状態と、数は非常に多いが重みが非常に小さい状態をうまいことサンプリングしてやる必要がある。 475 | 476 | さて、もし状態$j$を、重み$w_j$に比例して選ぶことができたとしよう。これは、重みの総和を$Z = \sum_j w_j$として、状態$j$を確率$p_j$で生成することに対応する。これができたならば、 477 | 478 | $$ 479 | U(T) = \sum_i E_i p_i \sim \frac{1}{M} \sum_j E_j 480 | $$ 481 | 482 | と、$M$回状態$j$を生成し、状態$j$のエネルギーを計算し、そのエネルギー$E_j$の算術平均を取るだけで良い。しかし、重みの総和$Z$を計算することはできなかった。重みの総和を計算せずに、状態$j$を重み$w_j$に比例して選ぶことはできないだろうか?そんなうまい方法がマルコフ連鎖モンテカルロ法だ。 483 | 484 | 重みの総和を計算することができないため、全ての状態の集合から重みに比例して無作為に状態を選ぶことは不可能だ。しかし、ある二つの状態$i$と$j$を考えた時、$i$から$j$、$j$から$i$への遷移確率を重みに比例するように選ぶことは可能だ。こうして次々と「現在の状態」から「重みに比例して次の状態」を選んでいくと、そのうち状態が重みに比例して出現するようになる、というのがマルコフ連鎖モンテカルロ法の仕組みである。 485 | 486 | 単純サンプリングでは、全ての状態候補のなかから、無作為に状態を一つ選んでから重みを計算し、重み付きで平均を取っていた。マルコフ連鎖モンテカルロ法は、現在の状態から、似た状態を「遷移先候補」として選び、そこに遷移するかどうかを「現在の状態」と「遷移先候補」の重みで決める。 487 | 488 | いま、二つの状態$A$と$B$があるとしよう。それぞれ重み$w(A)$、$w(B)$を持っている。この時、平衡状態における分布$\pi(A)$と$\pi(B)$が、それぞれの重みに比例するようにしたい。 489 | 490 | あるステップにおいて、$A$から$B$に行く確率を$P(A\rightarrow B)$としよう。これは、$A$、$B$を国だと思うと、$A$の人口のうち、どれくらいが$B$に移住するかの割合を表している。同様に、$B$から$A$に行く確率を$P(B\rightarrow A)$とする。 491 | 492 | さて、この系が平衡状態になったとする。平衡状態とは、$A$と$B$で人の行き来はあるけれど、それぞれの人口が変わらない状態だ。この時の人口が$\pi(A)$、$\pi(B)$であるから、 493 | 494 | $$ 495 | \pi(A)P(A\rightarrow B) = \pi(B)P(B\rightarrow A) 496 | $$ 497 | 498 | が成り立つ。これは単に「AからBに行く人数」と「BからAに行く人数が等しい」と言っているに過ぎない。 499 | 500 | さて、平衡状態における分布が重みに比例して欲しいのだから、 501 | 502 | $$ 503 | \pi(A) \propto w(A), \pi(B) \propto w(B) 504 | $$ 505 | 506 | となるように遷移確率$P(A\rightarrow B)$、$P(B\rightarrow A)$を決めたい。先ほどの式から 507 | 508 | $$ 509 | \frac{P(A\rightarrow B)}{P(B\rightarrow A)} 510 | = \frac{\pi(B)}{\pi(A)} 511 | = \frac{w(B)}{w(A)} 512 | $$ 513 | 514 | を満たすように決めればよい。この条件を満たす遷移確率の決め方は一意には決まらないので、我々が適当に決めてよい。現在、大きく分けて二種類の決め方がある。 515 | 516 | まず、素直に遷移確率を重みに比例させる方法だ。 517 | 518 | $$ 519 | P(A\rightarrow B) = \frac{w(B)}{w(A) + w(B)}, 520 | P(B\rightarrow A) = \frac{w(A)}{w(A) + w(B)}, 521 | $$ 522 | 523 | これを**熱浴法(heat-bath method)**と呼ぶ。 524 | 525 | 一方、どちらか大きい方の遷移確率を$1$にしてしまう、という方法もある。これは、重みの小さい状態から大きい状態へは必ず遷移、逆は確率的に遷移させる、ということを意味する。$w(A)' < w(B)$であるとすると、 526 | 527 | $$ 528 | P(A\rightarrow B) = 1, P(B\rightarrow A) = \frac{w(A)}{w(B)} 529 | $$ 530 | 531 | とすればよい。これを**メトロポリス法(Metropolis method)**と呼ぶ。 532 | 533 | 熱浴法、メトロポリス法、いずれも遷移確率に関する条件 534 | 535 | $$ 536 | \frac{P(A\rightarrow B)}{P(B\rightarrow A)} 537 | = \frac{w(B)}{w(A)} 538 | $$ 539 | 540 | を満たしていることがわかる。この遷移確率に関する条件が、互いに遷移可能な全ての状態間で満たされている時、これを**詳細釣り合い条件 (detailed balance condition)**が満たされている、と呼ぶ。 541 | 542 | マルコフ連鎖モンテカルロ法の手続きは以下のようになる 543 | 544 | 1. 適当な初期状態$x_0$を一つ選ぶ。 545 | 2. 現在の状態$x_0$から遷移可能な提案状態$x'$を一つ選ぶ。 546 | 3. それぞれの状態の重み$w(x_0), w(x')$より、遷移確率を決める 547 | 4. 遷移確率を使って、遷移させるかどうか決める 548 | 5. 遷移しなかった場合は$x_1 = x_0$、遷移した場合は$x_1 = x'$とする 549 | 6. 以下、同様な手続きを繰り返し、$x_t$から$x_{t+1}$を生成する。 550 | 551 | 十分に緩和した場合、状態$x_t$が、その重み$w(x_t)$に比例して出現するようになる。なお、遷移させるかどうか決めることを試行(trial)、提案状態に遷移することを採択(accept)、遷移しなかった場合を棄却(reject)と呼ぶ。 552 | 553 | 以上の手続きを格子ガス模型に適用しよう。考えるのは、現在の状態から遷移可能な「次の状態」をどのように選ぶか、ということだけだ。様々な方法があるが、例えば 554 | 555 | 1. 現在の状態$x_t$の中で、適当な原子を一つ選ぶ 556 | 2. その原子を動かす方向を上下左右から一つ選び、動かした後の状態を提案状態$x'$とする 557 | 558 | という手続きとしよう。選んだ原子の移動先に原子がいなかった場合、二つの状態のエネルギー$E(x_t)$と$E(x')$から重み$w(x_t)$と$w(x')$を決め、遷移させるかどうか決めればよい。また、移動先に原子がいた場合は必ずその試行は棄却される。これは、一つのセルに二つ原子がはいったらエネルギーが無限大になる、ということを意味する。もし原子の移動先に原子があれば、提案状態$x'$のエネルギー$E(x')$は無限大なので、重み$w(x')=0$となり、そこには遷移できないからだ。 559 | 560 | このようにすると、例えば高温では原子が自由に動き回り、低温では原子がくっつく状態への遷移確率が高く、隣接している原子が離れる確率は低くなるため、なるべく原子がくっついた状態を多くサンプリングすることになる。 561 | 562 | 以上を実装した結果を以下に示す。 563 | 564 | ![lattice_gas](lattice_gas/lattice_gas.png) 565 | 566 | 条件は単純サンプリングと同じだ。低温でエネルギーの期待値を正しく計算できていることがわかる。 567 | 568 | 最後に、「マルコフ連鎖モンテカルロ法」の名前に含まれる「マルコフ性」について説明しておこう。現在の状態が$x_t$である時、提案状態への遷移確率$P(x_t \rightarrow x')$は、$x_t$のみで決まり、どのような履歴により$x_t$に到達したかは無関係だ。このように、遷移確率が現在の状態にのみ依存し、履歴に依存しない性質を**マルコフ性 (Markov property)**と呼ぶ。 569 | 570 | マルコフ性を持つ遷移確率を用いて、次々と状態を連鎖的に生成することをマルコフ連鎖と呼ぶ。このマルコフ連鎖を用いてモンテカルロサンプリングするかマルコフ連鎖モンテカルロ法と呼ばれる。 571 | 572 | ## まとめ 573 | 574 | マルコフ連鎖モンテカルロ法とは、現在の状態から、重みに比例するように提案状態を生成することで、効率良くサンプリングする手法だ。なぜマルコフ連鎖モンテカルロ法が必要かというと、それは重みの総和が計算できないためで、なぜ重みの総和が計算できないかというと、状態数が計算できないからだ。この、「状態からエネルギーの計算は簡単だが、エネルギーに対応する状態数の計算んが困難である」ためにモンテカルロ法が必要である、ということは覚えておいて欲しい。 -------------------------------------------------------------------------------- /02_mc_basic/lattice_gas/.gitignore: -------------------------------------------------------------------------------- 1 | a.out 2 | -------------------------------------------------------------------------------- /02_mc_basic/lattice_gas/lattice_gas.cpp: -------------------------------------------------------------------------------- 1 | #include "sdouble.hpp" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | int LX, LY; // System Size 9 | int V; // Number of sites 10 | double e_table[5]; // Energy Table 11 | enum { LEFT, 12 | RIGHT, 13 | UP, 14 | DOWN }; 15 | 16 | const int SAMPLE = 100; 17 | const int AVE = 50; 18 | 19 | const int dx[] = {-1, 1, 0, 0}; 20 | const int dy[] = {0, 0, -1, 1}; 21 | 22 | std::vector lattice, gas; 23 | std::vector> neighbor; 24 | 25 | int pos2index(int ix, int iy) { 26 | ix = (ix + LX) % LX; 27 | iy = (iy + LY) % LY; 28 | return ix + iy * LX; 29 | } 30 | 31 | void index2pos(int index, int &ix, int &iy) { 32 | ix = index % LX; 33 | iy = index / LX; 34 | } 35 | 36 | void init(int size_x, int size_y, int number_of_particles) { 37 | LX = size_x; 38 | LY = size_y; 39 | V = LX * LY; 40 | gas.resize(number_of_particles); 41 | lattice.resize(V, 0); 42 | neighbor.resize(V); 43 | for (int i = 0; i < V; i++) { 44 | int ix = i % LX; 45 | int iy = i / LX; 46 | neighbor[i][LEFT] = pos2index(ix - 1, iy); 47 | neighbor[i][RIGHT] = pos2index(ix + 1, iy); 48 | neighbor[i][DOWN] = pos2index(ix, iy - 1); 49 | neighbor[i][UP] = pos2index(ix, iy + 1); 50 | } 51 | for (int i = 0; i < number_of_particles; i++) { 52 | lattice[i] = 1; 53 | gas[i] = i; 54 | } 55 | } 56 | 57 | void move_particle(std::mt19937 &mt) { 58 | const int N = gas.size(); 59 | std::uniform_int_distribution<> uid(0, N - 1); 60 | std::uniform_int_distribution<> udir(0, 3); 61 | std::uniform_real_distribution<> ud(0.0, 1.0); 62 | 63 | int i1 = uid(mt); // Particle to move 64 | int dir = udir(mt); // Direction to move 65 | int p1 = gas[i1]; 66 | int n1 = 0; 67 | n1 += lattice[neighbor[p1][RIGHT]]; 68 | n1 += lattice[neighbor[p1][LEFT]]; 69 | n1 += lattice[neighbor[p1][UP]]; 70 | n1 += lattice[neighbor[p1][DOWN]]; 71 | int x1, y1; 72 | index2pos(p1, x1, y1); 73 | int x2 = x1 + dx[dir]; 74 | int y2 = y1 + dy[dir]; 75 | int p2 = pos2index(x2, y2); 76 | if (lattice[p2] != 0) return; 77 | int n2 = -1; 78 | n2 += lattice[neighbor[p2][RIGHT]]; 79 | n2 += lattice[neighbor[p2][LEFT]]; 80 | n2 += lattice[neighbor[p2][UP]]; 81 | n2 += lattice[neighbor[p2][DOWN]]; 82 | int nd = n1 - n2; 83 | if (nd < 0 || e_table[nd] > ud(mt)) { 84 | // accept 85 | lattice[p1] = 0; 86 | lattice[p2] = 1; 87 | gas[i1] = p2; 88 | } 89 | } 90 | 91 | void show_lattice() { 92 | for (int i = 0; i < LX; i++) { 93 | for (int j = 0; j < LY; j++) { 94 | if (lattice[i + j * LX] == 1) { 95 | printf("*"); 96 | } else { 97 | printf("-"); 98 | } 99 | } 100 | printf("\n"); 101 | } 102 | } 103 | 104 | double calc_energy() { 105 | double e = 0; 106 | for (int i = 0; i < V; i++) { 107 | if (lattice[i] == 0) continue; 108 | e += lattice[neighbor[i][RIGHT]]; 109 | e += lattice[neighbor[i][DOWN]]; 110 | } 111 | return -e; 112 | } 113 | 114 | void make_table(double beta) { 115 | for (int i = 0; i < 5; i++) { 116 | e_table[i] = exp(-i * beta); 117 | } 118 | } 119 | 120 | void mc(double beta) { 121 | make_table(beta); 122 | std::mt19937 mt; 123 | std::vector ve; 124 | for (int i = 0; i < SAMPLE; i++) { 125 | move_particle(mt); 126 | } 127 | 128 | for (int i = 0; i < SAMPLE; i++) { 129 | double usum = 0.0; 130 | for (int j = 0; j < AVE; j++) { 131 | move_particle(mt); 132 | usum += calc_energy(); 133 | } 134 | usum /= static_cast(AVE); 135 | ve.push_back(usum); 136 | } 137 | stat::sdouble se(ve); 138 | std::cout << beta << " " << se << std::endl; 139 | } 140 | 141 | void domc(int lx, int ly, int n) { 142 | double b_start = 0.0; 143 | double b_end = 10.0; 144 | const int nd = 10; 145 | init(lx, ly, n); 146 | for (int i = 0; i < nd; i++) { 147 | double beta = (b_end - b_start) * i / nd + b_start; 148 | mc(beta); 149 | } 150 | } 151 | 152 | void test() { 153 | init(5, 10, 25); 154 | show_lattice(); 155 | std::mt19937 mt; 156 | make_table(10.0); 157 | for (int i = 0; i < 100; i++) { 158 | move_particle(mt); 159 | } 160 | show_lattice(); 161 | } 162 | 163 | int main() { 164 | domc(10, 10, 2); 165 | // test2(); 166 | } 167 | -------------------------------------------------------------------------------- /02_mc_basic/lattice_gas/lattice_gas.dat: -------------------------------------------------------------------------------- 1 | 0 -0.0416 +- 0.00672508 2 | 1 -0.0924 +- 0.0124844 3 | 2 -0.253 +- 0.0268965 4 | 3 -0.4008 +- 0.0370061 5 | 4 -0.607 +- 0.0415725 6 | 5 -0.828 +- 0.0330607 7 | 6 -0.9606 +- 0.0176417 8 | 7 -0.9996 +- 0.000281411 9 | 8 -1 +- 0 10 | 9 -1 +- 0 11 | -------------------------------------------------------------------------------- /02_mc_basic/lattice_gas/lattice_gas.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | 3 | set xlabel "K" 4 | set ylabel "U" 5 | 6 | V=10*10 7 | f(x) = -2*V*exp(x)/(2*V*exp(x) + V*(V-5)/2) 8 | unset key 9 | 10 | set out "n2.png" 11 | p [0:10] f(x) lc "black" 12 | 13 | set out "lattice_gas.png" 14 | p [0:10] f(x) lc "black", "lattice_gas.dat" u 1:2:4 w e pt 6 lc "blue" 15 | -------------------------------------------------------------------------------- /02_mc_basic/lattice_gas/lattice_gas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/02_mc_basic/lattice_gas/lattice_gas.png -------------------------------------------------------------------------------- /02_mc_basic/lattice_gas/makefile: -------------------------------------------------------------------------------- 1 | all: a.out 2 | CC=g++ 3 | CPPFLAGS=-O3 4 | 5 | a.out: lattice_gas.cpp 6 | $(CC) $(CPPFLAGS) $< -o $@ 7 | 8 | lattice_gas.dat: a.out 9 | ./a.out > lattice_gas.dat 10 | 11 | graph: lattice_gas.png 12 | 13 | lattice_gas.png: lattice_gas.plt lattice_gas.dat 14 | gnuplot lattice_gas.plt 15 | 16 | clean: 17 | rm -f a.out 18 | -------------------------------------------------------------------------------- /02_mc_basic/lattice_gas/n2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/02_mc_basic/lattice_gas/n2.png -------------------------------------------------------------------------------- /02_mc_basic/lattice_gas/sdouble.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | MIT License 3 | 4 | Copyright (c) 2019 - present H. Watanabe 5 | The latest version is available at 6 | https://github.com/kaityo256/sdouble 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | */ 26 | 27 | #pragma once 28 | 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | 35 | namespace stat { 36 | 37 | struct sdouble { 38 | double value; // mean 39 | double error; // std. dev. of mean 40 | 41 | sdouble() 42 | : value(0.0), error(0.0) { 43 | } 44 | 45 | sdouble(double value, double error) 46 | : value(value), error(error) { 47 | } 48 | 49 | sdouble(const sdouble &obj) { 50 | value = obj.value; 51 | error = obj.error; 52 | } 53 | 54 | sdouble(std::vector &x) { 55 | const double n = static_cast(x.size()); 56 | value = std::accumulate(x.begin(), x.end(), 0.0) / n; 57 | double e = 0.0; 58 | for (auto v : x) { 59 | e += (v - value) * (v - value); 60 | } 61 | e /= (n - 1); 62 | e /= n; 63 | error = sqrt(e); 64 | } 65 | 66 | double mean() { 67 | return value; 68 | } 69 | 70 | double stddev() { 71 | return error; 72 | } 73 | 74 | /* 75 | Error Propagation 76 | */ 77 | sdouble operator+=(const sdouble &rhs) { 78 | sdouble y(rhs); 79 | value = value + y.value; 80 | error = sqrt(error * error + y.error * y.error); 81 | return *this; 82 | } 83 | 84 | sdouble operator+(const sdouble &rhs) const { 85 | sdouble x(*this); 86 | sdouble y(rhs); 87 | x += y; 88 | return sdouble(x); 89 | } 90 | 91 | sdouble operator-=(const sdouble &rhs) { 92 | sdouble y(rhs); 93 | value = value - y.value; 94 | error = sqrt(error * error + y.error * y.error); 95 | return *this; 96 | } 97 | 98 | sdouble operator-(const sdouble &rhs) const { 99 | sdouble x(*this); 100 | sdouble y(rhs); 101 | x -= y; 102 | return sdouble(x); 103 | } 104 | 105 | sdouble operator*=(const sdouble &rhs) { 106 | sdouble x(*this); 107 | sdouble y(rhs); 108 | value = x.value * y.value; 109 | double e1 = x.error * y.value; 110 | double e2 = y.error * x.value; 111 | error = sqrt(e1 * e1 + e2 * e2); 112 | return *this; 113 | } 114 | 115 | sdouble operator*(const sdouble &rhs) const { 116 | sdouble x(*this); 117 | sdouble y(rhs); 118 | x *= y; 119 | return sdouble(x); 120 | } 121 | 122 | sdouble operator/=(const sdouble &rhs) { 123 | sdouble x(*this); 124 | sdouble y(rhs); 125 | value = x.value / y.value; 126 | double e1 = x.error / x.value; 127 | double e2 = y.error / y.value; 128 | error = value * sqrt(e1 * e1 + e2 * e2); 129 | return sdouble(*this); 130 | } 131 | 132 | sdouble operator/(const sdouble &rhs) const { 133 | sdouble x(*this); 134 | sdouble y(rhs); 135 | x /= y; 136 | return sdouble(x); 137 | } 138 | 139 | /* 140 | Calculation without uncertainty 141 | */ 142 | sdouble &operator+=(const double v) { 143 | operator+=(sdouble(v, 0.0)); 144 | return *this; 145 | } 146 | 147 | sdouble &operator-=(const double v) { 148 | operator-=(sdouble(v, 0.0)); 149 | return *this; 150 | } 151 | 152 | sdouble &operator*=(const double v) { 153 | operator*=(sdouble(v, 0.0)); 154 | return *this; 155 | } 156 | 157 | sdouble &operator/=(const double v) { 158 | operator/=(sdouble(v, 0.0)); 159 | return *this; 160 | } 161 | }; 162 | 163 | std::ostream &operator<<(std::ostream &stream, const sdouble &v) { 164 | sdouble v2 = v; 165 | stream << v2.value << " +- " << v2.error; 166 | return stream; 167 | } 168 | 169 | } // namespace stat 170 | 171 | stat::sdouble operator+(const stat::sdouble &obj, double v) { 172 | stat::sdouble x = obj; 173 | x += v; 174 | return stat::sdouble(x); 175 | } 176 | 177 | stat::sdouble operator+(double v, const stat::sdouble &obj) { 178 | return operator+(obj, v); 179 | } 180 | 181 | stat::sdouble operator-(const stat::sdouble &obj, double v) { 182 | stat::sdouble x = obj; 183 | x -= v; 184 | return stat::sdouble(x); 185 | } 186 | 187 | stat::sdouble operator-(double v, const stat::sdouble &obj) { 188 | stat::sdouble x = obj; 189 | return stat::sdouble(v - x.value, x.error); 190 | } 191 | 192 | stat::sdouble operator*(const stat::sdouble &obj, double v) { 193 | stat::sdouble x = obj; 194 | x *= v; 195 | return stat::sdouble(x); 196 | } 197 | 198 | stat::sdouble operator*(double v, const stat::sdouble &obj) { 199 | return operator*(obj, v); 200 | } 201 | 202 | stat::sdouble operator/(const stat::sdouble &obj, double v) { 203 | stat::sdouble x = obj; 204 | x /= v; 205 | return stat::sdouble(x); 206 | } 207 | 208 | stat::sdouble operator/(double v, const stat::sdouble &obj) { 209 | stat::sdouble x = obj; 210 | double e = x.error / x.value; 211 | x.value = v / x.value; 212 | x.error = x.value * e; 213 | return stat::sdouble(x); 214 | } 215 | -------------------------------------------------------------------------------- /02_mc_basic/pi/pi.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | random.seed(1) 4 | pi = 0.0 5 | N = 1000000 6 | for _ in range(N): 7 | x = random.random() 8 | y = random.random() 9 | if x**2 + y**2 < 1.0: 10 | pi = pi + 1.0 11 | pi = pi/N*4 12 | print(pi) 13 | -------------------------------------------------------------------------------- /02_mc_basic/rand/rand.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main() { 5 | std::mt19937 mt(1); 6 | std::uniform_real_distribution<> ud(0.0, 1.0); 7 | for (int i = 0; i < 5; i++) { 8 | std::cout << ud(mt) << std::endl; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /02_mc_basic/rand/rand.py: -------------------------------------------------------------------------------- 1 | import random 2 | random.seed(1) 3 | for _ in range(5): 4 | print(random.random()) 5 | -------------------------------------------------------------------------------- /02_mc_basic/rand/rand2.py: -------------------------------------------------------------------------------- 1 | import time 2 | import random 3 | 4 | print(time.time()) 5 | print(time.time()) 6 | for _ in range(5): 7 | print(random.random()) 8 | 9 | -------------------------------------------------------------------------------- /02_mc_basic/simple/makefile: -------------------------------------------------------------------------------- 1 | all: a.out 2 | CC=g++ 3 | CPPFLAGS=-O3 4 | 5 | a.out: simple.cpp 6 | $(CC) $(CPPFLAGS) $< -o $@ 7 | 8 | simple.dat: a.out 9 | ./a.out > simple.dat 10 | 11 | graph: simple.png 12 | 13 | simple.png: simple.plt simple.dat 14 | gnuplot simple.plt 15 | 16 | clean: 17 | rm -f a.out 18 | -------------------------------------------------------------------------------- /02_mc_basic/simple/sdouble.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | MIT License 3 | 4 | Copyright (c) 2019 - present H. Watanabe 5 | The latest version is available at 6 | https://github.com/kaityo256/sdouble 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | */ 26 | 27 | #pragma once 28 | 29 | #include 30 | #include 31 | #include 32 | #include 33 | #include 34 | 35 | namespace stat { 36 | 37 | struct sdouble { 38 | double value; // mean 39 | double error; // std. dev. of mean 40 | 41 | sdouble() 42 | : value(0.0), error(0.0) { 43 | } 44 | 45 | sdouble(double value, double error) 46 | : value(value), error(error) { 47 | } 48 | 49 | sdouble(const sdouble &obj) { 50 | value = obj.value; 51 | error = obj.error; 52 | } 53 | 54 | sdouble(std::vector &x) { 55 | const double n = static_cast(x.size()); 56 | value = std::accumulate(x.begin(), x.end(), 0.0) / n; 57 | double e = 0.0; 58 | for (auto v : x) { 59 | e += (v - value) * (v - value); 60 | } 61 | e /= (n - 1); 62 | e /= n; 63 | error = sqrt(e); 64 | } 65 | 66 | double mean() { 67 | return value; 68 | } 69 | 70 | double stddev() { 71 | return error; 72 | } 73 | 74 | /* 75 | Error Propagation 76 | */ 77 | sdouble operator+=(const sdouble &rhs) { 78 | sdouble y(rhs); 79 | value = value + y.value; 80 | error = sqrt(error * error + y.error * y.error); 81 | return *this; 82 | } 83 | 84 | sdouble operator+(const sdouble &rhs) const { 85 | sdouble x(*this); 86 | sdouble y(rhs); 87 | x += y; 88 | return sdouble(x); 89 | } 90 | 91 | sdouble operator-=(const sdouble &rhs) { 92 | sdouble y(rhs); 93 | value = value - y.value; 94 | error = sqrt(error * error + y.error * y.error); 95 | return *this; 96 | } 97 | 98 | sdouble operator-(const sdouble &rhs) const { 99 | sdouble x(*this); 100 | sdouble y(rhs); 101 | x -= y; 102 | return sdouble(x); 103 | } 104 | 105 | sdouble operator*=(const sdouble &rhs) { 106 | sdouble x(*this); 107 | sdouble y(rhs); 108 | value = x.value * y.value; 109 | double e1 = x.error * y.value; 110 | double e2 = y.error * x.value; 111 | error = sqrt(e1 * e1 + e2 * e2); 112 | return *this; 113 | } 114 | 115 | sdouble operator*(const sdouble &rhs) const { 116 | sdouble x(*this); 117 | sdouble y(rhs); 118 | x *= y; 119 | return sdouble(x); 120 | } 121 | 122 | sdouble operator/=(const sdouble &rhs) { 123 | sdouble x(*this); 124 | sdouble y(rhs); 125 | value = x.value / y.value; 126 | double e1 = x.error / x.value; 127 | double e2 = y.error / y.value; 128 | error = value * sqrt(e1 * e1 + e2 * e2); 129 | return sdouble(*this); 130 | } 131 | 132 | sdouble operator/(const sdouble &rhs) const { 133 | sdouble x(*this); 134 | sdouble y(rhs); 135 | x /= y; 136 | return sdouble(x); 137 | } 138 | 139 | /* 140 | Calculation without uncertainty 141 | */ 142 | sdouble &operator+=(const double v) { 143 | operator+=(sdouble(v, 0.0)); 144 | return *this; 145 | } 146 | 147 | sdouble &operator-=(const double v) { 148 | operator-=(sdouble(v, 0.0)); 149 | return *this; 150 | } 151 | 152 | sdouble &operator*=(const double v) { 153 | operator*=(sdouble(v, 0.0)); 154 | return *this; 155 | } 156 | 157 | sdouble &operator/=(const double v) { 158 | operator/=(sdouble(v, 0.0)); 159 | return *this; 160 | } 161 | }; 162 | 163 | std::ostream &operator<<(std::ostream &stream, const sdouble &v) { 164 | sdouble v2 = v; 165 | stream << v2.value << " +- " << v2.error; 166 | return stream; 167 | } 168 | 169 | } // namespace stat 170 | 171 | stat::sdouble operator+(const stat::sdouble &obj, double v) { 172 | stat::sdouble x = obj; 173 | x += v; 174 | return stat::sdouble(x); 175 | } 176 | 177 | stat::sdouble operator+(double v, const stat::sdouble &obj) { 178 | return operator+(obj, v); 179 | } 180 | 181 | stat::sdouble operator-(const stat::sdouble &obj, double v) { 182 | stat::sdouble x = obj; 183 | x -= v; 184 | return stat::sdouble(x); 185 | } 186 | 187 | stat::sdouble operator-(double v, const stat::sdouble &obj) { 188 | stat::sdouble x = obj; 189 | return stat::sdouble(v - x.value, x.error); 190 | } 191 | 192 | stat::sdouble operator*(const stat::sdouble &obj, double v) { 193 | stat::sdouble x = obj; 194 | x *= v; 195 | return stat::sdouble(x); 196 | } 197 | 198 | stat::sdouble operator*(double v, const stat::sdouble &obj) { 199 | return operator*(obj, v); 200 | } 201 | 202 | stat::sdouble operator/(const stat::sdouble &obj, double v) { 203 | stat::sdouble x = obj; 204 | x /= v; 205 | return stat::sdouble(x); 206 | } 207 | 208 | stat::sdouble operator/(double v, const stat::sdouble &obj) { 209 | stat::sdouble x = obj; 210 | double e = x.error / x.value; 211 | x.value = v / x.value; 212 | x.error = x.value * e; 213 | return stat::sdouble(x); 214 | } 215 | -------------------------------------------------------------------------------- /02_mc_basic/simple/simple.cpp: -------------------------------------------------------------------------------- 1 | #include "sdouble.hpp" 2 | #include 3 | #include 4 | #include 5 | 6 | const int L = 10; 7 | const int V = L * L; 8 | const int SAMPLE = 100; 9 | const int AVE = 50; 10 | 11 | void mc(const double beta, std::mt19937 &mt) { 12 | std::uniform_int_distribution<> ud(0, V - 1); 13 | std::vector vu; 14 | const double w = exp(beta); 15 | for (int i = 0; i < SAMPLE; i++) { 16 | double usum = 0.0; 17 | double wsum = 0.0; 18 | for (int j = 0; j < AVE; j++) { 19 | const int p1 = ud(mt); 20 | const int p2 = ud(mt); 21 | if (p1 == p2) continue; 22 | const int x1 = p1 % L; 23 | const int y1 = p1 / L; 24 | const int x2 = p2 % L; 25 | const int y2 = p2 / L; 26 | int dx = x1 - x2; 27 | int dy = y1 - y2; 28 | if (dx > L / 2) dx -= L; 29 | if (dx < -L / 2) dx += L; 30 | if (dy > L / 2) dy -= L; 31 | if (dy < -L / 2) dy += L; 32 | 33 | double ui = 0.0; 34 | double wi = 1.0; 35 | if (dx == 0 && std::abs(dy) == 1) { 36 | ui = -w; 37 | wi = w; 38 | } else if (dy == 0 && std::abs(dx) == 1) { 39 | ui = -w; 40 | wi = w; 41 | } 42 | usum += ui; 43 | wsum += wi; 44 | } 45 | vu.push_back(usum / wsum); 46 | } 47 | stat::sdouble su(vu); 48 | std::cout << beta << " " << su << std::endl; 49 | } 50 | 51 | void domc() { 52 | std::mt19937 mt; 53 | double b_start = 0.0; 54 | double b_end = 10.0; 55 | const int nd = 10; 56 | for (int i = 0; i < nd; i++) { 57 | double beta = (b_end - b_start) * i / nd + b_start; 58 | mc(beta, mt); 59 | } 60 | } 61 | 62 | int main() { 63 | domc(); 64 | } 65 | -------------------------------------------------------------------------------- /02_mc_basic/simple/simple.dat: -------------------------------------------------------------------------------- 1 | 0 -0.03998 +- 0.00308409 2 | 1 -0.0975671 +- 0.00688468 3 | 2 -0.194665 +- 0.0138832 4 | 3 -0.415069 +- 0.0201983 5 | 4 -0.559957 +- 0.0260939 6 | 5 -0.733412 +- 0.0315322 7 | 6 -0.797467 +- 0.0338078 8 | 7 -0.799833 +- 0.0376812 9 | 8 -0.822333 +- 0.0374067 10 | 9 -0.757471 +- 0.0427809 11 | -------------------------------------------------------------------------------- /02_mc_basic/simple/simple.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "simple.png" 3 | 4 | set xlabel "K" 5 | set ylabel "U" 6 | 7 | V=10*10 8 | f(x) = -2*V*exp(x)/(2*V*exp(x) + V*(V-5)/2) 9 | unset key 10 | p [0:10] f(x) lc "black", "simple.dat" u 1:2:4 w e pt 6 lc "blue" 11 | -------------------------------------------------------------------------------- /02_mc_basic/simple/simple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/02_mc_basic/simple/simple.png -------------------------------------------------------------------------------- /02_mc_basic/simulation02.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/02_mc_basic/simulation02.pdf -------------------------------------------------------------------------------- /02_mc_basic/simulation02.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/02_mc_basic/simulation02.pptx -------------------------------------------------------------------------------- /03_mc_error/README.md: -------------------------------------------------------------------------------- 1 | # モンテカルロ法(2) 誤差解析と不偏推定量 2 | 3 | * エラーバーについて 4 | * 不偏推定量とJackknife法 5 | 6 | ## エラーバー 7 | 8 | ### エラーバーとは 9 | 10 | 実験において、まったく同じ条件下でも、観測するたびに結果が揺らぐ。そこで何度も観測し、「その観測値がどの程度確からしいか」を推定する。たとえば、ある回路の電流を6回測定し、$1.16, 1.13, 1.12, 1.12, 1.11, 1.08$という値が得られたとしよう(単位はmA)。この回路の電流の測定値は、平均値と「平均値の標準偏差」を使って 11 | 12 | $$ 13 | 1.12 \pm 0.01 \quad mA 14 | $$ 15 | 16 | と書くように習ったかと思う。これを見ると、大雑把に「1.1 までは自信があるが、1.12 の値はあまり自信がなく、1.11かもしれないし、1.13かもしれない」ということがわかる。そこで、グラフでは$1.12$のところにシンボルを置き、$1.11$から$1.13$まで棒を描画して、「観測範囲はこの範囲にありそうだよ」ということを表現する。そのことから$\pm$記号の後の数値を「エラーバー」と呼ぶ。 17 | 18 | このエラーバーを、単に「観測データの自信度である」と解釈し、「小さければ小さいほどよい」と思ってしまう人がいる。しかし、エラーバーの役割は「観測データの自信度」にとどまらず、様々な役割を持っている。以下では、エラーバーとは何か、どのような性質を持っているかを解説する。 19 | 20 | まず、エラーバーを定義しよう。観測するたびに値が変化する観測量を確率変数$\hat{X}$とする。これを$N$回観測し、$i$番目の観測データを$X_i$としよう。確率変数$\hat{X}$の平均値$\bar{X}$と分散$\sigma^2$は以下のように与えられる。 21 | 22 | $$ 23 | \bar{X} = \frac{1}{N} \sum_i X_i 24 | $$ 25 | 26 | $$ 27 | \sigma^2 = \frac{1}{N-1} \sum_i (X_i - \bar{X})^2 28 | $$ 29 | 30 | この式の意味を考えよう。確率変数$\hat{X}$について、無限回観測したとして、その観測値の集合を **母集団(population)** と呼ぶ。観測とは、母集団から有限個の要素を取り出すことであり、個々の要素を標本と呼ぶ。$N$回観測して得られた$N$個の集合$X_i$が標本である。我々の目的は、この標本から、様々な統計的な量を推定することだ。例えば先程求めた平均値$E[\hat{X}]$や分散$V[\hat{X}]$は、母集団を特徴づける特徴量である。このように、特徴量を標本$\{X_i\}$から推定することを **統計的推定(statistical estimation)** 、もしくは単に推定と呼ぶ。そして、標本から特徴量を推定する関数ことを **推定量(estimator)** と呼ぶ。数値計算ではestimatorと呼ぶことが多いので、以下では「推定量」と呼ばずにestimatorで統一する。先ほどの式では、左辺が特徴量、右辺がestimatorである。 31 | 32 | さて、確率変数の平均値$\bar{X}$もまた確率変数となるが、その分布は、標本数が増えればガウス分布へと近づいていく(中心極限定理)。我々が推定したいのは、確率変数$\hat{X}$が従う母集団の分布ではなく、「平均値が従う分布」であり、その特徴量である。 33 | 34 | まず、我々が知りたい母集団とは何かを定義しておこう。確率変数$\hat{X}$の取る値が、ある実数$a$と$b$の間にある確率が以下のような積分で表されるとする。 35 | 36 | $$ 37 | P(a < \hat{X} < b) = \int_a^b f(x)dx 38 | $$ 39 | 40 | この時、関数$f(x)$を **確率密度関数(probability distribution function, PDF)** と呼ぶ。我々が知りたい「母集団の分布」とは、この確率密度関数のことだ。特に知りたいのは、この関数の1次と2次のモーメント、$\mu$と$\sigma^2$である。 41 | 42 | $$ 43 | \mu = \int x f(x) dx 44 | $$ 45 | 46 | $$ 47 | \sigma^2 = \int (x-\mu)^2 f(x) dx 48 | $$ 49 | 50 | この量を$N$個の標本$X_i$から求めたい。 51 | 52 | まず、$N$個の標本$X_i$から、「平均値が従う分布」の平均値と分散のesitomatorは以下のように与えられる。 53 | 54 | $$ 55 | \bar{X} = \frac{1}{N}\sum_i X_i 56 | $$ 57 | 58 | $$ 59 | V[\bar{X}] = \frac{1}{N(N-1)} \sum_i (X_i-\bar{X})^2 60 | $$ 61 | 62 | 期待値のestimatorは母集団のものと同じだが、分散は$1/N$となる。また、$\hat{X}$の母集団は正規分布とは限らないが、$N$が大きい時、$\bar{X}$の従う分布は正規分布に近づいていく。それを見てみよう。 63 | 64 | 例によって「公平なサイコロ」を考える。サイコロを振った後出てくる目を確率変数$\hat{X}$とみなそう。$\hat{X}$がとり得る値は$1,2,3,4,5,6$の6種類で、それぞれ出現確率は等しく$1/6$だ。したがって、その母集団は以下のような分布になる。 65 | 66 | ![population](histogram/population.png) 67 | 68 | サイコロを二つ振った時の平均はどうなるだろう?サイコロの出る目の集団は$(1,1)$から$(6,6)$まで36通りだが、目の平均は$1$から$6$まで11通りだ。分布を見てみよう。 69 | 70 | ```py 71 | from matplotlib import pyplot as plt 72 | import numpy as np 73 | import itertools 74 | x = np.arange(1,7) 75 | p= itertools.product(x, x) 76 | plt.hist([sum(t)/len(t) for t in p]) 77 | ``` 78 | 79 | ![n2](histogram/n2.png) 80 | 81 | サイコロに4回振った場合、出る目の集団は$(1,1,1,1)$から$(6,6,6,6)$まで$6^4 = 1296$通りだが、その平均は$1$から$6$まで21通りとなる。分布はこうなる。 82 | 83 | ```py 84 | from matplotlib import pyplot as plt 85 | import numpy as np 86 | import itertools 87 | x = np.arange(1,7) 88 | p= itertools.product(x, x, x, x) 89 | plt.hist([sum(t)/len(t) for t in p]) 90 | ``` 91 | 92 | ![n4](histogram/n4.png) 93 | 94 | これ以上は厳密にやると大変なので、サンプリングで分布を推定しよう。 95 | 96 | ![n4](histogram/n4.png) 97 | 98 | ```py 99 | n = 20000 100 | a = [] 101 | for _ in range(n): 102 | xi = np.average(np.random.randint(1,7,1000)) 103 | a.append(xi) 104 | plt.hist(a,bins=40) 105 | ``` 106 | 107 | ![n1000](histogram/n1000.png) 108 | 109 | 平均を取る数$N$が$10,100,1000$のそれぞれの場合を重ねてプロットするとこうなる。 110 | 111 | ![compare](histogram/compare.png) 112 | 113 | それぞれサイコロを$N$回振って平均を取る処理を20000回繰り返してヒストグラムをとったものだ。 114 | $N$が大きくなるほど分布が狭くなっていくのがわかる。すなわち、標本の数が増えるほど、「平均値の母集団」の分布の分散は小さくなり、正規分布へと近づいていく。 115 | 116 | 平均$\mu$、分散$\sigma^2$の正規分布は以下の式で表される。 117 | 118 | $$ 119 | f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2} \right) 120 | $$ 121 | 122 | さて、確率密度関数の定義は、確率変数$\hat{X}$の値がある範囲$a < \hat{X} < b$にある確率が、その範囲における確率密度関数の積分で与えられる、というものであった。したがって、平均$\mu$、分散$\sigma^2$の正規分布に従う確率変数$\hat{X}$が、平均の前後$\sigma$の範囲に収まる確率は 123 | 124 | $$ 125 | P(\mu - \sigma < \hat{X} < \mu + \sigma) = \frac{1}{\sqrt{2\pi\sigma^2}} \int_{\mu - \sigma}^{\mu + \sigma} \exp\left(\frac{(x-\mu)^2}{2\sigma^2} \right) dx \sim 0.6827 126 | $$ 127 | 128 | で与えられる。これを **1シグマの範囲** と呼ぶ。確率変数が正規分布に従う時、1シグマの範囲に入る確率は68.27%である。平均を50、標準偏差を10とするようにスケールした時の値が偏差値であるから、これは「偏差値40から60の間にいるのは全体の68.27%である」ということを意味する。逆に、偏差値40以下、もしくは60以上の人は31.73%であるから、偏差値60以上の人は15.87%ほどいることになる。 129 | 130 | 同様に、平均の前後$n \sigma$に収まる範囲を「nシグマの範囲」と呼ぶ。2シグマの範囲に入る確率、すなわち、偏差値30から70の間に入る確率が95.45%である。簡単にまとめて置こう。 131 | 132 | * 1シグマ:入る確率 68.27%   外れる確率 31.73% 133 | * 2シグマ:入る確率 95.45%   外れる確率 4.55% 134 | * 3シグマ:入る確率 99.73%   外れる確率 0.27% 135 | * 5シグマ:入る確率 99.9994% 外れる確率 0.0005% 136 | 137 | ここまでまとめておこう。 138 | 139 | * エラーバーとは観測値を確率変数とみなした時に、その平均値の分布の推定標準偏差のこと 140 | * サンプル数を増やせば増やすほど、エラーバーは小さくなる 141 | * 観測値が独立同分布なら、サンプル数を増やしていくと平均値の分布はガウス分布に漸近する 142 | * 平均$\mu$、分散$\sigma^2$のガウス分布に従う確率変数$\hat{X}$について、$\mu - n \sigma < \hat{X} < \mu + n \sigma$をnシグマの範囲と呼ぶ。 143 | * ガウス分布に従う確率変数が独立であるならば 144 | * 「1シグマの範囲」からは3つに1つは外れる 145 | * 「5シグマの範囲」から外れる確率はほぼゼロ 146 | 147 | ### エラーバーがおかしなグラフ 148 | 149 | エラーバーつきの期待値は、もしデータが無相関でガウス分布に従うのであれば、以下の性質を持つ。 150 | 151 | * 「真の値」の上下に均等にばらつく 152 | * 3つに1つは「真の値」がエラーバーの範囲に入らない 153 | * 「真の値」がエラーバーの2倍離れることは稀、5倍離れることはない。 154 | 155 | 観測量について「真の値」を定義するのは難しく、その言葉の使用は本来気を付けるべきではあるが、ここでは便宜上、「観測量を確率変数とみなした時の母集団の分布の平均」のことを「真の値」と呼ぶことにする。 156 | 157 | エラーバーの意味は「おおむねこのあたりに値があると思うが、エラーバーの範囲くらいで自信がないよ」ということなので、「小さければ小さいほど良い」と思う人がいる。そういう側面もあるが、エラーバーにはもっと重要な役割がある。それはデータの異常検知だ。エラーバーが適切についていればデータを見て「ん?おかしいぞ」と気づくことができる。以下、エラーバーがおかしいグラフについて実例を見ながら、「何がおかしいか」を確認しておこう。 158 | 159 | #### エラーバーが大きすぎるグラフ 160 | 161 | ![exp1](case1/exp1.png) 162 | 163 | 何かが指数関数的に減衰しているように見える。このグラフに「ありそうな線」を重ねてみよう。 164 | 165 | ![exp1_line](case1/exp1_line.png) 166 | 167 | この「ありそうな線」は、「データの精度を高くしていったときに収束するであろう線」、すなわち「真の値」だ。もちろん「真の値」はわからないが、データから「だいたいこのあたりだろう」ということは推定できる。 168 | 169 | さて、もしこのエラーバーが1シグマの範囲で取られており、かつデータが独立なガウス分布に従うのなら、3つに1つは「真の値」から外れなければならない。にもかかわらず、全てのエラーバーが「ありそうな線」にかかってしまっており、慣れていればここで「変だな」と気づく。 170 | 171 | このデータは以下のコードで生成されたものだ。 172 | 173 | ```py 174 | import numpy as np 175 | 176 | N = 10 177 | np.random.seed(1) 178 | for i in range(10): 179 | x = i + 0.5 180 | d = np.zeros(N) 181 | d += np.exp(-x/3) 182 | d += np.random.randn(N)*0.1 183 | y = np.average(d) 184 | e = np.std(d) 185 | print(f"{x} {y} {e}") 186 | ``` 187 | 188 | ここで、`numpy.std`で標準偏差を求めており、それをそのままエラーバーのデータとして使ってしまっている。初心者がよくやるミスだ。正しくは$\sqrt{N}$で割ってやらないといけない。 189 | 190 | ```py 191 | import numpy as np 192 | 193 | N = 10 194 | np.random.seed(1) 195 | for i in range(10): 196 | x = i + 0.5 197 | d = np.zeros(N) 198 | d += np.exp(-x/3) 199 | d += np.random.randn(N)*0.1 200 | y = np.average(d) 201 | e = np.std(d)/np.sqrt(N) 202 | print(f"{x} {y} {e}") 203 | ``` 204 | 205 | こうして生成されたデータからグラフを作成すると以下のようになる。 206 | 207 | ![exp2_line](case1/exp2_line.png) 208 | 209 | このグラフでは10個のうち少なくとも一つはデータが外れており、他にもエラーバーギリギリのデータ点もあるため、さほど不自然には見えない。 210 | 211 | #### 偏っているグラフ 212 | 213 | ある観測値について、サンプル数を増やすことで期待値が「真の値」に収束し、かつエラーバーが小さくなることを確認する目的で、以下のようなグラフを作ったとする。 214 | 215 | ![corr1](case2/corr1.png) 216 | 217 | どうやらサンプル数が多い極限で0.5に収束しそうなデータであることがわかる。なので0.5の線をひいてみよう。 218 | 219 | ![corr1](case2/corr1_line.png) 220 | 221 | もし各データ点が独立であるなら、「真の値」の両側に均等にばらつくはずだ。しかし、このグラフでは最初の3点が「同じ側」に外れている。 222 | 223 | このデータは以下のコードで生成されたものだ。 224 | 225 | ```py 226 | import numpy as np 227 | 228 | np.random.seed(1) 229 | N = 2048 230 | d = np.random.random(N) 231 | for i in range(4, 12): 232 | n = 2**i 233 | dd = d[:n] 234 | ave = np.average(dd) 235 | err = np.std(dd)/np.sqrt(n) 236 | print(f"{n} {ave} {err}") 237 | ``` 238 | 239 | これでは異なるデータ点が同じデータを使用しているため、データ点が独立ではなくなる。 240 | 241 | データ点ごとに独立なデータを利用するように修正したコードは以下の通り。 242 | 243 | ```py 244 | import numpy as np 245 | 246 | np.random.seed(1) 247 | N = 2048 248 | for i in range(4, 12): 249 | n = 2**i 250 | dd = np.random.random(n) 251 | ave = np.average(dd) 252 | err = np.std(dd)/np.sqrt(n) 253 | print(f"{n} {ave} {err}") 254 | ``` 255 | 256 | このコードが生成したデータのグラフは以下の通り。 257 | 258 | ![corr2](case2/corr2_line.png) 259 | 260 | こちらではデータが「真の値」の両側にばらついており、もっともらしい。 261 | 262 | #### エラーバーが小さすぎるグラフ 263 | 264 | 以下のグラフを見てみよう。ある物体の速度$v$の時間発展を追ったものだ。 265 | 266 | ![langevin](case3/langevin.png) 267 | 268 | よほど複雑な振る舞いをするグラフでなければ、0のまわりを揺らいでいるように見える。$v=0$に線をひいてみよう。 269 | 270 | ![langevin_line](case3/langevin_line.png) 271 | 272 | ひいた線からデータが離れすぎている。あきらかにエラーバーの大きさの5倍以上、すなわち5シグマ以上離れている。もしデータが独立なガウス分布に従うのであれば、5シグマ離れる確率は0.0005%、つまり20万点に1つあるかないかのはずだ。したがって、このグラフはエラーバーが小さすぎる。 273 | 274 | 実はこのグラフは、ランジュバン方程式のシミュレーション結果をグラフ化したものだ。ランジュバン方程式は、水中のコロイドなどの物体が水分子の衝突をうけて揺らぐ振る舞いをモデル化したもので、その運動方程式は以下のようにかける。 275 | 276 | $$ 277 | m\frac{dv}{dt} = -\gamma v + \hat{R} 278 | $$ 279 | 280 | これをシミュレーションするコードは以下の通り。 281 | 282 | ```py 283 | import numpy as np 284 | 285 | N = 1000 286 | v = 0.0 287 | gamma = 0.1 288 | np.random.seed(1) 289 | 290 | for j in range(10): 291 | d = np.zeros(N) 292 | for i in range(N): 293 | v += np.random.randn()*0.1 294 | v -= gamma * v 295 | d[i] = v 296 | ave = np.average(d) 297 | err = np.std(d) / np.sqrt(N) 298 | print(f"{(j+0.5)*N} {ave} {err}") 299 | ``` 300 | 301 | 時間発展を1000ステップごとにまとめて平均とエラーバーを求めている。1000ステップごとにまとめず、生の時間発展をプロットするとこうなる。 302 | 303 | ![langevin_raw](case3/langevin_raw.png) 304 | 305 | 不規則な動きをしているが、一度大きく正の速度を持つと、その動きを忘れるまでにしばらくかかるのがわかる。 306 | 307 | そこで、例えば100ステップに一度観測することにして、それを1000回繰り返して平均とエラーバーを求めてみよう。 308 | 309 | ```py 310 | import numpy as np 311 | 312 | N = 1000 313 | v = 0.0 314 | gamma = 0.1 315 | np.random.seed(1) 316 | 317 | for j in range(10): 318 | d = np.zeros(N) 319 | for i in range(N): 320 | for _ in range(100): 321 | v += np.random.randn()*0.1 322 | v -= gamma * v 323 | d[i] = v 324 | ave = np.average(d) 325 | err = np.std(d) / np.sqrt(N) 326 | print(f"{(j+0.5)*N} {ave} {err}") 327 | ``` 328 | 329 | 結果は以下のようになる。 330 | 331 | ![langevin2](case3/langevin2.png) 332 | 333 | データのばらつき具合も、エラーバーの外れ具合もまともであることがわかる。 334 | 335 | ### エラーバーがおかしいグラフのまとめ 336 | 337 | データがガウス分布に従い、かつ独立であるとき、エラーバーを1シグマの範囲にとると、観測値は以下の性質を持つのであった。 338 | 339 | * 観測値は「真の値」の上下に均等にばらつく 340 | * 観測値の3つに1つが「真の値」の1シグマの範囲に入らない 341 | * 観測値と「真の値」がエラーバーの2倍離れることは稀、5倍離れることはまずない 342 | 343 | 逆に 344 | 345 | * 観測値の全てが「真の値」をエラーバーの範囲に含む 346 | * 「真の値」の片側に連続してずれている 347 | * 「真の値」と5シグマ以上離れている 348 | であるなら、何かがおかしい 349 | 350 | というグラフは何かがおかしい。$\sqrt{N}$での割り忘れなどもあるが、データの相関が原因となることが多い。このように、適切にエラーバーをつけることで怪しいデータを発見できることがある。 351 | 352 | ## 不偏推定量とJackknife法 353 | 354 | 突然だが、$M$個の観測データ$X_1, X_2, \cdots, X_M$があるとしよう。このデータを$N$個ずつのブロックに分けて、それぞれのブロックで平均を計算し、$i$番目のブロックの平均を$\mu_i$とする。 355 | 356 | $$ 357 | \mu_i = \frac{1}{N}\sum_{k \in i} X_k 358 | $$ 359 | 360 | $\mu_i$は$M/N$個できるが、改めてその平均$\left< \mu\right>$を計算しよう。 361 | 362 | $$ 363 | \left< \mu \right> = \frac{N}{M} \sum_i^{M/N} \mu_i 364 | $$ 365 | 366 | ブロックサイズ$N$をいろいろ変えた時、$\left< \mu\right>$は$N$依存性を持つだろうか? 367 | 368 | 代入するとすぐにわかるように、 369 | 370 | $$ 371 | \begin{aligned} 372 | \left< \mu \right> &= \frac{N}{M} \sum_i^{M/N} \mu_i \\ 373 | &= \frac{N}{M} \sum_i^{M/N} \left(\frac{1}{N}\sum_{k \in i} X_k \right)\\ 374 | &= \frac{1}{M} \sum_{j}^{M} X_j 375 | \end{aligned} 376 | $$ 377 | 378 | と、$N$に依らずに全てのデータにたいする算術平均になるため、$\left< \mu \right>$は$N$依存性を持たない。 379 | 380 | では次に、$N$個ずつのブロックで平均値$\mu_i$を計算し、その逆数の期待値$\left<1/\mu\right>$を計算してみよう。 381 | 382 | $$ 383 | \left< 1/\mu \right> = \frac{N}{M} \sum_i^{M/N} \frac{1}{\mu_i} 384 | $$ 385 | 386 | この量$\left< 1/\mu \right>$は$N$依存性を持つだろうか? 387 | 388 | 実際にサイコロで試してみよう。サイコロの目の期待値は$7/2$であるから、その逆数は$7/2 \sim0.286$だ。これを数値シミュレーションで確認しよう。 389 | 390 | まずサイコロをM回振り、それをM個ずつまとめて平均すると、ブロックごとの平均$\mu_i$が$M/N$個できる。それについて逆数の平均をとる。$M=65536$とし、$N=4,8,16,32,64,128$として$\left< 1/\mu\right>$をそれぞれ計算するコードは以下のように書ける。 391 | 392 | ```py 393 | import numpy as np 394 | 395 | np.random.seed(1) 396 | N = 2**16 397 | a = np.random.randint(1, 7, (N)) 398 | 399 | 400 | def calc(m): 401 | b = int(N / m) 402 | z = np.zeros(b) 403 | for i in range(b): 404 | z[i] = np.average(a[i * m:(i + 1) * m]) 405 | z = 1.0 / z 406 | ave = np.average(z) 407 | err = np.std(z) / np.sqrt(len(z)) 408 | print(f"{m} {ave} {err}") 409 | 410 | 411 | for m in [4, 8, 16, 32, 64, 128]: 412 | calc(m) 413 | ``` 414 | 415 | ![bias](bias/bias.png) 416 | 417 | $N$が小さいところで、理論値から大きくずれているが、$N$が大きくなるにつれて理論値である$2/7$に近づいていく。$N$が小さいところでもエラーバーは小さく、この誤差は偶然によるものではないことがわかる。 418 | 419 | この、偶然の揺らぎに起因する誤差を **統計誤差(statistical error)** 、そうでない誤差を **系統誤差(systematic error)** と呼んで区別する。なお、近年では統計誤差を **不確かさ(uncertainty)**、系統誤差を単に **誤差(error)** と呼ぶようになったようだが、本講義では統計誤差、系統誤差の用語を用いる。 420 | 421 | この系統誤差はなぜ生じるか、どうやって消すかを知るのがこの節の目的だ。 422 | 423 | まず、先ほどのサイコロの例の系統誤差は、期待値の関数を、関数の期待値で評価しようとしたために生じたものだ。 424 | 425 | まずは一般論から入ろう。ある確率変数$\hat{X}$の期待値を$\mu$とする。この$\mu$の関数$g(\mu)$を推定したい。まずは$N$回測定して得られたデータ$X_i$から、期待値の推定量$\hat{\mu}_N$を求める。 426 | 427 | $$ 428 | \hat{\mu}_N = \frac{1}{N} \sum_i X_i 429 | $$ 430 | 431 | この推定値も確率変数だ。明らかにこの推定値の期待値は期待値に一致する。 432 | 433 | $$ 434 | \left< \hat{\mu}_N \right> = \mu 435 | $$ 436 | 437 | しかし、「推定値の関数の期待値」は「期待値の関数」と一致しない。 438 | 439 | $$ 440 | \left< g(\hat{\mu}_N) \right> \neq g(\mu) 441 | $$ 442 | 443 | これは、一般に確率変数$\hat{X}$について、関数の期待値と期待値の関数は一致しないからだ。 444 | 445 | $$ 446 | \left< g(\hat{X})\right> \neq g\left(\left<\hat{X} \right>\right) 447 | $$ 448 | 449 | TODO: Jensenの不等式の説明 450 | 451 | この系統誤差の$N$依存性を調べよう。$N$回の測定で得られた期待値の推定量$\hat{\mu}_N$について、真の期待値とのずれを考える。 452 | 453 | $$ 454 | \varepsilon = \hat{\mu}_N - \mu 455 | $$ 456 | 457 | サンプル数を増やすとずれは小さくなるから、この$\varepsilon$は微小量とみなせる。 458 | 459 | 推定値の関数と期待値の関数の差をテイラー展開すると、 460 | 461 | $$ 462 | \begin{aligned} 463 | g(\hat{\mu}_N) - g(\mu) &= g(\mu + \varepsilon) - g(\mu) \\ 464 | &= g'(\mu)\varepsilon + \frac{1}{2}g''(\mu) \varepsilon^2 + O(\varepsilon^3) 465 | \end{aligned} 466 | $$ 467 | 468 | 両辺の期待値を取ると、 469 | 470 | $$ 471 | \left 472 | \sim \frac{1}{2}g''(\mu) \left< \varepsilon^2\right> 473 | = \frac{g''(\mu)\sigma^2}{2N} 474 | $$ 475 | 476 | つまり、$N$個のサンプルから推定した期待値$\hat{\mu}_N$の関数$g(\hat{\mu}_N)$と、期待値の関数$g(\mu)$のずれは、$1/N$に比例する。これを **1/Nバイアス**と呼ぶ。 477 | 478 | なお、比例係数に$g(x)$の二階微分が現れるため、二階微分がゼロである場合にはバイアスは生じない。特に$g(x)=x$の場合には、期待値の推定値の期待値は期待値に一致する。 479 | 480 | $$ 481 | \left<\hat{\mu}_N\right> = \mu 482 | $$ 483 | 484 | TODO: Jackknifeの説明 485 | -------------------------------------------------------------------------------- /03_mc_error/bias/bias.dat: -------------------------------------------------------------------------------- 1 | 4 0.30550885156068 0.0007005130128853653 2 | 8 0.29452383592302395 0.0006143463450093391 3 | 16 0.2896742785388405 0.0005698730775780672 4 | 32 0.28748869015354944 0.0005558964583174234 5 | 64 0.28642949595336914 0.0005533138197921547 6 | 128 0.28585525789068766 0.0005322443900834326 7 | -------------------------------------------------------------------------------- /03_mc_error/bias/bias.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "bias.png" 3 | 4 | set xlabel "N" 5 | set ylabel "<1/{/Symbol m}>" 6 | unset key 7 | 8 | p "bias.dat" u 1:2:3 w e pt 6 lc "blue"\ 9 | ,2.0/7.0 lt 1 lc "black"\ 10 | , "bias.dat" u 1:2 w l lc "blue" 11 | 12 | -------------------------------------------------------------------------------- /03_mc_error/bias/bias.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/bias/bias.png -------------------------------------------------------------------------------- /03_mc_error/bias/bias.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | np.random.seed(1) 4 | N = 2**16 5 | a = np.random.randint(1, 7, (N)) 6 | 7 | 8 | def calc(m): 9 | b = int(N / m) 10 | z = np.zeros(b) 11 | for i in range(b): 12 | z[i] = np.average(a[i * m:(i + 1) * m]) 13 | z = 1.0 / z 14 | ave = np.average(z) 15 | err = np.std(z) / np.sqrt(len(z)) 16 | print(f"{m} {ave} {err}") 17 | 18 | 19 | for m in [4, 8, 16, 32, 64, 128]: 20 | calc(m) 21 | -------------------------------------------------------------------------------- /03_mc_error/case1/exp1.dat: -------------------------------------------------------------------------------- 1 | 0.5 0.8367676358100041 0.11908985520639018 2 | 1.5 0.5895718215010975 0.09991398390871095 3 | 2.5 0.4432894626025371 0.07768150389968005 4 | 3.5 0.29354570728373464 0.08101316961275233 5 | 4.5 0.2462119259721547 0.09468795768592138 6 | 5.5 0.17762577103507152 0.06442275815968751 7 | 6.5 0.16022663307255794 0.10472313693425596 8 | 7.5 0.07103436461650779 0.0928059724876922 9 | 8.5 0.07330689035768646 0.04493452290553393 10 | 9.5 0.048630520845686885 0.056174194104592054 11 | -------------------------------------------------------------------------------- /03_mc_error/case1/exp1.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "exp1.png" 3 | 4 | unset key 5 | set xlabel "t" 6 | set ylabel "Data" 7 | p "exp1.dat" u 1:2:3 w e pt 6 lc "blue" 8 | 9 | set out "exp1_line.png" 10 | 11 | unset key 12 | p "exp1.dat" w errorbars pt 6 lc "blue", exp(-x/3) lt 1 lc "black" 13 | -------------------------------------------------------------------------------- /03_mc_error/case1/exp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case1/exp1.png -------------------------------------------------------------------------------- /03_mc_error/case1/exp1.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | N = 10 4 | np.random.seed(1) 5 | for i in range(10): 6 | x = i + 0.5 7 | d = np.zeros(N) 8 | d += np.exp(-x/3) 9 | d += np.random.randn(N)*0.1 10 | y = np.average(d) 11 | e = np.std(d) 12 | print(f"{x} {y} {e}") 13 | -------------------------------------------------------------------------------- /03_mc_error/case1/exp1_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case1/exp1_line.png -------------------------------------------------------------------------------- /03_mc_error/case1/exp2.dat: -------------------------------------------------------------------------------- 1 | 0.5 0.8367676358100041 0.03765951886718546 2 | 1.5 0.5895718215010975 0.03159557592529395 3 | 2.5 0.4432894626025371 0.024565048439024104 4 | 3.5 0.29354570728373464 0.025618613644583847 5 | 4.5 0.2462119259721547 0.029942961327715796 6 | 5.5 0.17762577103507152 0.020372264893481 7 | 6.5 0.16022663307255794 0.03311636364299517 8 | 7.5 0.07103436461650779 0.029347825352803027 9 | 8.5 0.07330689035768646 0.014209543795449427 10 | 9.5 0.048630520845686885 0.01776383990949137 11 | -------------------------------------------------------------------------------- /03_mc_error/case1/exp2.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "exp2.png" 3 | 4 | unset key 5 | set xlabel "t" 6 | set ylabel "Data" 7 | p "exp2.dat" u 1:2:3 w e pt 6 lc "blue" 8 | 9 | set out "exp2_line.png" 10 | 11 | unset key 12 | p "exp2.dat" w errorbars pt 6 lc "blue", exp(-x/3) lt 1 lc "black" 13 | -------------------------------------------------------------------------------- /03_mc_error/case1/exp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case1/exp2.png -------------------------------------------------------------------------------- /03_mc_error/case1/exp2.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | N = 10 4 | np.random.seed(1) 5 | for i in range(10): 6 | x = i + 0.5 7 | d = np.zeros(N) 8 | d += np.exp(-x/3) 9 | d += np.random.randn(N)*0.1 10 | y = np.average(d) 11 | e = np.std(d)/np.sqrt(N) 12 | print(f"{x} {y} {e}") 13 | -------------------------------------------------------------------------------- /03_mc_error/case1/exp2_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case1/exp2_line.png -------------------------------------------------------------------------------- /03_mc_error/case2/corr1.dat: -------------------------------------------------------------------------------- 1 | 16 0.3769457426333387 0.06407711579106334 2 | 32 0.4244653147213916 0.05252104665406887 3 | 64 0.4484995761494352 0.03675721220349798 4 | 128 0.4940425878708852 0.02695947827660173 5 | 256 0.5011664709937996 0.019142091048802306 6 | 512 0.5055275310294514 0.013061584597896596 7 | 1024 0.4993012230743249 0.009001669200289216 8 | 2048 0.5090678904142079 0.006421340122914996 9 | -------------------------------------------------------------------------------- /03_mc_error/case2/corr1.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "corr1.png" 3 | 4 | set log x 5 | set xlabel "n" 6 | set ylabel "Data" 7 | 8 | unset key 9 | 10 | p [8:4096] "corr1.dat" w errorbars pt 6 lc "blue" 11 | 12 | unset key 13 | set out "corr1_line.png" 14 | p [8:4096] "corr1.dat" w errorbars pt 6 lc "blue", 0.5 lt 1 lc "black" 15 | -------------------------------------------------------------------------------- /03_mc_error/case2/corr1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case2/corr1.png -------------------------------------------------------------------------------- /03_mc_error/case2/corr1.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | np.random.seed(1) 4 | 5 | N = 2048 6 | d = np.random.random(N) 7 | for i in range(4, 12): 8 | n = 2**i 9 | dd = d[:n] 10 | ave = np.average(dd) 11 | err = np.std(dd)/np.sqrt(n) 12 | print(f"{n} {ave} {err}") 13 | -------------------------------------------------------------------------------- /03_mc_error/case2/corr1_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case2/corr1_line.png -------------------------------------------------------------------------------- /03_mc_error/case2/corr2.dat: -------------------------------------------------------------------------------- 1 | 16 0.3769457426333387 0.06407711579106334 2 | 32 0.5281201309038073 0.05602116140857283 3 | 64 0.503571583149169 0.036570017104361356 4 | 128 0.4995018542172543 0.027471490710248337 5 | 256 0.5160682041191058 0.01789957354903797 6 | 512 0.49447044727344486 0.012404423785157413 7 | 1024 0.51834428265298 0.00914543429878978 8 | 2048 0.49263459048849456 0.006303821368992808 9 | -------------------------------------------------------------------------------- /03_mc_error/case2/corr2.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "corr2.png" 3 | 4 | set log x 5 | set xlabel "n" 6 | set ylabel "Data" 7 | 8 | unset key 9 | p [8:4096] "corr2.dat" w errorbars pt 6 lc "blue" 10 | 11 | set out "corr2_line.png" 12 | 13 | p [8:4096] "corr2.dat" w errorbars pt 6 lc "blue", 0.5 lt 1 lc "black" 14 | -------------------------------------------------------------------------------- /03_mc_error/case2/corr2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case2/corr2.png -------------------------------------------------------------------------------- /03_mc_error/case2/corr2.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | np.random.seed(1) 4 | 5 | N = 2048 6 | for i in range(4, 12): 7 | n = 2**i 8 | dd = np.random.random(n) 9 | ave = np.average(dd) 10 | err = np.std(dd)/np.sqrt(n) 11 | print(f"{n} {ave} {err}") 12 | -------------------------------------------------------------------------------- /03_mc_error/case2/corr2_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case2/corr2_line.png -------------------------------------------------------------------------------- /03_mc_error/case3/langevin.dat: -------------------------------------------------------------------------------- 1 | 500.0 0.03561556365596775 0.005765616814617357 2 | 1500.0 0.023764834613652638 0.006634163217598262 3 | 2500.0 -0.017139900102570358 0.00615017052243654 4 | 3500.0 0.0009351432297691194 0.007000096769439968 5 | 4500.0 0.06078906909240539 0.006801083275192417 6 | 5500.0 -0.038122607991224675 0.006490502014121003 7 | 6500.0 -0.013080112435250459 0.006178584959929426 8 | 7500.0 -0.013551088855203137 0.00610436253272948 9 | 8500.0 0.02225551191195271 0.007251961333250708 10 | 9500.0 0.027835281841352696 0.006571023454229717 11 | -------------------------------------------------------------------------------- /03_mc_error/case3/langevin.plt: -------------------------------------------------------------------------------- 1 | set term png 2 | set out "langevin.png" 3 | 4 | set xla "t" 5 | set yla "v" 6 | 7 | unset key 8 | p "langevin.dat" w e pt 6 lc "blue" 9 | 10 | set out "langevin_line.png" 11 | 12 | p "langevin.dat" w e pt 6 lc "blue", 0 lt 1 lc "black" 13 | -------------------------------------------------------------------------------- /03_mc_error/case3/langevin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case3/langevin.png -------------------------------------------------------------------------------- /03_mc_error/case3/langevin.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | N = 1000 4 | v = 0.0 5 | gamma = 0.1 6 | np.random.seed(1) 7 | 8 | for j in range(10): 9 | d = np.zeros(N) 10 | for i in range(N): 11 | v += np.random.randn()*0.1 12 | v -= gamma * v 13 | d[i] = v 14 | ave = np.average(d) 15 | err = np.std(d) / np.sqrt(N) 16 | print(f"{(j+0.5)*N} {ave} {err}") 17 | -------------------------------------------------------------------------------- /03_mc_error/case3/langevin2.dat: -------------------------------------------------------------------------------- 1 | 500.0 0.0014163636320679734 0.006454413961873986 2 | 1500.0 0.0051715877137851 0.0063744212991942465 3 | 2500.0 0.007077305725003488 0.006497203197229506 4 | 3500.0 -0.009258191048828333 0.006364550506544703 5 | 4500.0 -0.00021548581395447886 0.0063131846302737 6 | 5500.0 0.004827104594078019 0.006728263939165871 7 | 6500.0 -0.008461333981073507 0.006311080469491801 8 | 7500.0 0.006803594145459902 0.006560323476713106 9 | 8500.0 -0.0020122396036379195 0.006377536567779971 10 | 9500.0 0.0010063017314840942 0.006578260703988652 11 | -------------------------------------------------------------------------------- /03_mc_error/case3/langevin2.plt: -------------------------------------------------------------------------------- 1 | set term png 2 | set out "langevin2.png" 3 | 4 | set xla "t" 5 | set yla "v" 6 | 7 | unset key 8 | 9 | p "langevin2.dat" w e pt 6 lc "blue", 0 lt 1 lc "black" 10 | -------------------------------------------------------------------------------- /03_mc_error/case3/langevin2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case3/langevin2.png -------------------------------------------------------------------------------- /03_mc_error/case3/langevin2.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | N = 1000 4 | v = 0.0 5 | gamma = 0.1 6 | np.random.seed(1) 7 | 8 | for j in range(10): 9 | d = np.zeros(N) 10 | for i in range(N): 11 | for _ in range(100): 12 | v += np.random.randn()*0.1 13 | v -= gamma * v 14 | d[i] = v 15 | ave = np.average(d) 16 | err = np.std(d) / np.sqrt(N) 17 | print(f"{(j+0.5)*N} {ave} {err}") 18 | -------------------------------------------------------------------------------- /03_mc_error/case3/langevin_line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case3/langevin_line.png -------------------------------------------------------------------------------- /03_mc_error/case3/langevin_long.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case3/langevin_long.png -------------------------------------------------------------------------------- /03_mc_error/case3/langevin_raw.dat: -------------------------------------------------------------------------------- 1 | 0 0.14619108272969178 2 | 1 0.07651389722821582 3 | 2 0.02132704980168322 4 | 3 -0.07737283117254046 5 | 4 0.008251138583934663 6 | 5 -0.19971245799368426 7 | 6 -0.02270815341483262 8 | 7 -0.08894595915390861 9 | 8 -0.05133784459337888 10 | 9 -0.0686473939270079 11 | 10 0.06980705979974056 12 | 11 -0.12258631003502238 13 | 12 -0.13934522739273583 14 | 13 -0.15997559657361968 15 | 14 -0.04193878710606834 16 | 15 -0.1367351224537243 17 | 16 -0.13858014888789108 18 | 17 -0.20372939161202544 19 | 18 -0.17955721524641954 20 | 19 -0.10914812448735359 21 | 20 -0.19728903798778114 22 | 21 -0.07453500030343775 23 | 22 0.014061664580257628 24 | 23 0.0578799886234 25 | 24 0.13316902519485707 26 | 25 0.05831661534968138 27 | 26 0.041424833518034915 28 | 27 -0.046936898917084774 29 | 28 -0.06635313619171773 30 | 29 -0.011985830566109218 31 | 30 -0.07303671516477611 32 | 31 -0.10144086106533647 33 | 32 -0.15314231796956676 34 | 33 -0.21389659390749485 35 | 34 -0.2529190862920591 36 | 35 -0.2287669915655543 37 | 36 -0.3064482237861739 38 | 37 -0.2547059886040183 39 | 38 -0.07985319380372809 40 | 39 -0.005083899971395071 41 | 40 -0.021840709686800908 42 | 41 -0.09954324548575608 43 | 42 -0.15683316737475586 44 | 43 0.011171063455216923 45 | 44 0.014626655039537837 46 | 45 -0.044165618655657754 47 | 46 -0.022566663170020037 48 | 47 0.16871296543007777 49 | 48 0.16265597461041661 50 | 49 0.2019386570230427 51 | 50 0.2087601201167629 52 | 51 0.15618162192066992 53 | 52 0.03773682190661031 54 | 53 0.002522294698790306 55 | 54 -0.016530415774818757 56 | 55 0.037918713009060905 57 | 56 0.10963534895686028 58 | 57 0.18247100137849442 59 | 58 0.18992676051352828 60 | 59 0.250596789246541 61 | 60 0.15764129563218815 62 | 61 0.25463530003996526 63 | 62 0.27533545387358954 64 | 63 0.22097355332698618 65 | 64 0.24284283118266228 66 | 65 0.21175709389250105 67 | 66 0.29242802937387935 68 | 67 0.39996873991448934 69 | 68 0.556673652511025 70 | 69 0.3753216170659901 71 | 70 0.20781921287072802 72 | 71 0.1416353639184746 73 | 72 0.14187516377693185 74 | 73 0.2065428502996989 75 | 74 0.2142957105214735 76 | 75 0.010868030045165861 77 | 76 -0.01777713409590419 78 | 77 0.058518297148338394 79 | 78 0.07337499361629907 80 | 79 0.1346185004827514 81 | 80 0.10114711759954392 82 | 81 0.07296417963588976 83 | 82 0.08245828686124637 84 | 83 0.1111171064238648 85 | 84 0.11785237059288758 86 | 85 0.11677791165627012 87 | 86 0.04474051472463035 88 | 87 0.07424720402105006 89 | 88 0.07778639800817438 90 | 89 0.1716613099194297 91 | 90 0.26239778811862235 92 | 91 0.25282208688031504 93 | 92 0.19376423268417325 94 | 93 0.1169020727448759 95 | 94 0.14332635733615848 96 | 95 0.13595432775391297 97 | 96 0.09141206417712487 98 | 97 0.08619457487449461 99 | 98 0.021775041431713514 100 | 99 0.08242042035504185 101 | 100 0.03393680748879783 102 | 101 0.14074882017241294 103 | 102 0.16298818591634365 104 | 103 0.2001114344160453 105 | 104 0.081558224857747 106 | 105 0.08864682134725242 107 | 106 0.14643221981119192 108 | 107 0.045955943667358605 109 | 108 0.01740068376029676 110 | 109 0.018595924586669355 111 | 110 -0.10684422669420561 112 | 111 -0.0677954587409788 113 | 112 0.015138545415772097 114 | 113 -0.06373174380068389 115 | 114 -0.02580943134084584 116 | 115 -0.14133399521813012 117 | 116 -0.13068319153026173 118 | 117 -0.26303438430053205 119 | 118 -0.13580335212926908 120 | 119 -0.08542196850202767 121 | 120 -0.07909529768064495 122 | 121 -0.1409503136378048 123 | 122 -0.01221724855973442 124 | 123 0.16604363372916517 125 | 124 -0.017779097443959044 126 | 125 0.0952535750411907 127 | 126 0.2322167853204732 128 | 127 0.23941615948012873 129 | 128 0.1075404206219491 130 | 129 0.17448745713871613 131 | 130 0.14075588423781096 132 | 131 0.0723274393126367 133 | 132 -0.04561053682865353 134 | 133 0.008498891492071212 135 | 134 0.07900162027560538 136 | 135 0.014983692576863595 137 | 136 0.06033719365578061 138 | 137 -0.0486872507758803 139 | 138 0.028348967170128764 140 | 139 0.02970512731128899 141 | 140 0.0099433351084987 142 | 141 -0.00020812692997423872 143 | 142 0.0780124398935513 144 | 143 0.13774824349204692 145 | 144 0.17162529833458606 146 | 145 0.16685587740089222 147 | 146 0.15717419117294654 148 | 147 0.1971109956355191 149 | 148 0.1983244063980536 150 | 149 0.23992159237605187 151 | 150 0.18801892352182129 152 | 151 -0.049918367600003344 153 | 152 0.04856768332734426 154 | 153 0.24053908322229303 155 | 154 0.25620797482123614 156 | 155 0.22157320634359753 157 | 156 0.1871358587585948 158 | 157 0.1577073959830024 159 | 158 0.14350350313170257 160 | 159 0.028171467231312353 161 | 160 -0.021184180704639396 162 | 161 -0.10879817712269914 163 | 162 -0.07552643488552988 164 | 163 -0.09467149511035453 165 | 164 -0.04063532644130263 166 | 165 -0.05229507817399746 167 | 166 0.04170459654731408 168 | 167 0.056752188012772445 169 | 168 0.24823994481877124 170 | 169 0.052743467276695766 171 | 170 -0.010753381393915538 172 | 171 0.07145577699386002 173 | 172 0.2918595129070498 174 | 173 0.2402964316219534 175 | 174 0.2201969978458131 176 | 175 0.1778090162350073 177 | 176 0.2798592547443899 178 | 177 0.2260156215571092 179 | 178 0.2646203449904277 180 | 179 0.2093761665905045 181 | 180 0.07390826195931456 182 | 181 0.09473673060509201 183 | 182 0.13054969075376216 184 | 183 0.2338850511062895 185 | 184 0.20055631361810206 186 | 185 0.12493809652217937 187 | 186 0.1630927855656738 188 | 187 0.16844984531050233 189 | 188 0.17686471772048962 190 | 189 0.15259810261118564 191 | 190 0.24176876364950636 192 | 191 0.25084623175837084 193 | 192 0.39718089233322207 194 | 193 0.45745790597034525 195 | 194 0.47102659702232963 196 | 195 0.2774544866646335 197 | 196 0.30391777322477675 198 | 197 0.31135139423053443 199 | 198 0.353201905359801 200 | 199 0.4118815033474742 201 | 200 0.3346143157517234 202 | 201 0.37531338983708773 203 | 202 0.28717456206166087 204 | 203 0.4343961326063079 205 | 204 0.2710808693591248 206 | 205 0.0855108119873218 207 | 206 -0.0716051831355794 208 | 207 -0.14459466739669583 209 | 208 -0.23085558652740173 210 | 209 -0.03172292654133379 211 | 210 -0.05793558871423699 212 | 211 -0.17298285088678253 213 | 212 -0.055390097887923005 214 | 213 -0.10263824259307402 215 | 214 -0.2036912222224924 216 | 215 -0.10449659651180619 217 | 216 -0.03794434096860262 218 | 217 -0.07329600833771285 219 | 218 0.060712192517769006 220 | 219 0.0662601154399574 221 | 220 0.20515956779311867 222 | 221 0.22989029039379816 223 | 222 0.34719376001020574 224 | 223 0.3223206266874737 225 | 224 0.18031156829061337 226 | 225 0.3827235898770778 227 | 226 0.2953315557709389 228 | 227 0.24790299253384426 229 | 228 0.16007682783754693 230 | 229 0.12576364464698198 231 | 230 0.13502752987964528 232 | 231 0.1396894929903411 233 | 232 0.18521236957518938 234 | 233 0.3279853714254715 235 | 234 0.2843450228219587 236 | 235 0.14492965434958444 237 | 236 0.02402805752875896 238 | 237 -0.03829265486203833 239 | 238 -0.1851410120615384 240 | 239 -0.09237422665587583 241 | 240 -0.12797602471708527 242 | 241 -0.14316707029263334 243 | 242 -0.12902059671879035 244 | 243 -0.2418143752605002 245 | 244 -0.295151410204294 246 | 245 -0.20491223187194707 247 | 246 -0.128752486913986 248 | 247 -0.1557627119856448 249 | 248 0.022761701484210774 250 | 249 -0.09702989169440668 251 | 250 -0.11837575143891416 252 | 251 -0.127313753177215 253 | 252 -0.3659600278726821 254 | 253 -0.15498643185996672 255 | 254 -0.10651790736536479 256 | 255 -0.18987916100052957 257 | 256 0.013714364956693407 258 | 257 0.0650525084765385 259 | 258 0.09720461023086145 260 | 259 0.03285429336977116 261 | 260 0.039128909195963645 262 | 261 -0.10209521018427492 263 | 262 -0.020333340667611395 264 | 263 -0.05199945529674011 265 | 264 -0.03473517207715002 266 | 265 0.07692328272853852 267 | 266 0.09485828443209987 268 | 267 0.10899452608058406 269 | 268 0.12298001090652219 270 | 269 0.04468756546529182 271 | 270 0.11545923366784683 272 | 271 0.24281563027346573 273 | 272 0.28682657665493294 274 | 273 0.3377857122912791 275 | 274 0.22505180435951427 276 | 275 0.12444577386499955 277 | 276 -0.017677645707766004 278 | 277 0.09499289523756985 279 | 278 0.06261741762914971 280 | 279 0.18234163068952347 281 | 280 0.09373541617875907 282 | 281 0.04498606610631087 283 | 282 0.049075717342892976 284 | 283 0.1270986517879597 285 | 284 0.11985630423111934 286 | 285 0.12687190175870192 287 | 286 0.11567219264033712 288 | 287 0.12005186820113983 289 | 288 0.007564379771398846 290 | 289 0.014091380881854037 291 | 290 -0.004109866622363332 292 | 291 -0.008813083239853256 293 | 292 0.03637851511843047 294 | 293 -0.0285203690842123 295 | 294 -0.03327405464220776 296 | 295 -0.05670921862760231 297 | 296 -0.013481116317104448 298 | 297 0.058496353906009046 299 | 298 -0.03334155509822388 300 | 299 0.022724539210833915 301 | 300 0.20637258410944562 302 | 301 0.05333120237356482 303 | 302 -0.026717388442151917 304 | 303 -0.10329763358391211 305 | 304 -0.11808666516441702 306 | 305 0.0397784190878848 307 | 306 0.037002318050342216 308 | 307 -0.02922033733054237 309 | 308 0.029664011790013385 310 | 309 -0.027284797185364223 311 | 310 0.07655077711514638 312 | 311 0.09636973302559271 313 | 312 0.2117229053963576 314 | 313 0.13102963297295017 315 | 314 0.39070380978913793 316 | 315 0.4258460450632353 317 | 316 0.44217365428971483 318 | 317 0.3933493285760536 319 | 318 0.2887106549963498 320 | 319 0.18174040851059167 321 | 320 0.15132840831047947 322 | 321 0.06444128678504984 323 | 322 0.08343797220890269 324 | 323 0.0007454061217535987 325 | 324 0.056568308585089 326 | 325 0.1369624310978028 327 | 326 0.05974054232181696 328 | 327 0.16110823418755768 329 | 328 0.12358263655110549 330 | 329 0.2152002826439352 331 | 330 0.2331152256357531 332 | 331 0.3108132520213161 333 | 332 0.19000014522151307 334 | 333 0.1613886718892315 335 | 334 0.27587843815349256 336 | 335 0.1926672780468012 337 | 336 -0.009947560069150475 338 | 337 -0.18378583039511645 339 | 338 -0.39098690609645037 340 | 339 -0.5421629684593197 341 | 340 -0.5249941963003512 342 | 341 -0.35742724921456104 343 | 342 -0.3614851594492905 344 | 343 -0.29621918168023254 345 | 344 -0.2764964976269339 346 | 345 -0.24807744277499827 347 | 346 -0.2384075940745229 348 | 347 -0.23024306565478977 349 | 348 -0.16571399009137922 350 | 349 -0.25498103151195967 351 | 350 -0.1385714824006385 352 | 351 -0.041912720168275956 353 | 352 -0.05527660883027947 354 | 353 0.02273646023364482 355 | 354 -0.04265818415286558 356 | 355 -0.08674243788635948 357 | 356 -0.06400444757341603 358 | 357 -0.07472389507371197 359 | 358 -0.10763792850678683 360 | 359 -0.1573944591469018 361 | 360 -0.1918295381929555 362 | 361 -0.08812139739597605 363 | 362 -0.25420836416653025 364 | 363 -0.19706303495663727 365 | 364 -0.19863605712414234 366 | 365 -0.1132692364117597 367 | 366 -0.05558568754304082 368 | 367 -0.3004552208774998 369 | 368 -0.21779150384678148 370 | 369 -0.16682767155174544 371 | 370 -0.14817724910018118 372 | 371 -0.17554016765517327 373 | 372 -0.08119084091364993 374 | 373 -0.11024439469627784 375 | 374 0.06590463117182176 376 | 375 0.11010862504912781 377 | 376 0.2915022886137685 378 | 377 0.19165400002957042 379 | 378 0.014455292405656711 380 | 379 0.07734082693881443 381 | 380 0.14635010980020877 382 | 381 0.13489750755511606 383 | 382 -0.017083635317413432 384 | 383 -0.05568583841012276 385 | 384 0.005501443483719646 386 | 385 -0.0116245701734894 387 | 386 -0.020900779848656122 388 | 387 -0.034602009043348245 389 | 388 -0.11519412714539855 390 | 389 -0.15164654377838263 391 | 390 -0.26487187724739225 392 | 391 -0.07926829417466065 393 | 392 -0.11412502351961296 394 | 393 -0.059727604804071494 395 | 394 -0.1457245793413822 396 | 395 -0.05964457984314656 397 | 396 -0.22226460984600904 398 | 397 -0.11718278823646207 399 | 398 -0.10864762265189984 400 | 399 0.09217159443735402 401 | 400 -0.03463363156234305 402 | 401 -0.024296025191745466 403 | 402 0.01118444057697691 404 | 403 0.12102692383314057 405 | 404 0.07086710492465673 406 | 405 0.07156219101937691 407 | 406 -0.12841603369952395 408 | 407 -0.1902896280916153 409 | 408 -0.13061522973248202 410 | 409 -0.018178017391944593 411 | 410 -0.04171647986865529 412 | 411 0.14752716520605666 413 | 412 0.2911968790658694 414 | 413 0.2566184668995496 415 | 414 0.01374135010395372 416 | 415 -0.14761375872898053 417 | 416 -0.2028596772525496 418 | 417 -0.08214800981411946 419 | 418 -0.04600870293216846 420 | 419 -0.22989013609900472 421 | 420 -0.22749004708741888 422 | 421 -0.05953851866799659 423 | 422 -0.08731708865843568 424 | 423 -0.1460826453474021 425 | 424 0.053441788413968544 426 | 425 0.052904467884423004 427 | 426 0.00448988220523351 428 | 427 0.03555593827925526 429 | 428 0.03354516982499771 430 | 429 -0.008432152198660503 431 | 430 0.10117213259088222 432 | 431 0.19146808158239775 433 | 432 0.24799881365685733 434 | 433 0.2139390827095532 435 | 434 0.29576620831455136 436 | 435 0.2617163553588154 437 | 436 0.2775426138735295 438 | 437 0.34282017060073167 439 | 438 0.3813341459645699 440 | 439 0.5042786528566773 441 | 440 0.49446634901462494 442 | 441 0.2934543153850211 443 | 442 0.15969357439811413 444 | 443 0.26523383063965805 445 | 444 0.2088949622817557 446 | 445 0.22279398911555834 447 | 446 0.12388358111622809 448 | 447 0.2015745511358324 449 | 448 0.14678219362729802 450 | 449 0.263333715739425 451 | 450 0.1890992822846465 452 | 451 0.2708213597607745 453 | 452 0.30443487321857526 454 | 453 0.20897611440944416 455 | 454 0.2869881729157459 456 | 455 0.17714225148133148 457 | 456 0.08540597933181567 458 | 457 0.14181939768877644 459 | 458 0.07135667778795987 460 | 459 0.010775133956258013 461 | 460 -0.021253443268303106 462 | 461 -0.10914332602999921 463 | 462 -0.004179496556348514 464 | 463 0.051004775962922806 465 | 464 0.039664715664487066 466 | 465 0.025942958052419775 467 | 466 0.0638626583962239 468 | 467 0.21635655160331796 469 | 468 0.273108178670888 470 | 469 0.20003621871901311 471 | 470 0.25000032531950944 472 | 471 0.21431088729828046 473 | 472 0.17496996202611723 474 | 473 0.3254553895871968 475 | 474 0.255205439837446 476 | 475 0.18655825349223487 477 | 476 -0.007787047709059558 478 | 477 -0.13321796602893593 479 | 478 -0.07929510493992846 480 | 479 -0.13390847555260713 481 | 480 -0.07413038583685472 482 | 481 -0.16705574196610357 483 | 482 -0.21940805213934933 484 | 483 -0.13675588329937408 485 | 484 0.008400019272240353 486 | 485 0.060882569473178105 487 | 486 0.1625990882807729 488 | 487 0.2997526548762123 489 | 488 0.3633854131724596 490 | 489 0.24438726840821126 491 | 490 0.21046751744171133 492 | 491 0.24613837605918218 493 | 492 0.18418831733732277 494 | 493 0.20644462896250057 495 | 494 0.04367610038074862 496 | 495 -0.03526802775440277 497 | 496 0.01585795212370317 498 | 497 -0.18706562908878951 499 | 498 -0.2680531913855203 500 | 499 -0.24284252085888106 501 | 500 -0.37330377148875005 502 | 501 -0.3308325046924867 503 | 502 -0.3697085283854964 504 | 503 -0.3589811891420217 505 | 504 -0.34639152703386744 506 | 505 -0.29471598655020154 507 | 506 -0.31598537400758864 508 | 507 -0.27631505994779665 509 | 508 -0.3027876660114615 510 | 509 -0.22246228350335068 511 | 510 -0.04777323495708831 512 | 511 -0.02527763132885325 513 | 512 -0.007461635214686471 514 | 513 -0.11147618909772603 515 | 514 -0.03792560987851881 516 | 515 -0.10235910846072784 517 | 516 -0.16491944529714664 518 | 517 -0.09825795001020897 519 | 518 -0.0721386680169797 520 | 519 0.03472098937013388 521 | 520 0.1611078139977883 522 | 521 0.09642569199978515 523 | 522 0.09833705191384162 524 | 523 0.24694071324423647 525 | 524 0.309235174440428 526 | 525 0.34248607152367944 527 | 526 0.42579601023350183 528 | 527 0.3288021419853578 529 | 528 0.3532144346341388 530 | 529 0.4447257962134856 531 | 530 0.5461353222980944 532 | 531 0.4189651565038848 533 | 532 0.3544179621666681 534 | 533 0.35342053158519404 535 | 534 0.2920687175557912 536 | 535 0.22759838421748776 537 | 536 0.26639866533211476 538 | 537 0.20795190034087196 539 | 538 0.026244550098810347 540 | 539 0.05618635351449046 541 | 540 0.01236336701165794 542 | 541 -0.05471075804523786 543 | 542 -0.19015611579974556 544 | 543 -0.07989648219231751 545 | 544 -0.27234697083958703 546 | 545 -0.398052298180635 547 | 546 -0.38307321399307437 548 | 547 -0.23415988988520417 549 | 548 -0.09287036938524494 550 | 549 -0.18753176959036325 551 | 550 -0.1847654902698465 552 | 551 -0.30223001500074304 553 | 552 -0.18099837776092698 554 | 553 -0.2957891794316505 555 | 554 -0.2790978785391368 556 | 555 -0.15821955057974552 557 | 556 -0.16241485808946274 558 | 557 -0.013858941336199849 559 | 558 -0.09077378728975655 560 | 559 -0.04846926630156226 561 | 560 0.033173057052729965 562 | 561 0.017281695607760446 563 | 562 0.1403218098291531 564 | 563 0.17562129146817518 565 | 564 0.010688698950606892 566 | 565 0.3658940724189629 567 | 566 0.38768259314522663 568 | 567 0.358575230274827 569 | 568 0.19682455356736145 570 | 569 0.1845012019031308 571 | 570 0.12465622693715586 572 | 571 0.1701824341861693 573 | 572 0.18661451697662024 574 | 573 0.3347239189352023 575 | 574 0.3140541505690507 576 | 575 0.3288642287111149 577 | 576 0.32949892247603324 578 | 577 0.2831849479530845 579 | 578 0.23836043539897392 580 | 579 0.31361441009923985 581 | 580 0.3524554112697925 582 | 581 0.2605601257779731 583 | 582 0.13429486393260667 584 | 583 0.11479847529412912 585 | 584 0.20784822611541165 586 | 585 0.18458575873975247 587 | 586 0.32330634089629473 588 | 587 0.2212193809700561 589 | 588 0.21184509126297296 590 | 589 -0.03580676535024174 591 | 590 -0.08583619809714368 592 | 591 -0.10507349696519691 593 | 592 -0.04858174756438918 594 | 593 0.11023599267245193 595 | 594 0.10235731644794335 596 | 595 0.2229741671479426 597 | 596 0.26022804731508675 598 | 597 0.32297693880266387 599 | 598 0.24872530780806398 600 | 599 0.3485019979556351 601 | 600 0.21708501307602351 602 | 601 0.23994078677644964 603 | 602 0.13026111903524137 604 | 603 0.0706019074158293 605 | 604 -0.0679846077507432 606 | 605 -0.10765745875381089 607 | 606 -0.0652911921924429 608 | 607 -0.06495141465027607 609 | 608 -0.1797551178980782 610 | 609 -0.029413019006047154 611 | 610 0.003878167342318834 612 | 611 0.09421623958490563 613 | 612 0.155465038393537 614 | 613 0.0800804355271341 615 | 614 -0.10298183430066284 616 | 615 -0.17507184401145012 617 | 616 -0.04730063317571433 618 | 617 -0.13738971649117127 619 | 618 -0.05020681325288866 620 | 619 -0.10030275950919393 621 | 620 -0.054892651521416015 622 | 621 -0.21355617310554187 623 | 622 -0.08716379085499092 624 | 623 -0.08201759477763522 625 | 624 0.005908486607059957 626 | 625 0.02240518639083257 627 | 626 0.0919904093286542 628 | 627 0.07361748486206478 629 | 628 0.1331578252921059 630 | 629 -0.016019498817268593 631 | 630 -0.11168151125563733 632 | 631 -0.03522069972673538 633 | 632 -0.035224672812916545 634 | 633 -0.05229008094144402 635 | 634 -0.06322617936592183 636 | 635 -0.011748301588264749 637 | 636 -0.06397440931125599 638 | 637 -0.011649284673057352 639 | 638 -0.09290562262193275 640 | 639 -0.1202677442315364 641 | 640 -0.01959531935365377 642 | 641 0.07877693108784178 643 | 642 -0.027844654443924997 644 | 643 0.05041693825102147 645 | 644 -0.04815116455722195 646 | 645 0.022636042753217296 647 | 646 -0.15052064686084096 648 | 647 -0.236008544494277 649 | 648 -0.25821519504890683 650 | 649 -0.24737741148375247 651 | 650 -0.09451437169396838 652 | 651 -0.0037030088642541216 653 | 652 0.1384594037936856 654 | 653 0.23320817423751816 655 | 654 0.18442963716663033 656 | 655 0.14201725386128247 657 | 656 0.22402297447326786 658 | 657 0.2052541058179966 659 | 658 0.17059926471179832 660 | 659 0.033371093169251236 661 | 660 0.02045257291232752 662 | 661 -0.23278236098135144 663 | 662 -0.250554704846598 664 | 663 -0.31368935701150025 665 | 664 -0.2199887300318082 666 | 665 -0.2410703691060369 667 | 666 -0.24657797163613052 668 | 667 -0.10068068265217267 669 | 668 -0.18502871145213085 670 | 669 -0.13802653974281887 671 | 670 -0.29479791104141895 672 | 671 -0.25724249936725846 673 | 672 -0.1945943323448166 674 | 673 -0.09774651164861284 675 | 674 -0.16885334788242973 676 | 675 -0.12319888831917333 677 | 676 -0.08224512151617396 678 | 677 -0.07575145643334391 679 | 678 -0.05467484570450719 680 | 679 -0.0074892721782065744 681 | 680 0.02906889327898069 682 | 681 -0.06347897606687335 683 | 682 -0.16475861438938938 684 | 683 0.07725547272823013 685 | 684 0.24231123123393505 686 | 685 0.09282765926567851 687 | 686 0.12406449012251676 688 | 687 0.16812737855804502 689 | 688 0.21893499186668414 690 | 689 0.20967708196027723 691 | 690 0.10529089923547331 692 | 691 0.0783439727392472 693 | 692 0.026308313064148853 694 | 693 0.03577106220131186 695 | 694 0.008040538610328777 696 | 695 -0.00461432161653575 697 | 696 0.08751683327422721 698 | 697 0.1895153879427297 699 | 698 0.06426456359899266 700 | 699 0.016444397839981074 701 | 700 -0.056372037783782136 702 | 701 0.059400165071005914 703 | 702 0.0481170373345404 704 | 703 0.17371437997532757 705 | 704 0.11336066505868993 706 | 705 0.10436459802953016 707 | 706 -0.027454541985174667 708 | 707 0.09251911049709902 709 | 708 0.050632111565435824 710 | 709 -0.08809518021039864 711 | 710 -0.13260717785315304 712 | 711 -0.3267881744671502 713 | 712 -0.2969729025633264 714 | 713 -0.25715171548971616 715 | 714 -0.205509508910281 716 | 715 -0.05012882149731983 717 | 716 -0.07220379320356832 718 | 717 0.0076876186472628425 719 | 718 0.03502033879370655 720 | 719 0.014119357271675542 721 | 720 -0.17420476042861185 722 | 721 -0.07150917932463983 723 | 722 -0.10971591681498444 724 | 723 -0.09712829488491162 725 | 724 -0.20175693527111363 726 | 725 -0.15611164370101213 727 | 726 -0.13077770577279985 728 | 727 -0.11505234948815095 729 | 728 -0.11567849617595098 730 | 729 -0.009681000390624781 731 | 730 0.07824697728048843 732 | 731 0.1357547962793135 733 | 732 0.421076404706715 734 | 733 0.32494848450208513 735 | 734 0.25829705965382743 736 | 735 0.1411350215111643 737 | 736 0.16626027702672475 738 | 737 0.08776038394863658 739 | 738 -0.16386821119617132 740 | 739 -0.2566818214011376 741 | 740 -0.22451096833699422 742 | 741 -0.11117901135801452 743 | 742 -0.24018585043006588 744 | 743 -0.27128705693265026 745 | 744 -0.25670001372996815 746 | 745 -0.2965983864051945 747 | 746 -0.21913380635361476 748 | 747 -0.1968603499404695 749 | 748 -0.1482603826428777 750 | 749 -0.1987036876956729 751 | 750 -0.04054504940420673 752 | 751 -0.036524295252038104 753 | 752 0.08354760013286347 754 | 753 0.035683050389612135 755 | 754 0.08521829712512564 756 | 755 0.015551926942861989 757 | 756 -0.07158509834599348 758 | 757 -0.12781811834850543 759 | 758 -0.11916430825993395 760 | 759 -0.12693388874103437 761 | 760 0.02428813100202472 762 | 761 -0.08152406276550289 763 | 762 -0.17150210640988595 764 | 763 -0.0013349625708000135 765 | 764 0.053589062988009785 766 | 765 -0.12109682135573659 767 | 766 -0.06423292034202498 768 | 767 -0.03644968536725878 769 | 768 -0.22580468103609344 770 | 769 -0.23648483121285307 771 | 770 -0.2144072937568238 772 | 771 -0.12714033783988551 773 | 772 -0.028521694066605086 774 | 773 -0.017052315260032456 775 | 774 0.07766348855975216 776 | 775 0.05673254498875511 777 | 776 -0.02611542373669988 778 | 777 -0.10758024724634531 779 | 778 -0.04798414601074233 780 | 779 -0.21942094911357907 781 | 780 -0.13647617280143812 782 | 781 -0.22242013158656398 783 | 782 -0.2325082870418741 784 | 783 -0.16377308708992408 785 | 784 -0.03778109730881041 786 | 785 -0.2086642743707698 787 | 786 -0.26035388600950393 788 | 787 -0.22990294509497428 789 | 788 -0.26056042069836644 790 | 789 -0.15695829950782142 791 | 790 -0.3290376204481266 792 | 791 -0.26357171075191976 793 | 792 -0.19888172379147434 794 | 793 -0.17457631566958018 795 | 794 -0.057917378169941365 796 | 795 -0.16278732317212585 797 | 796 -0.046733082635842506 798 | 797 -0.10532261063417343 799 | 798 -0.029490802943670104 800 | 799 -0.05572010240297209 801 | 800 0.02314278946072841 802 | 801 0.09107080419290928 803 | 802 -0.049801097848634915 804 | 803 -0.058725195506718994 805 | 804 -0.061171584624789846 806 | 805 -0.07646320005342579 807 | 806 -0.13682652890726008 808 | 807 0.04348553449508183 809 | 808 0.05795568193737054 810 | 809 0.19211155323361148 811 | 810 0.12167701909417299 812 | 811 0.013947608666779358 813 | 812 0.02445514790288204 814 | 813 -0.02868166125797726 815 | 814 0.1892996414778365 816 | 815 0.19245773375707365 817 | 816 0.2769458825323206 818 | 817 0.2290700747879737 819 | 818 0.17681754979076406 820 | 819 0.15635376722731542 821 | 820 0.1727329440464254 822 | 821 0.2319224657003168 823 | 822 0.19773635777023363 824 | 823 0.11668608033165168 825 | 824 0.008908580414696535 826 | 825 0.0011165797297110138 827 | 826 0.05257156709284798 828 | 827 0.08852964725143994 829 | 828 0.07807310311144144 830 | 829 0.016253300869092126 831 | 830 0.027836844487002965 832 | 831 0.07651559913615176 833 | 832 0.06555045013600412 834 | 833 0.06910856911370342 835 | 834 0.048652322893792434 836 | 835 0.12618202473004475 837 | 836 0.0741257981965601 838 | 837 0.08341142426389407 839 | 838 0.1105688045385948 840 | 839 0.16480895432755563 841 | 840 0.2829576878244029 842 | 841 0.31545276187034166 843 | 842 0.33783667687464075 844 | 843 0.1717316711752585 845 | 844 0.20913485904507798 846 | 845 0.3946559582527162 847 | 846 0.28048937372635396 848 | 847 0.1606836499072041 849 | 848 0.12529643911614163 850 | 849 0.2046791265534286 851 | 850 0.23143875820479987 852 | 851 0.16535370380208 853 | 852 0.1455792170664248 854 | 853 0.224354803719434 855 | 854 0.2624551006784237 856 | 855 0.4548085178676495 857 | 856 0.49983946730889395 858 | 857 0.48167657001824116 859 | 858 0.4888342778408874 860 | 859 0.4085422728743989 861 | 860 0.279688475448992 862 | 861 0.267195769799176 863 | 862 0.2846266867621259 864 | 863 0.13058854583003388 865 | 864 0.07051760938481792 866 | 865 0.030232817281728996 867 | 866 0.05111735177984176 868 | 867 0.0225636713039734 869 | 868 0.06036600810458754 870 | 869 0.063159509454108 871 | 870 0.15227303433280986 872 | 871 -0.016959358466675484 873 | 872 0.1338777948038554 874 | 873 0.2480806764934123 875 | 874 0.22780114659731326 876 | 875 0.2635501212202931 877 | 876 0.2917844651354603 878 | 877 0.1962499521235204 879 | 878 0.19144481283759696 880 | 879 0.24233600767279825 881 | 880 0.24598591518019236 882 | 881 0.31600619276856073 883 | 882 0.2929552233979292 884 | 883 0.27092729003420807 885 | 884 0.17473222388857684 886 | 885 0.12445057702612178 887 | 886 0.07063092803008347 888 | 887 0.21706135182506495 889 | 888 0.21700071633582105 890 | 889 0.10535225958000279 891 | 890 0.13069088855653185 892 | 891 0.10034146700408467 893 | 892 -0.18453147393469124 894 | 893 -0.12289161313737855 895 | 894 -0.2503453423095559 896 | 895 -0.17324901025553854 897 | 896 -0.24243783314273057 898 | 897 -0.3494432512638414 899 | 898 -0.27000817754904316 900 | 899 -0.3774847986688604 901 | 900 -0.37993924711491517 902 | 901 -0.323551356860519 903 | 902 -0.23609529409294233 904 | 903 -0.14544615640398942 905 | 904 -0.13416685673342368 906 | 905 -0.19566575235206335 907 | 906 -0.0029557887794737616 908 | 907 -0.057198528750000185 909 | 908 0.11084433245878461 910 | 909 0.05903265161734385 911 | 910 0.15764509885637212 912 | 911 0.23817748747624687 913 | 912 0.12026165646470169 914 | 913 0.14021109644879218 915 | 914 0.19417526943108993 916 | 915 0.2378461334250729 917 | 916 0.19615714955701496 918 | 917 0.20371783868786653 919 | 918 0.14782398352947967 920 | 919 0.0275783810466307 921 | 920 0.11338164426658928 922 | 921 0.051672151867260235 923 | 922 0.17068317392509375 924 | 923 0.20783543764414925 925 | 924 0.10671369326357476 926 | 925 0.08153447517850591 927 | 926 0.04760638527508968 928 | 927 -0.03553414172109579 929 | 928 0.013147935541413499 930 | 929 -0.031242124660234454 931 | 930 0.11873432403256076 932 | 931 0.18434110332096335 933 | 932 0.08668997718012483 934 | 933 0.07631093252285386 935 | 934 0.04827142197530591 936 | 935 -0.09736142706523239 937 | 936 -0.0038122732695784214 938 | 937 0.08205174742639906 939 | 938 0.15714168200697387 940 | 939 0.10029860662285811 941 | 940 0.1864774834062749 942 | 941 0.14895197087761755 943 | 942 0.21822007395305254 944 | 943 0.35952556991832596 945 | 944 0.3361829022439211 946 | 945 0.1748412220765252 947 | 946 0.1288359921813215 948 | 947 0.17364112093770492 949 | 948 0.2660657029566904 950 | 949 0.13741784947559932 951 | 950 0.1065267177385087 952 | 951 0.1168745673280688 953 | 952 0.1443369597789176 954 | 953 0.21184138807130343 955 | 954 0.10529768018333137 956 | 955 0.0566548654147 957 | 956 0.14170636185728205 958 | 957 0.16284586767274153 959 | 958 0.18691553947581926 960 | 959 0.26950310040802017 961 | 960 0.2519175954410362 962 | 961 0.27424614388339785 963 | 962 0.2185107819225022 964 | 963 0.0756088019060982 965 | 964 -0.048525287959809475 966 | 965 -0.03698390933239167 967 | 966 -0.05124598301881199 968 | 967 -0.10503566988417881 969 | 968 -0.06591081621803574 970 | 969 -0.13944417428597455 971 | 970 -0.11547940288290978 972 | 971 -0.10568849284344341 973 | 972 -0.17071864587420132 974 | 973 -0.36048531053518784 975 | 974 -0.19334931469911912 976 | 975 -0.14551703201585103 977 | 976 -0.37073666334785843 978 | 977 -0.37204157260008963 979 | 978 -0.29939651952764196 980 | 979 -0.2899895297379188 981 | 980 -0.20876086662983628 982 | 981 -0.2754788626392843 983 | 982 -0.23216588074572966 984 | 983 -0.21376282501732077 985 | 984 -0.2088621213421663 986 | 985 -0.2078685103688999 987 | 986 -0.16910329936467342 988 | 987 -0.0682480421962778 989 | 988 -0.10913401999465466 990 | 989 -0.134872220156263 991 | 990 -0.10693414888381064 992 | 991 -0.10705423180201698 993 | 992 -0.061644602310826004 994 | 993 0.009166024138147459 995 | 994 0.12445642298091153 996 | 995 0.10153080733837061 997 | 996 -0.11357909309489936 998 | 997 -0.10848739233637104 999 | 998 -0.06579031468327831 1000 | 999 -0.07603723470289794 1001 | -------------------------------------------------------------------------------- /03_mc_error/case3/langevin_raw.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "langevin_raw.png" 3 | 4 | unset key 5 | set xla "t" 6 | set yla "v" 7 | 8 | p [0:100] "langevin_raw.dat" w linespoints pt 6 lc "blue", 0 lt 1 lc "black" 9 | 10 | set out "langevin_long.png" 11 | 12 | p [0:1000] "langevin_raw.dat" w l lc "blue", 0 lt 1 lc "black" 13 | -------------------------------------------------------------------------------- /03_mc_error/case3/langevin_raw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/case3/langevin_raw.png -------------------------------------------------------------------------------- /03_mc_error/case3/langevin_raw.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | np.random.seed(1) 4 | gamma = 0.1 5 | v = 0.0 6 | 7 | for j in range(1000): 8 | v += np.random.randn()*0.1 9 | v -= gamma * v 10 | print(f"{j} {v}") 11 | -------------------------------------------------------------------------------- /03_mc_error/errorbar/errorbar.dat: -------------------------------------------------------------------------------- 1 | 1.0 1.0896258866117405 0.010370358105698845 2 | 1.1 1.12 0.01 3 | 1.2 1.1010510252355454 0.009635543836247122 4 | 1.3 1.1540144189985315 0.01001637771227524 5 | 1.4 1.1244777758886508 0.00971076955958067 6 | 1.5 1.132748375286808 0.010089684560850385 7 | 1.6 1.1578403344607349 0.009608375478143295 8 | 1.7000000000000002 1.1549181758324187 0.009732335154208125 9 | 1.8 1.181897846874506 0.010090398978622355 10 | 1.9 1.1827521104882515 0.009053783705386925 11 | -------------------------------------------------------------------------------- /03_mc_error/errorbar/errorbar.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "errorbar.png" 3 | 4 | set xra [0.9:2.0] 5 | unset key 6 | 7 | p "errorbar.dat" u 1:2:3 w e pt 6 lc "blue" 8 | -------------------------------------------------------------------------------- /03_mc_error/errorbar/errorbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/errorbar/errorbar.png -------------------------------------------------------------------------------- /03_mc_error/errorbar/errorbar.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | np.random.seed(2) 4 | for i in range(10): 5 | x = 1.0 + i * 0.1 6 | y = np.random.normal(loc=1.0+x*0.1, scale=0.1, size=(100)) 7 | ave = np.average(y) 8 | std = np.std(y)/np.sqrt(len(y)) 9 | print(f"{x} {ave} {std}") 10 | -------------------------------------------------------------------------------- /03_mc_error/histogram/compare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/histogram/compare.png -------------------------------------------------------------------------------- /03_mc_error/histogram/histogram.py: -------------------------------------------------------------------------------- 1 | import itertools 2 | import random 3 | 4 | import numpy as np 5 | from matplotlib import pyplot as plt 6 | 7 | x = np.arange(1, 7) 8 | y = [1.0/6.0] * 6 9 | 10 | plt.bar(x, y) 11 | plt.savefig("population.png") 12 | 13 | plt.cla() 14 | 15 | x = np.arange(1, 7) 16 | p = itertools.product(x, x) 17 | plt.hist([sum(t)/len(t) for t in p]) 18 | plt.savefig("n2.png") 19 | 20 | plt.cla() 21 | 22 | p = itertools.product(x, x, x, x) 23 | plt.hist([sum(t)/len(t) for t in p]) 24 | plt.savefig("n4.png") 25 | 26 | plt.cla() 27 | 28 | n = 20000 29 | a = [] 30 | np.random.seed(1) 31 | for i in range(n): 32 | xi = np.average(np.random.randint(1, 7, 1000)) 33 | a.append(xi) 34 | plt.hist(a, bins=40) 35 | 36 | plt.savefig("n1000.png") 37 | -------------------------------------------------------------------------------- /03_mc_error/histogram/histogram2.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from matplotlib import pyplot as plt 3 | 4 | 5 | def calc(n): 6 | samples = 20000 7 | a = [] 8 | np.random.seed(1) 9 | for _ in range(samples): 10 | xi = np.average(np.random.randint(1, 7, n)) 11 | a.append(xi) 12 | return a 13 | 14 | 15 | n10 = calc(10) 16 | n100 = calc(100) 17 | n1000 = calc(1000) 18 | plt.hist(n10, bins=40, label="N=10") 19 | plt.hist(n100, bins=40, label="N=100") 20 | plt.hist(n1000, bins=40, label="N=1000") 21 | plt.legend() 22 | plt.savefig("compare.png") 23 | -------------------------------------------------------------------------------- /03_mc_error/histogram/n1000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/histogram/n1000.png -------------------------------------------------------------------------------- /03_mc_error/histogram/n2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/histogram/n2.png -------------------------------------------------------------------------------- /03_mc_error/histogram/n4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/histogram/n4.png -------------------------------------------------------------------------------- /03_mc_error/histogram/population.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/histogram/population.png -------------------------------------------------------------------------------- /03_mc_error/simulation03.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/simulation03.pdf -------------------------------------------------------------------------------- /03_mc_error/simulation03.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/03_mc_error/simulation03.pptx -------------------------------------------------------------------------------- /04_mc_advanced/README.md: -------------------------------------------------------------------------------- 1 | # モンテカルロ法(3) 発展的なアルゴリズム 2 | 3 | * 分配関数とモンテカルロ法 4 | * クラスターアルゴリズム 5 | * improved estimator 6 | -------------------------------------------------------------------------------- /04_mc_advanced/improved_estimator/L064.dat: -------------------------------------------------------------------------------- 1 | 0.1 1 +- 0 1 +- 0 1 +- 0 1 +- 0 1 +- 0 1 +- 0 2 | 0.49 1 +- 0 1 +- 0 1 +- 0 1 +- 0 1 +- 0 1 +- 0 3 | 0.88 0.999649 +- 5.97099e-05 0.999629 +- 4.65967e-05 0.999298 +- 0.000119325 0.999259 +- 9.31087e-05 1 +- 0.000146267 1 +- 2.72955e-08 4 | 1.27 0.990514 +- 0.000374794 0.990689 +- 0.000265956 0.981133 +- 0.000741955 0.981477 +- 0.000526631 1.00001 +- 0.000926415 1.00001 +- 2.66322e-07 5 | 1.66 0.949285 +- 0.00108967 0.949188 +- 0.000844102 0.90126 +- 0.00206777 0.901068 +- 0.00160044 1.00013 +- 0.0028109 1.00004 +- 1.19108e-06 6 | 2.05 0.794337 +- 0.00314851 0.794772 +- 0.00273267 0.631952 +- 0.00492438 0.632728 +- 0.00429156 1.00156 +- 0.009614 1.00054 +- 4.47345e-05 7 | 2.44 0.0266207 +- 0.00402795 0.0248816 +- 0.00138808 0.00231487 +- 0.00078262 0.00167742 +- 0.000176872 3.26653 +- 1.30698 2.49394 +- 0.0339567 8 | 2.83 0.00384394 +- 0.000493738 0.00410744 +- 6.85046e-05 3.89098e-05 +- 9.19859e-06 4.99641e-05 +- 1.60024e-06 2.63333 +- 0.785094 2.90027 +- 0.00694637 9 | 3.22 0.0019429 +- 0.000263039 0.00199581 +- 2.0107e-05 1.06246e-05 +- 2.9861e-06 1.19048e-05 +- 2.36697e-07 2.81457 +- 0.957161 2.96126 +- 0.00168094 10 | 3.61 0.0014625 +- 0.000195793 0.00135726 +- 1.02691e-05 5.93406e-06 +- 1.21095e-06 5.51401e-06 +- 8.32176e-08 2.77436 +- 0.772298 2.97738 +- 0.000957549 11 | 4 0.000999498 +- 0.000115058 0.00105281 +- 6.09465e-06 2.30959e-06 +- 4.2976e-07 3.3176e-06 +- 3.81753e-08 2.31191 +- 0.571597 2.98374 +- 0.000660203 12 | -------------------------------------------------------------------------------- /04_mc_advanced/improved_estimator/binder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/04_mc_advanced/improved_estimator/binder.png -------------------------------------------------------------------------------- /04_mc_advanced/improved_estimator/graph.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "m2.png" 3 | set xlabel "Temperature" 4 | set ylabel "m^2" 5 | 6 | p "L064.dat" u 1:2:4 w e pt 6 lc "blue" t "Normal"\ 7 | , "L064.dat" u 1:5:7 w e pt 7 lc "red "t "Improved Estimator"\ 8 | , "L064.dat" u 1:2 w l lc "blue" t ""\ 9 | , "L064.dat" u 1:5 w l lc "red" t "" 10 | 11 | 12 | set out "m4.png" 13 | set ylabel "m^4" 14 | 15 | p "L064.dat" u 1:8:10 w e pt 6 lc "blue" t "Normal"\ 16 | , "L064.dat" u 1:11:13 w e pt 7 lc "red" t "Improved Estimator"\ 17 | , "L064.dat" u 1:8 w l lc "blue" t ""\ 18 | , "L064.dat" u 1:11 w l lc "red" t "" 19 | 20 | set out "binder.png" 21 | set ylabel "U" 22 | 23 | p "L064.dat" u 1:14:16 w e pt 6 lc "blue" t "Normal"\ 24 | , "L064.dat" u 1:17:19 w e pt 7 lc "red " t "Improved Estimator"\ 25 | , "L064.dat" u 1:14 w l lc "blue" t ""\ 26 | , "L064.dat" u 1:17 w l lc "red" t "" 27 | -------------------------------------------------------------------------------- /04_mc_advanced/improved_estimator/ising_sw.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | const int L = 64; 8 | const int N = L * L; 9 | std::vector spin(N), newspin(N); 10 | std::vector> neighbor(N); 11 | std::vector parent(N); 12 | std::mt19937 mt; 13 | 14 | int find(int i) { 15 | while (i != parent[i]) { 16 | i = parent[i]; 17 | } 18 | parent[i] = i; 19 | return i; 20 | } 21 | 22 | void unite(int i, int j) { 23 | i = find(i); 24 | j = find(j); 25 | parent[j] = i; 26 | } 27 | 28 | int pos2index(int ix, int iy) { 29 | ix = (ix + L) % L; 30 | iy = (iy + L) % L; 31 | return ix + iy * L; 32 | } 33 | 34 | void init_neighbors() { 35 | for (int iy = 0; iy < L; iy++) { 36 | for (int ix = 0; ix < L; ix++) { 37 | int i = pos2index(ix, iy); 38 | neighbor[i][0] = pos2index(ix + 1, iy); 39 | neighbor[i][1] = pos2index(ix, iy + 1); 40 | neighbor[i][2] = pos2index(ix - 1, iy); 41 | neighbor[i][3] = pos2index(ix, iy - 1); 42 | } 43 | } 44 | } 45 | 46 | void connect(int i, int j, double p) { 47 | std::uniform_real_distribution<> ud(0.0, 1.0); 48 | if (spin[i] != spin[j]) return; 49 | if (ud(mt) > p) return; 50 | unite(i, j); 51 | } 52 | 53 | double magnetization(void) { 54 | double m = std::accumulate(spin.begin(), spin.end(), 0.0); 55 | m /= static_cast(N); 56 | return m * m; 57 | } 58 | 59 | void magnetization_ie(double &m2, double &m4, double &u) { 60 | std::vector nc(N, 0); 61 | for (int i = 0; i < N; i++) { 62 | nc[find(i)]++; 63 | } 64 | m2 = 0.0; 65 | m4 = 0.0; 66 | for (int i = 0; i < N; i++) { 67 | double nc2_i = nc[i] * nc[i]; 68 | m2 += nc2_i; 69 | m4 += nc2_i * nc2_i; 70 | for (int j = i + 1; j < N; j++) { 71 | double nc2_j = nc[j] * nc[j]; 72 | m4 += 6 * nc2_i * nc2_j; 73 | } 74 | } 75 | double n = static_cast(N); 76 | m2 /= n * n; 77 | m4 /= n * n * n * n; 78 | u = m4 / m2 / m2; 79 | } 80 | 81 | void mc_step(double beta) { 82 | std::uniform_int_distribution<> ud(0, 1); 83 | for (int i = 0; i < N; i++) { 84 | parent[i] = i; 85 | newspin[i] = ud(mt) * 2 - 1; 86 | } 87 | const double p = 1.0 - exp(-2.0 * beta); 88 | for (int i = 0; i < N; i++) { 89 | connect(i, neighbor[i][0], p); 90 | connect(i, neighbor[i][1], p); 91 | } 92 | for (int i = 0; i < N; i++) { 93 | spin[i] = newspin[find(i)]; 94 | } 95 | } 96 | 97 | void mc(double t) { 98 | const double beta = 1.0 / t; 99 | const int ThermalizeLoop = 100; 100 | const int ObserveLoop = 100; 101 | std::fill(spin.begin(), spin.end(), 1); 102 | for (int i = 0; i < ThermalizeLoop; i++) { 103 | mc_step(beta); 104 | } 105 | stat::sdouble sm2; 106 | stat::sdouble sm4; 107 | stat::sdouble sm2_ie; 108 | stat::sdouble sm4_ie; 109 | stat::sdouble sU_ie; 110 | for (int i = 0; i < ObserveLoop; i++) { 111 | mc_step(beta); 112 | double m2 = magnetization(); 113 | sm2 << m2; 114 | sm4 << m2 * m2; 115 | double m2_ie, m4_ie, U_ie; 116 | magnetization_ie(m2_ie, m4_ie, U_ie); 117 | sm2_ie << m2_ie; 118 | sm4_ie << m4_ie; 119 | sU_ie << U_ie; 120 | } 121 | std::cout << t << " "; 122 | std::cout << sm2 << " "; 123 | std::cout << sm2_ie << " "; 124 | std::cout << sm4 << " "; 125 | std::cout << sm4_ie << " "; 126 | std::cout << sm4 / sm2 / sm2 << " "; 127 | std::cout << sU_ie << " "; 128 | std::cout << std::endl; 129 | } 130 | 131 | int main(void) { 132 | init_neighbors(); 133 | double ts = 0.1; 134 | double te = 4.0; 135 | const int ObservePoints = 10; 136 | for (int i = 0; i <= ObservePoints; i++) { 137 | double t = ts + (te - ts) * i / ObservePoints; 138 | mc(t); 139 | } 140 | } -------------------------------------------------------------------------------- /04_mc_advanced/improved_estimator/m2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/04_mc_advanced/improved_estimator/m2.png -------------------------------------------------------------------------------- /04_mc_advanced/improved_estimator/m4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/04_mc_advanced/improved_estimator/m4.png -------------------------------------------------------------------------------- /04_mc_advanced/improved_estimator/makefile: -------------------------------------------------------------------------------- 1 | all: a.out 2 | SRC=$(shell ls *.cpp) 3 | OBJ=$(SRC:.cpp=.o) 4 | 5 | CC=g++ 6 | CPPFLAGS=-O3 -march=native -Wall -Wextra -std=c++11 -I./sdouble 7 | 8 | -include makefile.opt 9 | 10 | a.out: $(OBJ) 11 | $(CC) $(CPPFLAGS) $^ -o $@ 12 | 13 | %.o: %.cpp 14 | $(CC) $(CPPFLAGS) -c $< -o $@ 15 | 16 | clean: 17 | rm -f a.out $(OBJ) 18 | -------------------------------------------------------------------------------- /04_mc_advanced/simulation04.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/04_mc_advanced/simulation04.pdf -------------------------------------------------------------------------------- /04_mc_advanced/simulation04.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/04_mc_advanced/simulation04.pptx -------------------------------------------------------------------------------- /04_mc_advanced/simulation04_0511.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/04_mc_advanced/simulation04_0511.pptx -------------------------------------------------------------------------------- /04_mc_advanced/simulation04_old.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/04_mc_advanced/simulation04_old.pptx -------------------------------------------------------------------------------- /05_md_basic/README.md: -------------------------------------------------------------------------------- 1 | # 分子動力学法(1) 理論的背景と数値積分法 2 | 3 | * 分子動力学法の種類 4 | * 位相空間と流れ 5 | * 時間積分 6 | 7 | ## 位相空間と流れ 8 | 9 | 分子動力学法は、ニュートンの運動方程式を数値的に解くことで、何か新たな知見を得る手法だ。ニュートンの運動方程式は$F=ma$、つまり、力は加速度と質量に比例する、というものだ。このニュートンの運動方程式について詳しく見てみよう。 10 | 11 | まず、加速度$a$とは、速度$v$の時間変化率のことだ。したがって、 12 | 13 | $$ 14 | a = \frac{dv}{dt} 15 | $$ 16 | 17 | また、速度とは、位置の時間変化率のことだ。 18 | 19 | $$ 20 | v = \frac{dr}{dt} 21 | $$ 22 | 23 | したがって、ニュートンの運動方程式とは、位置に関する二階の常微分方程式となる。 24 | 25 | $$ 26 | m \frac{d^2 r}{dt^2} = F 27 | $$ 28 | 29 | 一般に、高階微分方程式は扱いづらいので、一階の微分方程式の連立方程式に落とす。 30 | 31 | $$ 32 | \begin{aligned} 33 | \frac{dv}{dt} &= \frac{F}{m} \\ 34 | \frac{dr}{dt} &= v 35 | \end{aligned} 36 | $$ 37 | 38 | さて、位置の関数$V(r)$があり、力がその微分で書ける、すなわち$F=-V'(r)$であるとしよう。このような場合、力をポテンシャル力と呼び、$V(r)$をポテンシャルと呼ぶ。すると、運動方程式は以下のようになる。 39 | 40 | $$ 41 | \begin{aligned} 42 | \frac{dv}{dt} &= -\frac{V'(r)}{m}\\ 43 | \frac{dr}{dt} &= v 44 | \end{aligned} 45 | $$ 46 | 47 | この式をよく見ると、変数$(v,r)$の時間微分が、変数$(v,r)$自身で表現されている。一般的に書くと以下のようになる。 48 | 49 | $$ 50 | \begin{aligned} 51 | \frac{dv}{dt} &= f_v(r,v)\\ 52 | \frac{dr}{dt} &= f_r(r,v) 53 | \end{aligned} 54 | $$ 55 | 56 | このように系の変数の時間微分が系の変数自身で表現されている時、この系を **力学系(dynamical system)** と呼ぶ。運動方程式は力学系の一種である。 57 | 58 | 例として、バネで繋がれた質点の運動を考えよう。面倒なのでばね定数も質量も1としよう。すると、ポテンシャルは$V(x) = x^2/2$なので、力は$-V'(x)= -x$だ。 59 | 60 | 運動方程式は 61 | 62 | $$ 63 | \begin{aligned} 64 | \frac{dr}{dt} &= v\\ 65 | \frac{dv}{dt} &= -r 66 | \end{aligned} 67 | $$ 68 | 69 | となる。 70 | 71 | この系は、速度$v$と位置$r$のを指定すると状態が定まり、そこから過去、及び未来の軌跡が完全に定まる。このような空間$(v,r)$を **位相空間(phase space)**と呼ぶ。一方、運動方程式として$r$の二階微分方程式を考える。 72 | 73 | $$ 74 | \frac{d^2r}{dt^2} = -r 75 | $$ 76 | 77 | この系では、独立変数は$x$だけだが、$x$を指定するだけでは運動が定まらない。例えば$t=0$で$x=0$であったとして、この物体が止まっているのか、動いているのかは$\dot{x}$の情報が無いとわからない。そして、$(x, \dot{x})$の情報がわかれば、二階微分以上の情報は不要だ。このように、与えられた運動方程式の運動を過不足なく表現できる空間が位相空間である。この系の状態は$(x,v)$、すなわち位相空間上の点で表現され、時間発展はこの点の軌跡で表現される。 78 | 79 | さて、ある時刻において位置が$0$、速度が$v$であるとしよう。これは、質点がバネの自然長の位置にいて、初速を与えられた状況に対応する。この瞬間はバネの伸びはゼロであるから、位置は増加、速度は変化しない。したがって、$(\dot{x}, \dot{v}) = (0, v)$だ。 80 | 81 | 逆に、バネが伸び切った状態を考えよう。速度はゼロで、位置が$x$とする。質点は停止しているので位置は動かない$(\dot{x}=0)$。一方、質点はバネに引っ張られているため、速度はマイナスの方向に加速される$(\dot{v} = -x)$。以上から、$(\dot{x},\dot{v}) = (-x, 0)$となる。 82 | 83 | こうして位相空間の各点において時間微分$(\dot{x},\dot{v})$を記入していくと、位相空間にベクトル場が定義される。このベクトル場はこのベクトルは「この点が次にどこに向かって動くべきか」を表現している。すなわち運動方程式は位相空間$(x,v)$に、ベクトル場($\dot{x},\dot(v))$を関連付けるものであり、このベクトル場は位相空間に速度場を定義する。特に、調和振動子の場合は、原点を中心として反時計回りに回転する流れを引き起こす。この世界において、どこかの点にトレーサーを置くと、あとは流れ場に沿って動き始める。このトレーサーの軌跡が運動方程式の解だ。すなわち、運動方程式の解とは、位相空間における回転運動であるとみなすことができる。この事実は後ほどまた触れる。 84 | 85 | ## 極小作用の原理 86 | 87 | 力学系は、自由度の数だけ時間微分を与える必要がある。例えば$(x,y,z)$の三次元空間の力学系を考えるなら、この世界の運動を定めるためには 88 | 89 | $$ 90 | \begin{aligned} 91 | \dot{x} &= f_x(x,y,z)\\ 92 | \dot{y} &= f_y(x,y,z)\\ 93 | \dot{z} &= f_z(x,y,z)\\ 94 | \end{aligned} 95 | $$ 96 | 97 | と、$(x,y,z)$の関数を三本決めなくてはならない。三次元空間中の$N$個の質点の運動を表現するためには、自由度が$6N$個であるから、$6N$個の引数を持つ関数を$6N$個定める必要がある。しかし、ラグランジアンという$6N$個の引数を持つただ一つの関数を使うことで、$6N$個の微分方程式を得ることができる。この仕組みが変分原理である。 98 | 99 | ### ラグランジアンと作用積分 100 | 101 | ### ルジャンドル変換とハミルトニアン 102 | 103 | ## 位相空間の流れ再び 104 | -------------------------------------------------------------------------------- /05_md_basic/integration/euler.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | unset key 3 | set out "euler.png" 4 | set size square 5 | set xla "p" 6 | set yla "q" 7 | p "euler.dat" u 2:3 w linespoints pt 6 8 | -------------------------------------------------------------------------------- /05_md_basic/integration/euler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/05_md_basic/integration/euler.png -------------------------------------------------------------------------------- /05_md_basic/integration/euler.py: -------------------------------------------------------------------------------- 1 | t = 0 2 | h = 0.05 3 | p = 1.0 4 | q = 0.0 5 | T = 1000 6 | 7 | for _ in range(T): 8 | print(f"{t} {p} {q}") 9 | t = t + h 10 | dp = - q * h 11 | dq = p * h 12 | p += dp 13 | q += dq 14 | -------------------------------------------------------------------------------- /05_md_basic/integration/vv.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | unset key 3 | set out "vv.png" 4 | set size square 5 | set xla "p" 6 | set yla "q" 7 | set xrange [-1.1:1.1] 8 | set yrange [-1.1:1.1] 9 | p "vv.dat" u 2:3 w linespoints pt 6 10 | -------------------------------------------------------------------------------- /05_md_basic/integration/vv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/05_md_basic/integration/vv.png -------------------------------------------------------------------------------- /05_md_basic/integration/vv.py: -------------------------------------------------------------------------------- 1 | t = 0 2 | h = 0.05 3 | p = 1.0 4 | q = 0.0 5 | T = 1000 6 | 7 | 8 | for _ in range(T): 9 | print(f"{t} {p} {q}") 10 | t = t + h 11 | ft = -q 12 | q += p * h - q * h**2 * 0.5 13 | ft2 = -q 14 | p += (ft2 + ft) * h * 0.5 15 | -------------------------------------------------------------------------------- /05_md_basic/simulation05.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/05_md_basic/simulation05.pdf -------------------------------------------------------------------------------- /05_md_basic/simulation05.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/05_md_basic/simulation05.pptx -------------------------------------------------------------------------------- /06_md_observable/README.md: -------------------------------------------------------------------------------- 1 | # 分子動力学法(2) 温度制御と圧力制御 2 | 3 | ## 温度とは何か 4 | 5 | 我々は普段「温度」という言葉を何気なく使っている。気温が高ければ「今日は暑いな。26~27度くらいかな」と思うし、お風呂にはいって「ぬるいな、40度くらいかな」と思うであろう。また、日に照らされた鉄をうっかり触って「熱い!」と思うこともあるだろう。この時、我々は、気体、液体、固体の全てに共通して「温度」という量があることを無意識に仮定している。しかし、よく考えてみると温度という概念は不思議だ。我々はどうして温度というものがあると信じられるのか。また、どうやってそれを数値化しているのであろうか。 6 | 7 | まず、小学校の理科で習ったガラス温度計は、ガラス管の中に色付きの液体が入っており、温度による膨張により体積変化するのを読み取ることで現在の温度を調べている。また、体温などを測るデジタル体温計は、サーミスタという温度変化にたいして電気抵抗変化が大きい物質が使われている。外で見かけるアナログ形式の気温計は、バイメタル方式であることが多い。これは温度により膨張率の異なる金属を貼り合わせることで、温度によって「反り」が変わることから温度を読み取るものだ。また、異なる金属の線を接続して両端に温度差を与えた時に電圧が生じることを利用した熱電対という温度計も、応答が早いことから実験用の温度計としてはよく用いられる。これらは温度変化に対して、物質の体積、電気抵抗、起電力の変化が起きることを利用して温度を数値化している。これらは相対的な温度変化はわかっても、温度の値はわからないため、基準となる温度(たとえば摂氏0度や摂氏100度)を用いて温度を較正することで温度計として使えるようにしている。 8 | 9 | では、数値シミュレーションにおいて温度はどうやって測れば良いのだろうか?基準となる温度などを作ることができるのだろうか?温度計を作ったとして、温度の較正はできるのだろうか? 10 | 11 | 以下では、分子動力学シミュレーションにおける物理量、特に温度と圧力の定義について触れ、さらにその制御法について紹介する。 12 | 13 | ## 熱力学量の示量性と示強性 14 | 15 | ## 数値計算における変数と観測量 16 | 17 | ## 温度 18 | 19 | ### 温度の定義 20 | 21 | ## 圧力 22 | 23 | ### 圧力の定義 24 | 25 | ### Irvin-Kirkwoodゲージ 26 | 27 | -------------------------------------------------------------------------------- /06_md_observable/simulation06.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/06_md_observable/simulation06.pdf -------------------------------------------------------------------------------- /06_md_observable/simulation06.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/06_md_observable/simulation06.pptx -------------------------------------------------------------------------------- /07_md_implementation/bf/bf.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | N = 100 4 | 5 | r = np.array(N) 6 | v = np.array(N) 7 | 8 | dt = 0.01 9 | 10 | for i in range(N): 11 | r[i] = r[i] + v[i] * dt 12 | -------------------------------------------------------------------------------- /07_md_implementation/lj/lj.plt: -------------------------------------------------------------------------------- 1 | set term pngcairo 2 | set out "lj.png" 3 | unset key 4 | 5 | p [0.9:3.0] x**-12 - x**-6 lc "blue",0 lt 0 lc "black" 6 | -------------------------------------------------------------------------------- /07_md_implementation/lj/lj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/07_md_implementation/lj/lj.png -------------------------------------------------------------------------------- /07_md_implementation/simulation07.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/07_md_implementation/simulation07.pdf -------------------------------------------------------------------------------- /07_md_implementation/simulation07.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kaityo256/simulation_engineering/795296d50d78860a6c76a923ff43f0bfb3a3b710/07_md_implementation/simulation07.pptx -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public 379 | licenses. Notwithstanding, Creative Commons may elect to apply one of 380 | its public licenses to material it publishes and in those instances 381 | will be considered the “Licensor.” The text of the Creative Commons 382 | public licenses is dedicated to the public domain under the CC0 Public 383 | Domain Dedication. Except for the limited purpose of indicating that 384 | material is shared under a Creative Commons public license or as 385 | otherwise permitted by the Creative Commons policies published at 386 | creativecommons.org/policies, Creative Commons does not authorize the 387 | use of the trademark "Creative Commons" or any other trademark or logo 388 | of Creative Commons without its prior written consent including, 389 | without limitation, in connection with any unauthorized modifications 390 | to any of its public licenses or any other arrangements, 391 | understandings, or agreements concerning use of licensed material. For 392 | the avoidance of doubt, this paragraph does not form part of the 393 | public licenses. 394 | 395 | Creative Commons may be contacted at creativecommons.org. 396 | 397 | 398 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 数値シミュレーションの基礎 2 | 3 | これは、理工学研究科の修士課程の学生向けの講義ノートである。 4 | 5 | ## [はじめに](00_preface/README.md) 6 | 7 | ## [数値計算の基礎](01_basic/README.md) 8 | 9 | * [講義スライド](https://speakerdeck.com/kaityo256/simulation-01) 10 | * なぜ数値計算が必要なのか? 11 | * 数値実験とはどのような実験か? 12 | * 変数とスケーリングについて 13 | 14 | ## [モンテカルロ法(1) 基礎的な話題](02_mc_basic/README.md) 15 | 16 | * [講義スライド](https://speakerdeck.com/kaityo256/simulation-02) 17 | * 乱数とはなにか 18 | * モンテカルロ法 19 | * マルコフ連鎖モンテカルロ法とメトロポリス法 20 | 21 | ## [モンテカルロ法(2) 誤差解析と不偏推定量](03_mc_error/README.md) 22 | 23 | * [講義スライド](https://speakerdeck.com/kaityo256/simulation-03) 24 | * エラーバーの性質 25 | * 統計誤差と系統誤差 26 | * Jackknife法 27 | 28 | ## [モンテカルロ法(3) 発展的なアルゴリズム](04_mc_advanced/README.md) 29 | 30 | * [講義スライド](https://speakerdeck.com/kaityo256/simulation-04) 31 | * 分配関数とモンテカルロ法 32 | * クラスターアルゴリズム 33 | * improved estimator 34 | 35 | ## 分子動力学法(1) 理論的背景と数値積分法 36 | 37 | * [講義スライド](https://speakerdeck.com/kaityo256/simulation-05) 38 | * 分子動力学法の種類 39 | * 位相空間と流れ 40 | * シンプレクティック積分 41 | 42 | ## 分子動力学法(2) 温度制御と圧力制御 43 | 44 | * [講義スライド](https://speakerdeck.com/kaityo256/simulation-06) 45 | * 分子動力学法における物理量 46 | * 圧力制御 47 | * 温度制御 48 | 49 | ## 分子動力学法(3) 実装と高速化の詳細 50 | 51 | * [講義スライド](https://speakerdeck.com/kaityo256/simulation-07) 52 | * 分子動力学法の概要 53 | * 実装の基礎 54 | * メモリアクセスを意識した高速化 55 | * SIMD化 56 | --------------------------------------------------------------------------------