Download - 福井技術者の集い その5 発表資料スライド
UnityによるUnityによらない物理シミュレーション
@dc1394
福井技術者の集いその5発表資料スライド
自己紹介
Twitter: @dc1394
C++, C#, F#そしてRubyが好きです。
趣味はプログラミングではなく数値解析。
C++で量子力学の数値計算とかやってます。
概要
「できる限り厳密な」振り子の物理シミュレーション
(1)空気抵抗を無視する場合
単振動で近似できる場合
厳密解
(2)空気抵抗を考慮する場合
(3)二重振り子
使用するプログラム言語、ライブラリ等
数値計算のプログラム言語はC++14を使用する。
Boost.Odeintを用いるため、Boost C++ Librariesを使用する。
コンパイラには、Microsoft Visual C++ 2015
(VC14)を使用する。
シミュレーションの可視化のために、Unity 5とC#
を使用する。
単振り子とは
伸び縮みしない軽い棒の一端を固定し、他端におもりを付けて吊るし、鉛直面内で振らせるもの。
図はWikipedia[1]より引用。
[1] 単振り子 -https://ja.wikipedia.org/wiki/%E6%8C%AF%E3%82%8A%E5%AD%90
単振り子の運動方程式
空気抵抗を無視したとき、左図(Wikipedia[1]より引用)より、運動方程式は、
となる。従って、
なる常微分方程式を解けば、この運動が解析できる。
[1] 単振り子 -
https://ja.wikipedia.org/wiki/%E6%8C%AF%E3%82
%8A%E5%AD%90
単振動で近似できる場合
θが非常に小さい場合( )、 と近似できるので、
となる。この常微分方程式の解は、初期条件、
を用いると、 となる。
これは周期 の単振動であり、周期Tは振幅θ0に依存しない。
単振動で近似した場合のプロット(θ0
= 10°)
単振動で近似した場合のプロット(θ0
= 30°)
単振動で近似した場合のプロット(θ0
= 60°)
単振動で近似した場合のプロット(θ0
= 90°)
単振動で近似した場合のプロット(θ0
= 179°)
厳密解
この常微分方程式は非線形方程式であり、厳密解を初等関数で表すことはできない。
初期条件、
を用いると、厳密解は、
となる(論文[1]より)。ここで、sn(u, k)はJacobiの楕円関数であり、K(k)は第一種完全楕円積分である。
[1] A. Beléndez et al., Revista Brasileira de Ensino de Física, 29, 645 (2007).
厳密解の周期
同論文によると、厳密解の周期Tは、第一種完全楕円積分K(k)を用いて、
と書ける。従って、周期Tは振幅θ0に依存する。
Boostライブラリに含まれる特殊関数の利用
Jacobiの楕円関数sn(u, k)は、Boostライブラリの「jacobi_sn」関数を用いれば、簡単に得られる( jacobi_sn関数では、引数の順序がsn(k, u)と逆になっていることに注意)。
また、第一種完全楕円積分K(k)は、同様に、Boost
ライブラリの「ellint_1」関数を用いれば、簡単に得られる。
厳密解と単振動で近似した場合を比較したプロット(θ0 = 10°)
厳密解と単振動で近似した場合を比較したプロット(θ0 = 30°)
厳密解と単振動で近似した場合を比較したプロット(θ0 = 60°)
厳密解と単振動で近似した場合を比較したプロット(θ0 = 90°)
厳密解と単振動で近似した場合を比較したプロット(θ0 = 179°)
空気抵抗を考慮する場合
空気抵抗を考慮する場合、運動方程式は、
となる。ここで、f(v)は物体の形状に依存する、極めて複雑な式であり、解析的には求められない。
そして、任意の形状の物体についてf(v)を求めるには、Navier–Stokes方程式を、与えられたvに対して数値的に解かなければならない。
これは非常に難しく、PCによるリアルタイムシミュレーションはまず不可能である。
粘性抵抗と慣性抵抗
ここでは、振り子を完全な球体と近似して、それに働く空気抵抗力f(v)を考えることにする。
半径rの完全な球体に働く空気抵抗力f(v)は、以下の式で与えられる(サイト[1]より)。
ここで、sgn(x)は符号関数である。
第一項は、物体表面に平行に働く粘性力の合力であり、粘性抵抗と呼ばれる。
第二項は、物体の慣性に起因するので慣性抵抗と呼ばれる。
[1] 球体の空気抵抗と係数 - http://slpr.sakura.ne.jp/qp/air-resistance/
抗力係数とReynolds数
ここで、 μ [kg⋅m−1⋅s−1]:流体の粘性係数(粘度) ρ [kg⋅m−3]:流体の密度 CD:抗力係数と呼ばれ、下記Reynolds数の関数 Re:Reynolds数と呼ばれる無次元量であり、 として定義される
なお、20℃の空気の場合、 μ = 1.822×10−5(kg⋅m−1⋅s−1), ρ = 1.205(kg⋅m−3)
である(出典:サイト[1]より)
[1] 水・空気の物性 密度 粘度 動粘度 - http://www.mterm-pro.com/machine-yougo/fluid-dynamics/water-air-bussei.html
球の周りの流れ
球の周りの低レイノルズ数流れ。下記サイト[1]より引用。
[1] http://www.caero.mech.tohoku.ac.jp/research/IBM/Spheres.gif
抗力係数のグラフ
抗力係数CDは、Reynolds数の値により複雑に変化する(下図はWikimedia Commons[1]より引用)。
[1]https://commons.wikimedia.org/wiki/File:Drag_coefficient_of_a_sphere_as_a_function_of_Reynolds_number.png
Stokes近似
のとき、 と近似できる(Stokes近似、図の青線)。
このとき、慣性抵抗は無視できるので、考慮する必要は無い。
Reynolds数が大きいとき
Reynolds数が大きい場合の に対しては、実
験結果をフィッティングした以下の表式(論文[1]より)を用いる。
[1] Nian-Sheng Cheng, Powder Technology, 189, 395 (2009).
解くべき常微分方程式
以上のことから、解くべき常微分方程式は、場合分けして、
(i) のとき、
(ii)それ以外の場合、
である。
この常微分方程式は、解析的には解けない。従って、 Boost.Odeintに実装されているBulirsch-Stoer法を用いて、数値的に解く。
空気抵抗を考慮した場合のプロット(θ0 = 179°)
空気抵抗を考慮した場合と考慮しない場合の比較(θ0 = 179°)
球に発泡スチロールを使った場合の比較(θ0 = 179°)
実行画面
ソースコードとバイナリへのリンク
このプログラムのソースコードは、GitHub上で公開しています。
https://github.com/dc1394/simplependulum
また、バイナリも以下で公開しています。
https://github.com/dc1394/simplependulum/releas
es/tag/v0.12
ライセンスは2条項BSDライセンスとします。
二重振り子
振り子の先にもうひとつの振り子を連結したもの。
図はWikipedia[1]より引用。
[1] Double pendulum -
https://en.wikipedia.org/wiki/Doubl
e_pendulum
二重振り子の運動方程式
二重振り子の運動方程式は、Lagrangianと、Euler–
Lagrange方程式から、以下のように導出できる(ただし、簡単化のために、空気抵抗等は無視し、
とする)。
詳しい計算は下記サイト[1]を参照のこと。
[1] 2重振り子 - http://www.aihara.co.jp/~taiji/pendula-equations/present-
node2.html
二重振り子の運動方程式
上記の二元連立常微分方程式は、解析的には解けない。
従って、Bulirsch-Stoer法を用いて、数値的に解く。
二重振り子のプロット( θ1,0= θ2,0 =
10°)
二重振り子のプロット( θ1,0= θ2,0 =
30°)
二重振り子のプロット( θ1,0= θ2,0 =
60°)
二重振り子のプロット( θ1,0= θ2,0 =
90°)
二重振り子のプロット( θ1,0= θ2,0 =
90°)
二重振り子のプロット( θ1,0= θ2,0 =
179°)
θ1,0= θ2,0 = 179°と179.1°のθ1の比較
θ1,0= θ2,0 = 179°と179.1°のθ2の比較
実行画面
ソースコードとバイナリへのリンク
このプログラムのソースコードは、GitHub上で公開しています。
https://github.com/dc1394/doublependulum
また、バイナリも以下で公開しています。
https://github.com/dc1394/doublependulum/relea
ses/tag/v0.11
ライセンスは2条項BSDライセンスとします。
まとめ
以下の場合について、振り子の物理シミュレーションを行った。
(1)空気抵抗を無視する場合
単振動で近似できる場合
厳密解
(2)空気抵抗を考慮する場合
(3)二重振り子