月が地球に落ちるお話

月が地球の落ちないのはなぜ?というお話。

円運動 - odz buffer

ref:http://d.hatena.ne.jp/PyTest/20081122/1227330217

というか自分が聞いたのは地球の公転が理由だったと思っていたんだけど、ネットで改めて調べてみて自信がなくなった。月が地球に落ちてきているのだけど地球も動いているから、一定時間後に月が落ちてきている場所にはもう地球がない。こういうのを地球から見ると月が地球の周りを回っているように見えるという説明だったはずなのだけど。

この説明はひどいな。公転なんか持ち込まなくても月の周回運動は説明できる。

というのはわたしも酷いな、と思ったのだけれど、よくよく考えてみれば、そう思うわたし自身ちゃんと解っているのかな、とも思いました。

たとえば、「遠心力と重力が釣り合っているから」なんて説明を、うっかりしてしまいそうですが、月が地球に引かれつつも墜落しないような運動をしているから遠心力というみかけの力が見えるので、説明になっていないと思いますし、どんどん遠くになげると落ちるカーブよりも地表のカーブの方がきつくなるのでグルグル永遠に回り続けるようになる、というのも、それって地球のカーブと同じ曲率になるような奇跡のようなコントロールがなくっちゃだめなの?とも思います。(遠くから来た天体が重力につかまって、地球の周りを回るようになった・・・みたいなの、どんだけの奇跡?)

要は知識ってだけで、理解はしていないのね、わたし。

そういうとき、Etoys はなかなか素敵な友達です。出番ですよ!

まずは普通に落ちるヤツ

重力のシミュレーションは Etoys では定番です。今回ちょっと違うのは落っこちてくるものが豪快にお月様だというその一点。と、言うわけでお月様登場。

向きがわかると後々便利なので小さなマルを乗っけています。クレータだと思いねぇ。写真を取り込んでリアルなお月様を地球に落とすのも気持ちがよいかもしれません。

というわけで、次は月が落ちるスクリプト

どーん!大海原に着弾したら止まるように配慮してみました。

というわけで、落ちる運動は等加速度運動になります。ここらへん、本当の小学生向け Etoys の授業では、実際にモノを落とす姿をビデオで撮影して、それを Etoys に取り込んで、いろいろ見比べながら自分でそれを発見する・・・という授業が定番の様です。(たのしそうな授業ですにゃ~)

子どもの思考力を高める「スクイーク」 理数力をみるみるあげる魔法の授業

子どもの思考力を高める「スクイーク」 理数力をみるみるあげる魔法の授業

地球に向かって落とせ!

とはいえ、今回は地球が平たい円盤じゃなくって丸い星であることを意識しなきゃいけません。何時でも下に落ちればいいってもんじゃありませんよ。

というわけで、月の落ちる方向とその引っ張る力を作ります。

重力さん登場!この Gravity には 引っ張る力を表す power 変数を追加してあげます。

そして先ほどの Moon の fall スクリプトを Gravity の heading(向き)とpowerを参考にしたものにちょっと改変。試しに実行してみましょう。

・・・上向きの矢印なので、月が宇宙に向かって加速しながら落ちて(?)いきます。むーむ。

というわけで、あとはGravityの向きを地球に向けてやるだけです。Gravityの力は、本当は距離の2乗に反比例するのだけれど、まぁ、固定値でいっか、です。



重力さんを作ったところで、今回の真打ち、地球さんの登場!

重力の方向――月から見てどちらに地球が居るか、を求める方法を考えます。とりあえず距離が必要そうなので そのまんま Distance オブジェクトをば作成。

で、距離計算。ここは大人の狡さを発揮して、三平方の定理なんかを使っちゃいます。(あぁ、小学生にやさしくなさすぎます)


Distance's dx ← Moon's x - Earth's x
Distance's dy ← Moon's y - Earth's y
Distance's numeric_value ← squareRoot(
                            square(Distance's dx) + square(Distance's dy) )

