拘束条件の入れ方についての数式による説明
Connectorは「硬いバネ」として実装していたけど、それはあまりよくないので、拘束条件として入れてみた。 考え方は以下の通り。
作用に、$ {1\over 2}\sum_{i,j}\lambda_{ij}\left(|\vec x_i-\vec x_j|^2-(L_{ij})^2\right)のようなラグランジュ未定定数項がついているとする
運動方程式
$ m_i\vec a_i=\sum_k\lambda_{ik}(\vec x_i-\vec x_k)+\vec F_i
から、
$ \vec a_i-\vec a_j={1\over m_i}\sum_k\lambda_{ik}(\vec x_i-\vec x_k)-{1\over m_j}\sum_k\lambda_{jk}(\vec x_j-\vec x_k)+{\vec F_i\over m_i}-{\vec F_j\over m_j}
という式が出る。
拘束から、
$ |\vec x_i-\vec x_j|^2=(L_{ij})^2
$ (\vec x_i-\vec x_j)\cdot(\vec v_i-\vec v_j)=0
$ (\vec x_i-\vec x_j)\cdot(\vec a_i-\vec a_j)+|\vec v_i-\vec v_j|^2=0
となるので、
$ (\vec x_i-\vec x_j)\cdot\left({1\over m_i}\sum_k\lambda_{ik}(\vec x_i-\vec x_k)-{1\over m_j}\sum_k\lambda_{jk}(\vec x_j-\vec x_k)+{\vec F_i\over m_i}-{\vec F_j\over m_j} \right)+|\vec v_i-\vec v_j|^2=0
という式を解くことで$ \lambda_{ij}が計算できる。
$ \lambda_{ij}が一つしかない場合(実際には、$ \lambda_{ji}=-\lambda_{ij}で二つある)ならこれは簡単になって、
$ (\vec x_i-\vec x_j)\cdot\left(\left({1\over m_i}+{1\over m_j}\right)\lambda_{ij}(\vec x_i-\vec x_j)+{\vec F_i\over m_i}-{\vec F_j\over m_j} \right)+|\vec v_i-\vec v_j|^2=0
$ \left({1\over m_i}+{1\over m_j}\right)\lambda_{ij}\overbrace{(L_{ij})^2}^{|\vec x_i-\vec x_j|^2}+(\vec x_i-\vec x_j)\cdot\left({\vec F_i\over m_i}-{\vec F_j\over m_j} \right)+|\vec v_i-\vec v_j|^2=0
より、
$ \lambda_{ij}=-{m_im_j\over (m_i+m_j)(L_{ij})^2}\left((\vec x_i-\vec x_j)\cdot\left({\vec F_i\over m_i}-{\vec F_j\over m_j} \right)+|\vec v_i-\vec v_j|^2\right)
と求められる。
$ \lambda_{ij}が二つ(従属なものを含めて四つ)あり、それが$ \lambda_{12},\lambda_{23}と書ける場合、
$ m_1\vec a_1=\lambda_{12}(\vec x_1-\vec x_2)+\vec F_1
$ m_1\vec a_2=-\lambda_{12}(\vec x_1-\vec x_2)+\lambda_{23}(\vec x_2-\vec x_3)+\vec F_2
$ m_1\vec a_3=-\lambda_{23}(\vec x_2-\vec x_3)+\vec F_3
が運動方程式。拘束条件は
$ (\vec x_1-\vec x_2)\cdot\left({1\over m_1}\lambda_{12}(\vec x_1-\vec x_2)-{1\over m_2}\lambda_{21}(\vec x_2-\vec x_1)-{1\over m_2}\lambda_{23}(\vec x_2-\vec x_3)+{\vec F_1\over m_1}-{\vec F_2\over m_2}\right)+|\vec v_1-\vec v_2|^2=0
$ (\vec x_2-\vec x_3)\cdot\left({1\over m_2}\lambda_{21}(\vec x_2-\vec x_1)+{1\over m_2}\lambda_{23}(\vec x_2-\vec x_3)-{1\over m_3}\lambda_{32}(\vec x_3-\vec x_2)+{\vec F_2\over m_2}-{\vec F_3\over m_3}\right)+|\vec v_2-\vec v_3|^2=0
となる。これから$ \lambda_{12},\lambda_{23}を求める。
$ \left({1\over m_1}+{1\over m_2}\right) |\vec x_1-\vec x_2|^2 \lambda_{12}-{1\over m_2}(\vec x_1-\vec x_2)\cdot(\vec x_2-\vec x_3)\lambda_{23}+(\vec x_1-\vec x_2)\cdot\left({\vec F_1\over m_1}-{\vec F_2\over m_2}\right)+|\vec v_1-\vec v_2|^2=0
$ {1\over m_2}(\vec x_1-\vec x_2)\cdot(\vec x_2-\vec x_3)\lambda_{12}+\left({1\over m_2}+{1\over m_3}\right)|\vec x_2-\vec x_3|^2\lambda_{23}+(\vec x_2-\vec x_3)\cdot\left({\vec F_2\over m_2}-{\vec F_3\over m_3}\right)+|\vec v_2-\vec v_3|^2=0
をまとめて、
$ \left(\begin{array}{cc}\left({1\over m_1}+{1\over m_2}\right) |\vec x_1-\vec x_2|^2&-{1\over m_2}(\vec x_1-\vec x_2)\cdot(\vec x_2-\vec x_3)\\{1\over m_2}(\vec x_1-\vec x_2)\cdot(\vec x_2-\vec x_3)&\left({1\over m_2}+{1\over m_3}\right)|\vec x_2-\vec x_3|^2\end{array}\right)\left(\begin{array}{c}\lambda_{12}\\\lambda_{23}\end{array}\right)
$ =-\left(\begin{array}{c}(\vec x_1-\vec x_2)\cdot\left({\vec F_1\over m_1}-{\vec F_2\over m_2}\right)+|\vec v_1-\vec v_2|^2\\(\vec x_2-\vec x_3)\cdot\left({\vec F_2\over m_2}-{\vec F_3\over m_3}\right)+|\vec v_2-\vec v_3|^2\end{array}\right)
という式を解けばよい。