プログラミング

2重振り子の数値シミュレーション、解析から結果描画まで[Octave / Matlab / Android iPhoneアプリもあるよ]

投稿日:2021年3月15日 更新日:

久々に数値解析をやってみたくなりました。題材としては多くの人がやっている二重振り子が面白そうです。では言語は何にしようかと迷うところですが、コードを書いて計算して結果を描画するまで可能な「Octave」が良さそうです。
いざやってみようとすると結構苦労しました。難しい点をいくつかの関門に見立てて以下の記事にまとめました。本記事には特に有益な情報はありませんが、結果をYouTube動画にアップして説明欄にソースコードを載せております。興味がありましたらご参照ください。(描画の部分は割愛しております。)

第一関門:ラグランジュ方程式

二重振り子の解析のソースコードはあらゆる言語でWeb上に情報があります。しかし大まかな流れを理解していないとコピー&ペーストだけでは解析実行は難しいです。ラグランジュ方程式による解法を学んでおくとさらなるN重振り子への展開もスムーズにできそうです。ラグランジュ方程式の導出についてもWeb上に多くの情報があるのでそちらに任せます。
とりあえず私はWeb上の資料を読んで、最終式の添字等が間違っていないかを確認しました。経験上、他人の情報でコードを書く際、i,j,kなどの添字の間違いで正しい結果が出ずにハマる場合が多々あります。なので最低限の確認をしておいた方が良いです。

第二関門:オイラー法(ホイン法)

ステップごとに計算していく方法としてオイラー法が一番簡単なようです。しかし誤差が大きい?というのが一般的な理解のようです。またアニメーションは長い時間の方が面白いので、できるだけ時間ステップ幅は大きく取りたいところです。そうすると2次的な近似のホイン法が良さそうです。
(さらに4次のルンゲクッタもありますが私はホイン法でやる事にしました。)

第三関門:高速描画

アニメーションを作る上で描画をある程度高速に行えないと作業効率が悪く、凝った動画を作成する事ができません。
Octaveでの具体例を言うと、単にplot関数を使用して描画をすると大量のフレーム(10,000コマなど)のアニメーションにとんでもない時間がかかってしまいます。Matlabでの情報になりますが、plotではなくlineなどの関数を使用すると良いとのことです。Octaveでもこの方法は有効でした。

第四関門:計算の高速化

二重振り子ならばそれほど高速化を意識してコードを書かなくても良いかもしれません。しかし三重、四重となってくると多くのステップの計算時間は膨大なものとなってくるのである程度高速化を意識してコードを書く必要があります。
高速化の方法としては、基本的な事項になりますが、計算時間の大半が連立1次方程式(Ax=b)を解く箇所なので「inv(A)」は使用ぜずに「A\b」を使うなどがあります。
さらにホイン法では2回、A\bを解くのですが行列Aについては不変となると思われます。この場合、予め行列AをLU分解しておくと高速に解けるというのが一般的な見解と思われますが、現状のOctaveではその恩恵は受けられないようです。
(Matlabならば高速化が実現できるようです。)

以上、Octaveによる二重振り子解析に関する記事でした。

おまけ:スマホアプリにしました

余力があったのでスマホアプリにしてみました。スマホ版はOctave(インタープリタ言語)に比べて爆速で計算が行えます。なので計算しながら描画をする仕様が可能です。良かったらダウンロードして遊んでみてください。無料です。

Android: 魔改造振り子 – Double Pendulum
https://play.google.com/store/apps/details?id=jp.co.g_llc.pendulum

iPhone:魔改造振り子 – Double Pendulum i
https://apps.apple.com/jp/app/double-pendulum-i/id1563599973


-プログラミング

執筆者:

関連記事

弾丸と壁/人の接触判定を少し真面目に実装してみる|ゲーム作成

フォートナイトみたいなオンラインバトロワゲームを作っています。優秀なサンプルコードから作成を開始したので早い段階で一応形にはなりました。しかし、サンプルをいじりすぎて接触判定に矛盾が生じてきてしまいま …

100万DLアプリを生み出せ

アプリ公開で収益を得るようになってから数年、いまだ大当たりはありません。1本でも大当たりアプリを生み出した=アプリで成功と言って良いでしょう。では、そもそも「大当たり」アプリとはどんなものでしょうか? …

Found an unexpected Mach-O header code: 0x72613c21 への対処 Xcode, Admob, xcframework

日々変わっていくAdmobの仕様への対応にとても苦労しています。そんな中、アプリをApple Store Connectへ提出するためXcodeにてArchiveを作成してValidateしようとした …

no image

ショーモナイノ/ ソースコード(クライアントサイド)

サーバサイドのソースコードを公開したところ、結構ビュー数が伸びているようです。なのでクライアントサイドも公開しておきます。何かの役に立てればと思います。 内容はとんでもないジャンクコードとなっています …

iPhoneアプリ公開でAppStoreにて言語が英語になる場合の対処 | Xcode

日本語にしか対応していないアプリを作成してAppStoreConnectでも言語を日本語しか選択していないのに、公開したらAppStoreでの言語表記が「英語」に。日本語にしたい場合の対処法です。[対 …

スポンサーリンク