計算が見づらかったので、X方向の差分とY方向の差分を示す変数 dx と dy を Distance に追加しています。スクリプトをTicking で実行してぐりぐり月を動かして、どうやら正しそうな動きをしていることを確認します。(デバッグ楽ですにゃあ)

次は向きです。むー。ここらへんも小学生向きな便利かつシンプルな何かがあるのかもしれませんが、わたしは Etoys 3級くらいなので、わかりませんでした。なのでヒキョウ第2弾で 三角関数さんにご登場願いました。


Test Distance's dy < 0
  Yes
    Gravity's heading ← degreeArcTan(Distance's dx / Distance's dy)
  No
    Gravity's heading ← degreeArcTan(Distance's dx / Distance's dy) + 180

タンジェントから角度θを逆算します。Etoys オブジェクトの headding は、上に向いている時が 0度なのと、Ticking デバッグすると、月が地球に下にいるか上にいるかで向きが反転しちゃうのでその補正をいれたらこんな風になりました、な当たって砕けたら直しましょうコーディング。あ、X方向の差分と Y方向の差分しか使ってない。いらないじゃん、Distanceオブジェクト...orz

・・という風なトライアンドエラーで学習するのが Etoys の強みなのですよ!(と言ってみる・・)



気を取り直して、Moon の fall スクリプトの動作を再開します。

おぉ、地球に向かって落ちる落ちる。月の魂が重力に惹かれはじめました。地球をドラッグしながら月においかけさせます。あはは、こっちこっち~♪

・・・・・・って、何処まで早くなるんだ、この月!

慣性が足りない!

この月が地球に落ちないなんて無理です。どんなに逃げても絶対追いつかれます。あわわ。これは変です。

・・・ていうか、この月、追従性よすぎない?どんだけコーナリング性能良すぎというか。地球を反対に振っても勢いを増しながら食らい付いてきます。そうか、慣性がないんだ!

というわけで慣性を作ります。

これに前回の月の向きとスピード(移動距離)を保存して、次回のfall時に重力との合力をつくって動かしてあげればよいハズ!

・・・ってベクトルの合算ですか。にゅー。ベクトルを向きはそのままに二つつなげてあげて、つなげたものの始点と終点に線を引けばよいのだけれど、それをタイルスクリプトでやるには・・・・・・・・。うーー、知恵熱が。

――というわけで、ベタベタそのまんまをスクリプティング。なんとかならなかったら、もう一度考えましょ。

まず、月のこれから動く先を作ります。

で、あとは、

と重力だけで動いた後、次に慣性だけで動いてみると。ほんとそのままですね。

さて月の動く前と動く後の点がわかったので、あとは重力のときと同じ要領で慣性を計算しましょう。今回の移動にはいらなくても、次回の移動に必要ですからね。


MoonInertia's dx ← Nextpoint's x - Moon's x
MoonInertia's dy ← Nextpoint's y - Moon's y

MoonInertia's power ← squareRoot(
                     square(MoonInertia's dx) + square( MoonInertia's dy) )
Test MoonInertia's dy > 0
  Yes
    MoonInertia's heading ← degreeArcTan(MoonInertia's dx
                                          / MoonInertia's dy)
  No
    MoonInertia's heading ← degreeArcTan(MoonInertia's dx
                                          / MoonInertia's dy) + 180

あとは、Moon fall を、慣性をつかったバージョンに書き換えします。(オマケも二つ)


さぁ、これでうまくいくハズ!Ticking 再開です。

そのままだとまっすぐ地球に落ちてきてしまいますが、最初だけ地球をドラッグして衝突しないようによけてあげれば...。

ほら、なんだか地球の周りを回転しはじめそう。さっきみたいに必死に逃げなくても落っこちてこないです。(黒い点が二重になってるのは、月をX方向移動、Y方向移動と2回動かしてるため)

