フーコーの振り子 体感キット？


## 概要

フーコーの振り子の動き（振動面が回転する様子）を体感する？　簡単な紙細工とGIFアニメを作ってみました。

- [English abstract](https://github.com/kuh96/misc/blob/gh-pages/sage/README.md)

## 紙細工の作り方
<img src="https://kuh96.github.io/misc/sage/out/paper-model.png" width="50%" />

 * 画像を印刷、紙を太線で切り抜いて、まんなかの開いた円板を作る
 * 0°の左の太線にもハサミを入れる 
 * 0°の線を例えば 50°の破線の上に重なるように紙を曲げて、クリップなどで固定する。上部を切り取った円錐面ができる
   - 目盛は緯度（北緯）を示す。緯度をかえて試してみてください
   - まんなかが開いているのは単に曲げやすくするためです

|組み立て|完成写真|
|:-----:|:----:|
|<img src="https://kuh96.github.io/misc/sage/out/buildUp.gif" width="100%"/>|<img src="https://kuh96.github.io/misc/sage/etc/completed.JPG" width="70%"/>|

 
## （あんまり面白くないけど）見方・遊び方

### 静止系から見た動き

作った円錐の上部（北）を上から見て、**左回り（西から東）**で順に矢印を見ていきます。
緯度 = 50°では一周すると、矢印は**左回りに約90°回転**することが分かります。

 - 正確には $2 \pi (1-sin(緯度)) ラジアン$ で 84.2°
 - なお一周したあとは、上にある0°の面でなくて下に隠れている面に続きます（すぐ終わっちゃうけど）

これが静止系から見たフーコーの振り子の回転の様子です。

### みかけの動き

こんどは円錐を固定し、自分が**左回り（西から東）**に回りながら、正面にくる矢印を見ていきます。
（不精な方は、自分は動かずに円錐を**右回り（東から西）**に回して、正面にくる矢印を見ていく）

緯度 = 50°では一周すると、矢印は**右回りに約270°回転**することが分かります。

 - 正確には $- 2 \pi sin(緯度) ラジアン$ で -275.8° （マイナスは右回りを示す）
 - ちなみに、フーコーの振り子の公開実験が行われたパリの緯度は北緯48度51分44秒

これが地表に固定された観測者から見たときのフーコーの振り子の回転の様子、すなわちみかけの動きです。

### 3D アニメ

北緯50°での振り子の回転の様子の GIF アニメです。（描画は２周だけ、あとは繰り返しなので境目で不連続になる）

<img src="https://kuh96.github.io/misc/sage/out/50deg.gif" width="50%"/>

アニメが止まっている場合は「画像だけを別タブ/ウインドウに表示」して、リロードしてみてください。

## 説明

### 緯度＝９０°(北極) の場合

 * 北極では地面は地軸と直交した平面内で回転する
 * 慣性により振動面の向きが保たれるので、振り子は静止系に対しては回転せず、
 * 単に**平行移動** する

<img src="https://kuh96.github.io/misc/sage/out/north-pole.gif", width="30%" />

### 一般の緯度の場合

 * 一般の緯度では、地面は地軸に対して一定の角度（90° - 緯度）だけ傾いて地軸のまわりを回転する
 * 従って振り子は**円錐面**内で動いていく

<img src="https://kuh96.github.io/misc/sage/out/cone.png" width="50%" />

 * 振り子はこの円錐面内で **平行移動** していく、と考えられる
    * もちろん**力学的な現象**であるフーコーの振り子の動きと、数学・微分幾何学でいう**平行移動** が対応するかは**検証する必要**がありますが、それはまたの機会に。。。

でも **曲面上の平行移動** は難しい

 *  曲面上の平行移動は、移動させる経路に依存する
 *  測地線とか共変微分とか接続とか。。。

でも、実は**円錐面は曲がっていない!**

 * 円錐面は平面に展開できる（**可展面**というらしい、要するにガウス曲率 0）
 * というわけで、矢印を展開図（扇形）上で平行移動させて、それを円錐面に変換したのが上の紙細工とアニメです

|| 扇形上で平行移動 | それを円錐にすると |
|:---:|:---:|:---:|
|50°| <img src="https://kuh96.github.io/misc/sage/out/flat50deg.gif" width="50%"/> | <img src="https://kuh96.github.io/misc/sage/out/50deg.gif" width="50%"/> |
|30°| <img src="https://kuh96.github.io/misc/sage/out/flat30deg.gif" width="50%"/> | <img src="https://kuh96.github.io/misc/sage/out/30deg.gif" width="50%"/> |


### 扇形・円錐面変換

上の紙細工は以下のように、平たい扇形から円錐面への変換（変形）をやっていることになります。

 * 扇形の半径を $R$、中心角を $\Theta$
 * これを**絞ってできる円錐** の底面の中心角を $\Theta' (> \Theta)$ とする
   * $\Theta'=2 \pi$ のときちょうど隙間のない円錐面になる
 * 扇形上の点の極座標を $(r,\theta)$
 * それに対応する円錐面上の点を円柱座標で $(r', \theta', z')$

とすると

 * $a = \Theta/\Theta' (< 1)$
 * $r' = a r$
 * $\theta' = \theta / a$
 * $z' = (R - r) \sqrt{1 - a^2}$
 
この変換は等長変換（長さも角度も変えない変換、伸縮のない変換）なので、扇形状の平行線は円錐面上の平行線に変換されることになります。

## To Do:（いつになるか分からへんけど）続編予定

 * 角度欠損（デカルトの不足角の定理）とガウス・ボネの定理（数学）
 * 角度・角速度ベクトル（力学）
 * フーコーの振り子 or ジャイロスコープの運動（力学）

## 参考

* en.wikipedia ["Foucault pendulum"](http://en.wikipedia.org/wiki/Foucault_pendulum)
* Oprea, John (1995). ["Geometry and the Foucault Pendulum"](http://www.maa.org/programs/maa-awards/writing-awards/geometry-and-the-foucault-pendulum) . Amer. Math. Monthly 102: 515–522.
    * これは上の最初の Reference だけど **球面** で説明している
    * でも基本的な理解には **円錐面** で十分、微分も積分も不要なのだ


## 蛇足

図とアニメは sage で作りました。
sage も python も初心者で、まだいろいろ分からない。。。

 * ３Dアニメで view point を回転するのはどうすりゃいいの ??
    * やむなくモデルのほうを回転したが、今度は回転でサイズが変わってしまう
        * しなたないので、フレームサイズを固定するために２点を追加して描画。。。
 * アニメの~~外枠(frame) が取れない、~~ 奥の円錐面にへんな影。。。なんでやろ？
 
なおこのアニメには、実はまだ微妙なバグがあって。。。

 * 振り子の最初の向きを「横向き」にすると、へんな動きをします
 * 原因は苦労の上分かったけど、どう直すか悩み中。。

<img src="https://kuh96.github.io/misc/sage/out/known-bug.gif" width="50%" />

5/14 修正済み
<img src="https://kuh96.github.io/misc/sage/out/fixed-bug.gif" width="50%" />

（原因）

 * 平行移動した線分を描くために、以前は2点を展開図上の x,y 座標で求め、それを $r, \theta$ にして円錐面上の２点を求めていた
 * これだと $\theta$ を求めるのに arc tangent など必要で、どこかで位相 $\theta$ が $2 \pi$ だけ飛んでしまう
 * ところが $\theta$ の周期は $2 \pi$ だが、$\theta'$ の周期は $2 \pi/a$ なので、ときどきおかしくなっていた

（修正）
 
 * ２点の x,y 座標でなく、円錐面上の接ベクトルで線分を描くように修正。接ベクトルの計算は sage 君がやってくれる
   * それくらい手で計算しなよな、簡単なんだから。ボケるぞ！ 
 
```python:
    # 円錐面上の線分の plot を得る。 r, len, phiを一定にして th を変化させると緯度上を平行移動した線分が得られる
    # surf: 円錐面の ParametrizedSurface3D
    # r, th: 平面上の極座標での位置
　　 # len, phi: 線分の長さの半分と、線分とX軸とのなす角度
    def pline(self, surf, r, th, len, phi, **args):
        at = (r,th)　　　　　# 平面上の極座標での位置ベクトル
        dir = (cos(phi-th), sin(phi-th))  # 平面上の極座標での phi方向のベクトル
        t1 = surf.tangent_vector(at, dir) # 円錐面の接ベクトルの (x,y,z) 座標
        t1 = t1 / abs(t1)　 # 規格化
        p0 = self.xyz0(at)  # 中心点の  (x,y,z) 座標
        p1 = p0 + len*t1    # 線分の開始点
        p2 = p0 - len*t1    # 線分の終了点
        t = var('t')
        eq = p1*t + p2*(1-t) # (x,y,z) 座標での線分の方程式
        a = parametric_plot3d(eq, (0,0.5), color='red', thickness=5, **args)
        b = parametric_plot3d(eq, (0.5,1), color='green', thickness=5, **args)
        return a+b;
```