見出し画像

N重振り子の運動方程式

こんにちは、えむしーじじょうのShikiです。

今回はN重振り子のお話。本当はシリーズにして投稿しようかとも思っていたのですが、数式を展開するのがnote上だと大変だと分かったので運動方程式の導出までの過程はpdfにて清書しました。興味ある方はダウンロードしてみて下さい。

まえがき

物理の道を選択した人は単振り子は高校で、2重振り子は大学で運動方程式を求めることになります(はず)。では3重振り子はというと、課題で出ることは恐らくありません。なので、N重振り子も当然出て来ない。では何故、本稿を書いているのか。それはコロナの影響でまとまった時間を取れるようになり、大学生の頃に興味本位で解いてメモ書きだったものを、これを機に清書してしまおうと思い立ったからなのです。そういう訳で「N重振り子の運動方程式.pdf」がメインであとはおまけです。

単振り子

単振り子は。高校物理IIで習います。高校での解き方とは違いますが運動方程式は次のようになり

単振り子_運動方程式

角度に関する加速度は次のようになります。それぞれの変数の定義は「N重振り子の運動方程式.pdf」の1章をご覧ください。

単振り子_加速度

ここで特筆することは、振り子の糸の長さと周期から重力加速度が求められることです。本稿では省略しますが、θが微小の時は周期Tを解く事ができ、周期Tは糸の長さと重力加速度で決まることが分かります。糸とおもりがあれば実験することができます。家で実験できる最も簡単な重力加速度の求め方ではないでしょうか?

2重振り子

2重振り子は大学で物理系の授業を履修する人が出くわします(多分)。高校までに習う知識で2重振り子の運動方程式を求めることは至難の業ですが、大学で学ぶラグランジュの運動方程式を使えば(比較的)簡単に求めることができます。
高校までの物理では基本的に物体に作用する力(抗力、遠心力、重力など)をイメージして運動方程式を立てますが、2重振り子はその導出方法に向いていません。しかし、ラグランジュの運動方程式はエネルギーの関係式から運動方程式を出すことができます。導出過程に物体に作用する力を考える必要がありません。力の作用を考えるよりエネルギーを考える方が100倍簡単なので、これに味を占めると高校物理の力学の方が難しくなるという副作用があります。
変数の定義や導出の過程は「N重振り子の運動方程式.pdf」の2章をご覧頂くとして、運動方程式は次のようになり

2重振り子_運動方程式

角度に関する加速度は次のようになります。

2重振り子_加速度

2重振り子もそれ以降も振り子の運動を解析的に解く事はできませんが、数値積分によって解く事ができます。また、この2重振り子はたった2つの質点にも関わらずカオスが生まれる(上の動画)ことでも有名で、実験した動画や数値計算したアニメーションをネットで見ることができます。

3重振り子

3重振り子は大学の授業では出てくることはありませんでしたが、2重振り子の運動方程式を求めれば、3重振り子もやってみたくなるのが性(さが)というものです。これまでと同様に変数の定義や導出過程は「N重振り子の運動方程式.pdf」の3章をご覧頂くとして、運動方程式は次のようになり

画像7

角度に関する加速度は次のようになります。

画像7

多くの変数や三角関数が出て来て複雑に見えますが、導出に特別なテクニックは必要なく、ゴリゴリと計算を進めれば答えに辿り着くことができます。
そうして、この運動方程式を眺めていると法則性が見え、N重振り子の運動方程式、つまりは一般化ができそうだと気づきます。

N重振り子

本稿のメインディッシュ、N重振り子です。計算して後に分かりましたが、実は3重振り子の運動方程式を導出するより楽だったりします(計算ミスをしなければ)。N重振り子の運動方程式と加速度は次のようになります。これまでと同様に変数の定義や導出過程は「N重振り子の運動方程式.pdf」の4章をご覧下さい。

N重振り子_運動方程式

他にもいろいろな表記があるかもしれませんが、計算プログラムに打ち込むにはこの書き方が便利です。pythonの場合は下のようにして書くことができます。for文が偉大なのかもしれませんが、シンプルに書き表すことができています。(捕捉 : m, g, lを最初だけ計算するようにすれば高速できます。)

for i in range(n):
   for j in range(n):
       for k in range(max(i,j),n):
           A[i][j] += m[k]
           B[i][j] += m[k]
       if i == j:
           A[i][j] *= l[j]
           B[i][j] *= g * np.sin(x[i])
       else:
           A[i][j] *= l[j]*np.cos(x[i]-x[j])
           B[i][j] *= l[j]*v[j]**2*np.sin(x[i]-x[j])
​

こうして一般化してしまえば、もう何でもござれです。4重,5重,…,100重といくらでも振り子を繋げることができます。例としてN=4,8,32の場合の動画を紹介します。

N=32は特に面白く、始めは紐のよう振舞っているのですが、次第に支点の方に凝集しているように見えます。タンパク質の折り畳みのようで、ポリペプチドの凝集するメカニズムに関係していたら面白いなぁ、などと妄想が膨らみます。
もっとNを増やしてみたらどうなるか、というのも興味深いのですが、PCのスペックの問題で限界が見えて来ました。計算量はn^2で増加していくのでこれより先は荊の道。ここいらで満足しておきます。本稿も長くなってきましたしね…。今後また、N重振り子で面白い事があれば記事にして紹介したいと思います。

終わり。












記事が面白かった! 役に立った! 応援したい! という方にご支援頂ければ幸いです。