ということは、地球を動かさなくっても、月に最初に適当な動き(慣性)を与えておけば、

落ちる力だけで地球を回り始めそうな感じです。おぉお、これはいけましたか!?


ケプラーさんと、こんにちはこんにちは!!する。

――とかやってみたのですが、なんだか全然円運動に入れません。


円運動にはいれば安定しそうなのですが、なんというか、非常にセンシティブで。重力を強くすれば恐ろしい勢いで宇宙の彼方へすっとんでいきますし、重力を弱くしても次第に起動がふくらんでいきます。振動しながら起動が加速度的にでっかく成る感。重力が無限遠までそのまま伝わるのでいつかは戻ってくると思いますケド。

なにより致命的なのは、回せないどころか、落とせないこと。もしこれが隕石弾で地球を破壊せよゲームだったら、絶対クリアできません(T△T

落とせないというのは絶対おかしい。こんな小さなお話でも、やっぱりちゃんと重力は距離の2乗に反比例しないとだめなのかしらん。というわけで、手抜きはやめてちゃんと距離の2乗反比例させてみます。

動かしてみると、おぉ、なんだか地球から遠くなると速度がゆっくりになって、地球に近づくととっても早くなります。ケプラーの第二法則だぁ♪と、ちょっと興奮です。特にスイングバイが楽しい。

重力を距離の二乗に反比例させるようにしてから、振動するような軌道を描かなくなりました。一見相似な図形を描きながら大きくなっていくか、または容赦なく宇宙の彼方に直線的にすっとんでいくかの2択っぽい。で、相似な図形を描く方ですが、


うーん、Etoys の画面が小さくってこれ以上は出来なかったのだけれど、周回ごとの軌道のずれ幅の比率が相対的に小さくなっていってるのと、軌道にたいする地球の位置がずれていって言ってるので、相似ではないですね。もっど周回させると安定するのかな?、と思いたくなる感じです。軌道が地球を一つの焦点にする楕円になっていくかんじ?あぁっ! そういえばケプラーの第一法則がそんなんでした!(←と、ここに至るまで、惑星の軌道は真円だとなんとなく思い込んでいた中世な脳のわたし)



と、なんだかケプラーさんの後ろ姿が見えてきたスッゴクいいところでこのエントリはおしまいです。ほんとはもうちょっと「できた!」と確信がもてるまでやるつもりだったのですが、なんかもう、疲れ果ててしまったので、ここらで打ち止め。こんなもんでご勘弁です。(あぁ、寝る前のちょっとアソビのつもりだったのに、もう空が白いデスよ...)

・・・オヤスミナサイ。


* * *


と、こんなコトやってみて思ったのは、数学ってすっごく便利だなっ!ということ。こんなに便利なモノ無いよとかおもいました。ホントは三平方の定理とか三角関数とか、そういう「難しそうアレルギー」が起こりそうなのは使わない、と思っていたのですけれど、いやぁ、便利でついつい。

なんていうか「数学なんて勉強する意味あるんですか?」なんて子供に言わせちゃうのは、大人の不手際かもね、とか(全然教育現場の苦労も知らないくせに)思ってしまいした。

追記

とか、きれいに落としたつもりでしたが、なんか、最後のも変な気がしてきました。むーむ。

追記その2

距離と重力の更新は、独立にチクタクしてたのですが、これが良くなかったみたい。これら更新を Moon の fall スクリプト内に移動。

したら気持ち悪いくらい綺麗に周回するようになりました。


(数字は月の初速)

えへへ....ごめんなさい m(_ _)m




この状態で地球どドラッグすると、月が頑張ってついてきて、地球を止める、月を振り切っちゃったり加速をつけ過ぎちゃったりしない限り、一発で地球の周回軌道に乗っちゃいます。なんだか犬っぽいです。

逆に地球のドラッグの仕方次第で月をものすごい勢いで外宇宙に向かって投げられます。


あは!これはおもしろいです。