九尾空間

この世はとてもキュービックな空間ですね

「破綻しない二重振り子シミュレーション」を書こうとしたらChatGPTに敗北した件について

…… いやー、してやられました。どうもこんにちは、nullkalです。

今回は、年末にかけてニカイドウレンジさんが公開して話題になった「坊主がクレーン車で除夜の鐘を叩くゲーム」に便乗して、二重振り子のシミュレーションを書いていこうと思ったのですが、まさかのまさかChatGPTの優秀さに敗北してしまったのでその顛末を書き綴ってみようと思います。

ネタ元をご存じない方のために念のためご紹介。名前の通りクレーン車で除夜の鐘を叩くゲームなのですが、クレーン車がなんと二重振り子になってます。

二重振り子は、昔から個人的にめっちゃ好きな物理学の概念だったのですが、まさかこれがこんな面白いゲームになろうとは……。見た瞬間本当に発想の大勝利だと思いました。

ただこのゲーム、どうやら開発途中では紆余曲折あったみたいでして、途中で開発を諦めかけたそうです。特に以下の問題はリリースされたバージョンでは、別の仕組み(加速し続けるモードに入るとアームが折れる、など) を導入してケアしているようでした:

  • 振り子が稀に加速し続ける問題
  • 振り子がすぐ減速してしまう問題

仕組みを導入することで問題無くゲームになってめでたしめでたし…… ではあるのですが、実はこれらの問題は、Unityの物理シミュレーションに頼らず自力で二重振り子のシミュレーションを実装すれば回避できるのです。

 

やれやれ、本当の二重振り子シミュレーションを見たことが無いようだ。
明日またここに来てください、本当の二重振り子をお見せしてあげますよ。

 

そんな感じで天狗になっていた私の元に、突然とんでもない刺客が現れました。
そう、ChatGPTです。

ほんの興味本位で二重振り子のシミュレーションに欠かせない方程式(ラグランジアン)を出力させようとしたら、なんとほぼ完璧な結果を返す二重振り子シミュレーションを返してきたではないですか……!

そのシミュレーション結果がこれです。ドンッ

二重振り子シミュレーション (ChatGPT製)

いやいやー冗談でしょ~とお思いの方も居るかもしれません。

でも今回私、ChatGPTとやりとりをしている間は一行もコードを書きませんでしたし、さらには運動方程式を提示したり手で解いたりなんかも一切していません

証拠にすべてのやりとりを公開するので、気になった方は是非覗いてみてください:

なんだかんだで今までChatGPTを侮ってたところも無くはないのですが、まさかここまでとは……。不覚です。

あまりにもサクッと作られて悔しいので、大昔に人の手のぬくもりを込めて作った二重振り子シミュレーションを大公開しちゃいます:

See the Pen Double Pendulum by nullkal (@nullkal) on CodePen.

こうして人力で作ったものをChatGPTが作ったシミュレーションと比べると、圧倒的に速度が出ているのでまだまだ人間の作業も捨てたものではないとは思いました。

ただ、やっぱりここまでしっかりとした結果が出てくるものが出来るとは、本当に侮ってはいけませんね。

あ、そうそう。不自然な加減速が起こらない二重振り子を実装する秘訣は「4次のルンゲ・クッタ法」です。単純に毎フレーム速度を座標に加算していく計算方法だと、計算誤差が大きすぎてシミュレーションが破綻しがちなので、ある程度精度の出る数値計算手法で近似してあげると、それなりに破綻せずに二重振り子として振る舞うようになるみたいです。

今回の記事では当初、この「4次のルンゲ・クッタ法で微分方程式を近似的に解く」実装をもう一度やってみようと考えていたのですが、つい面倒臭がってChatGPTに聞く遊びをしてみたら、まさか本当に解かれてしまった、というのがことの顛末です。

お後がよろしいようで。ではまた。