03. 最速降下
摩擦のない坂の上に玉を置き、静かに手を離します。玉が水平に 1 m 離れた地点へ最も早く着くのは、どんな形の坂でしょうか。 まっすぐな坂は道のりが最短ですが、最速ではありません。1696年に Johann Bernoulli が出題した、変分法の始まりとなった問題です。
| 項目 | 内容 |
|---|---|
| 状態 | 水平位置 、深さ 、速さ |
| 制御 | 坂の向き (真下から測った角度) |
| 目的 | 到着時刻 を最小にする |
| 区間 | 1区間、20ノード、終了時刻は自由 |
| 新しく学ぶこと | 三角関数を含む非線形な運動方程式、不等式で書く経路制約、終点の一部(深さ)を自由にする境界条件、解析解との比較 |
坂の形を直接探す代わりに、玉が各時刻に進む向きを制御として探します。向きの時間変化が決まれば、 玉の通る道筋、つまり坂の形が決まります。
- 坂を急にすると、早く速度が上がりますが、深く下がるだけで横にはあまり進みません。
- 坂をゆるやかにすると、横には進みますが、速度がなかなか上がりません。
最速の坂は、「最初は急に下って速度を稼ぎ、速くなってから横へ進む」形になると予想できます。その度合いを最適化で決めます。
終点については水平位置 だけを決め、深さは決めません。「水平に 1 m 離れた鉛直線のどこかに、最も早く届く」問題です。 重力加速度と距離をどちらも 1 とする、単位を気にしない設定です。
深さ は下向きを正にとります。角度 は真下から測り、 が真下、 が水平です。
- 1・2行目:速さ を、向き に応じて水平方向と鉛直方向に分けたものが、位置の変化の速さです。
- 3行目:重力 のうち坂に沿った成分 だけが玉を加速します。真下()なら そのもの、水平()なら加速しません。
2行目と3行目から 、つまり が常に成り立ちます。 摩擦がないので速さは深さだけで決まる()という、エネルギー保存の式です。
原点で静止した状態から出発し、水平位置 に着いたら終わりです。終点の深さ と速さ は決めず、最適化に任せます。
- 出発点より上には行きません(出発点では が境界条件で決まっているので、それ以外のノードに課しています)。
- 向きは左に戻らない範囲にします。
- 終了時刻が 0 に近づいて計算が壊れないよう、下限を置いています。
これらは途中のすべてのノードで守る経路制約で、「値 」の形の不等式として与えています。 最適解ではどれも効いていません(等号になりません)。
| 記号 | 意味 | 値 |
|---|---|---|
重力加速度 PARAMETERS["g"] | 1 m/s² | |
終点の水平距離 PARAMETERS["l"] | 1 m |
時刻は 0 から 2 までとし、水平位置は 0 から 1 へ、深さは 0 から へ、どちらも時刻に比例して増える直線にします。 向きは一定の です。速さには初期推定を与えておらず、0 から始まります。 道筋としては「30°ずれた直線の坂」を、物理的につじつまの合わないまま与えていることになりますが、最適化の途中で修正されます。


- 到着時刻は 1.772454 s で、解析解 1.772454 s と7桁ほど一致します。
- 同じ終点へ直線の坂で行くと 2.101 s かかります。最速の坂は道のりが長いのに約16 % 早く着きます。
- 終点の深さは 0.6365 m(解析解 0.6366 m)、速さは 1.128 m/s です。
- 向きは真下(0°)から始まり、時間にほぼ比例して増え、終点でちょうど水平(90.0°)になります。
サイクロイド
Section titled “サイクロイド”最速降下曲線はサイクロイドであることが知られています。半径 の円が水平な天井の下を転がるとき、 円周上の1点が描く曲線で、円の回転角 を使って
と表せます。始点 では真下を向き、最も深い点 では水平になります。
なぜサイクロイドになるのかは、光の屈折にたとえると分かります。光は速く進める場所を長く通るように曲がり、 その曲がり方は「 が一定」というスネルの法則で決まります。玉も同じで、 深いほど速い()ので、最速の道は が一定になるように曲がります。この条件を満たす曲線がサイクロイドです。
終点では水平になる
Section titled “終点では水平になる”この例では終点の深さを決めていません。そのため最適な道は終点でちょうど水平になります。 終点では「水平位置が に届くこと」だけが求められているので、最後の瞬間に下向きの速度成分を持っていても、到着を早めることには役立ちません。 速さのすべてを水平方向に向けて着くのが得なのです。
サイクロイドで水平になるのは のときなので、 から半径が と決まり、
となります。 では です。
また、サイクロイドでは向き が円の回転角のちょうど半分()で、円は一定の速さで回るので、 は時刻に比例して増えます。向きの時間履歴が直線になっているのはこのためです。
数値解の精度
Section titled “数値解の精度”運動方程式に三角関数が入り、状態と制御が掛け算で結びついているので、この問題は非線形です。 それでも解がなめらかなので、20ノードの多項式で解析解と7桁ほど一致します。 ノード数を変えたときの誤差の減り方は、精度を確かめるの図にまとめています。
試してみよう
Section titled “試してみよう”PARAMETERS["l"]を 2 にし、到着時刻が s、終点の深さが m になることを確かめる。PARAMETERS["g"]を 4 にすると、坂の形は変わらず、到着時刻だけが s と半分になる。make_problemのProblem([0.0, 2.0], [20], ...)の20を 8 にすると誤差は 程度、7 にすると 程度に増えます。 さらに 5 や 6 にすると、ソルバーは成功を報告するのに到着時刻が 0.2 s 以上ずれます。「成功」と「正確」は別であることがわかります。
uv run python examples/03_brachistochrone.pyexamples/03_brachistochrone.py を GitHub で見る