---
# System prepended metadata

title: 進捗報告 2020/11/16

---


# 進捗報告 2020/11/16
## 前回
### シミュレーション条件

粒子数 $\rm{N} = 36$
ステップ数 $\rm{step}=1000$

溶液温度 $T \simeq 300$ （ $[K]$ ではない。大きさの目安）
溶液濃度 $C \simeq 0.3$ (面積あたりの粒子数)
質量 $M = \rm{arm\_num} \times \rm{arm\_len} = 2.1, 2.8, 4.2$

熱運動:各粒子は $\mathcal{N} (0,a\sqrt{T/M})$ の正規分布でx,y方向に移動する。
熱運動の比例定数 $a = 0.01$

分子間力:「結合粒子間距離 $d$ 」および「1未満の粒子間距離 $d$ 」について、$d$ を $1$ に近づける。先述の粒子が近づく方向に $(d-1) \times b/M$ だけ移動する。
分子間力の比例定数 $b = 0.6$

評価値:最大の液滴に結合するモチーフの数

### 問題点
溶液濃度が評価値に与える影響が大きすぎて、それ以外のパラメータが比較できなかった。
* $C < 0.2:$ 評価値は $\rm{N}/10$ 未満
* $C > 0.3:$ 評価値は理論値 $\rm{N}$ （全粒子が結合）


### 原因
#### 溶液濃度が小さい時に結合が発生しない問題
* ステップ数不足
  * 溶液濃度が低いと粒子が散らばっているため、結合が起こるには $\sqrt{M/T}$ に比例するステップ数が必要である。
  * 今回は温度が実質9倍にしたが、評価値が安定するのは1000ステップ程度から。前回は安定までに3000ステップ程度必要だったと思う。

#### 溶液濃度0.3を超えたあたりから評価値が理論値（N）に到達する
* 濃度が高い
  * 前述の通り。この濃度ではモチーフが孤立する方が難しい。

* 熱運動が小さい
  * そもそも、分離もあまり起こらなかったと思う。

### その他
$C > 0.3$ において、評価値は理論値に到達し、比較不能になってしまう。
当初は解決のために評価基準を増やすつもりだった。特に、ゲル的なモチーフを低く評価するような評価基準（例：粒子の分離した回数）を新たに設けることを考えていた。
しかし、シミュレーション条件を変更すると、評価値が理論値に到達しなくなり、比較可能になった。問題が解決したため、評価基準の追加は見送った。

## 今回
パラメータの設定を見直した。
### シミュレーション条件
粒子数 $\rm{N} = 100$
ステップ数 $1000<\rm{step}<10000$

溶液温度 $T \simeq 300$
溶液濃度 $C = 0.05$
質量 $M = \rm{arm\_num} \times \rm{arm\_len} = 2.1, 2.8, 4.2$

熱運動の比例定数 $a = 0.03$
分子間力の比例定数 $b = 1.1$

### 変更した理由
* 粒子数 $\rm{N} = 36 → 100$
  * プログラムの計算量は$O(\rm{N^2})$だが、$\rm{N} < 144$ では実行時間 $t_\rm{exe}\propto\rm{N}$だった。特に $\rm{N} \simeq 100$ が効率的だった。$(t_{\rm{exe,\ N}=36}:t_{\rm{exe,\ N}=100}=1:2)$

* 溶液濃度 $C \simeq 0.3 → C = 0.05$
  * DNA液滴の形成時、モチーフは水中に偏在している。液滴周辺に観測範囲を絞ったシミュレーションだとしても、$C > 0.3$ は高いように感じた。一時的に $C = 0.05$ で固定した。
  * 実験における濃度、またはシミュレーションにおける濃度について、データや知見があれば教えてください。 

* 熱運動の比例係数 $a = 0.01 → 0.03$
  * $300<T<400$ で評価値が大きく下がるように調整した。

* 分子間力の比例係数 $b = 0.6 → 0.52 →1.1$
  * モチーフの分散温度 $T_d$ と$M (\propto \rm{arm\_num})$ が佐藤さんの論文のデータにしたがうとき、モチーフの腕の数によらず粒子間距離の分布が一定になると仮定し、数式的に $b$ の値を求めた。（仮定の正当性は不明なので、結局いろいろ値を試している。）
  * 距離 $1$ で結合する2粒子の $1\rm{step}$ 後の粒子間距離の分布は
    $\mathcal{N}(1,2a\sqrt{T/M}\times(1-2b/M))$
  * $\rm{arm\_flex}$ を実装にすると最適な $b$ の値はまた変わりそう。


## 進捗
* シミュレーション条件の変更
  * 前回の問題点が解決した。

* チューニング

  * $T=300$ が $300[K]$ に近づいた。
  * パラメータの値に対する感覚が良くなった。

* 高速化

  * 結合する粒子を探索するアルゴリズム $O(\rm{N^3})→O(\rm{N^2})$
  * 不要な機能を除外
  * 1000ステップあたりの実行時間↓

|  | 前回 | 今回 |
| :--------: | --------: | --------: |
| $\rm{N=36}$ | $1.0$ | $0.47$ |
| $\rm{N=100}$ | $4.0$ | $0.88$ |


* $\rm{arm\_flex}$ の実装方法を考えた

  * 粒子の結合（最大$\rm{arm\_num}$個）ごとに配位角度（最大$\rm{arm\_num}-1$個）を計算し、適切な角度に向かうような復元力を粒子に与える。
  * 計算量は$O(\rm{N\times arm\_num^2})$
    * numpyの行列演算があまり利用できずに計算時間がかかりそう。
    