川の分岐 — 枝の数を決めているのは「木の形式」ではない
追記(2026-08-23): 窪地埋めを入れて Hack の指数を測り直した。窪地でも系の大きさでも海の形でもなく、「流域が育つときに伸びるかどうか」だけが指数を決めていた。そして箱を縦長にすれば文献値は出るが、出しているのは壁だった——「合わせられる」は「合っている」ではない。
雨だれの跡と、地図の川
雨上がりの地面に走る流れの跡と、地図の川は同じ形をしている。DLA や 誘電破壊 の樹形とも似ているが、決めている仕組みは違う。川では「雨が降る面積の合計」がそこを流れる水の量になる——上流の流域が広いほど太い。
作り方は素直である。ランダムな起伏に南へ下る傾斜を足した地形を作り、各マスからいちばん急な下りの隣へ水を送る(D8)。標高の高い順に流量を足していけば、各マスの流量=そこより上流のマスの数になる。流量がしきい値を越えたマスを「川」と呼ぶ。
★枝の本数は次数ごとに等比で減る(Horton の法則)
川に次数をつける(Strahler 1952)。源流を 1 とし、同じ次数の川が2本合流したら +1、違う次数なら大きいほうを引き継ぐ。すると次数 ω の枝の本数が等比数列になる(Horton 1945)。その比 R_B が分岐比である。片対数で直線に乗ることを確かめた(R² = 0.98〜0.9997)。
ここで対照を置いた。「木だから等比になる」のではないか?
| 模型 | R_B(分岐比) | R_L(長さ比) | Hack の h |
|---|---|---|---|
| 完全二分木 | 2.000(厳密) | — | — |
| ランダムに対を作った二分木 | 2.000 | — | — |
| 地形の上を流すだけ | 7.59 | 1.03 | 0.49 |
| 川が地形を削ったあと | 5.32 | 1.88 | 0.46 |
| 実測の川(文献・伝聞) | 3〜5 | ≈2 | ≈0.57 |
※ 設定は上の図②と同じ(220 格子・川のしきい値 22・侵食 50 回・種3通りの平均)。設定を変えると数字は動く——別設定(200 格子・侵食 40 回)では R_B が 6.16 / 5.09、h が 0.51 / 0.48 になる。h はここでは窓なし(図②と同じ帯の全部)で、飽和した帯を落として測り直した値は次の節の表にある。
★木であることだけでは R_B = 2 になる。完全二分木でもランダムに対を作った二分木でも、きっちり 2.000 だった。いっぽう川は 5〜8——分岐比を決めているのは「枝分かれの形式」ではなく「どこに水が集まるか」である。
★川は自分の通る地形を作っている
最初の模型(ランダム地形の上を水が流れるだけ)には不満があった。実際の川は地形を削る。削った跡を水が流れ、また削る。そこで stream power law(dz/dt = −K·A^0.5·S)と斜面の崩れを交互に回してから、同じ測定をした。
①窪地が 277 → 71 に減った(74% 減)。川が自分の水路を掘るので、水が行き止まる場所が消える。
②分岐比が 6.16 → 5.09 に下がった。実測で報告される 3〜5 の上端に近づく。
③種を変えたときのばらつきも縮んだ(R_B の幅 1.20 → 1.07)。削ると構造が安定する。
「流れるだけ」と「削る」の違いが、数字にはっきり出た。葉脈と血管では費用の最小化が形を決めていたが、川では水が地形を作り、地形が水を導くという循環が形を決めている。DLA(乱数に歩かせる)とも 誘電破壊(場を解く)とも違う三つめの仕組みである。
★窪地を埋めても Hack の指数は動かなかった
前回この作品を作ったとき、h が 0.57 に届かないのは窪地埋めを入れていないせいだろうと書いた。水の 93.6% がどこかの窪地で止まっていて海まで届かないのだから、流路網そのものが歪んでいるはずだ、という筋である。系が小さいことも疑っていた。両方を測った。仮説は外れた。
窪地埋めは Priority-Flood + ε(Barnes・Lehman・Mulla 2014)で入れた。海から標高の低い順に内陸へ広げ、下れない点を溢れ口の高さ + ε まで持ち上げる。使う前に既知の答えで単体テストした——一様傾斜に1点だけ穴を掘れば溢れ口 + ε に厳密一致し、平らな 3×3 の盆地なら出口から遠い順に 3ε / 2ε / ε の階段になる。
仕組みとしては完全に効いた。窪地 277 → 0、窪地に溜まる水 93.6% → 0.0%、海に届かないセル 0。
それでも h は 0.507 → 0.506。動かなかった。差は 0.001 である。
ほかの3つも同じだった。系の大きさを 200 → 440 格子(面積 4.8 倍)にすると 0.484 → 0.462、侵食の回数を 0 → 300 回にすると 0.548 → 0.432、海(出口)の幅を南の縁ぜんぶ(200 セル)から 1 セルに絞ると 0.484 → 0.441。どれも下がる。いちばん 0.57 に近いのは侵食 0 回——削るほど遠ざかる。
なぜ窪地が効かなかったのかは、あとから見れば当たり前だった。「水が海に届かない」は流量の帳簿の話である。Hack の法則は流域の形の話で、あるマスの上流面積 A とそこまでの流路長 L は、その水がやがて海に着くかどうかとは関係なく決まる。窪地は下流へ水を渡さないだけで、上流の面積と長さは正しく積まれている。仮説は測る前から筋が通っていなかった。
★決めているのは「流域が伸びるか」だけ
面積は長さ×幅である。平均の幅を W = A/L と定義すれば A = L·W で、両対数を取ると log A = log L + log W。ここで W ∝ L^w と書けば、
h = 1/(1 + w)
という恒等式になる。つまり h > 1/2 は w < 1 と同じこと——大きい流域ほど相対的に細い(=流域が育つときに伸びる)を要求している。実測とされる 0.57 が要求するのは w = 0.754 である。
| 設定 | 経路1 流路長 L ∝ A^h | 経路2 直線距離 D | 経路3 外接箱 | 幅 w(W ∝ L^w) | 検算 1/h vs 1+w | 蛇行 L ∝ D^s |
|---|---|---|---|---|---|---|
| 流すだけ | 0.548 | 0.514 | 0.508 | 0.835 | 1.824 vs 1.835 | 1.065 |
| 侵食 40 回 | 0.484 | 0.448 | 0.449 | 1.064 | 2.064 vs 2.064 | 1.080 |
| 侵食 300 回 | 0.432 | 0.401 | 0.413 | 1.375 | 2.316 vs 2.375 | 1.072 |
| 実測の川(文献・伝聞) | ≈0.57 | — | — | 0.754 が必要 | — | — |
この模型の w は最小でも 0.835 で、削るほど 1 を超えて太くなる。流域は伸びずに丸くなっていく。だから h は 1/2 を超えられない。恒等式は独立に検算した(1/h と 1+w の相対差 0.6〜2.5%。ずれるのは中央値を L と W で別々に取っているぶんである)。
h 自体も3通りの測り方で出した。経路1 は流路長、経路2 は源流と出口を直線で結んだ距離、経路3 は上流域の外接箱の長辺=流路長を一切使わない。3つが 0.05 以内で揃うので、結論は「流路長の測り方」に乗っていない。
そして蛇行の寄与は動かない。L ∝ D^1.07 前後で、侵食を 0 → 300 回に振っても 1.05〜1.08 に留まる。h を動かしているのは川の曲がり方ではなく流域の形である。
⚠️ 測り方も直した——漸近域を宣言してから回帰する。帯の両端は飽和していた。小さい側は幅が1セル(流域が流路そのもの=L ≤ A という幾何の床に当たる)、大きい側は L が箱の高さに当たる(天井)。窓を「幅 ≥ 3 かつ L ≤ 0.4N」の帯だけに絞ると、系の大きさへの依存が縮む(窓なし 0.39〜0.48 → 窓あり 0.45〜0.48)。前回「設定で 0.44〜0.52 と動く」と書いたのは、飽和した帯を混ぜて測っていたぶんが大きい。
⚠️ 侵食 0 回の 0.548 がいちばん 0.57 に近いことは、模型が正しいことの証拠にはならない。h という 1 つの数が合うだけである(R_B は流すだけのほうが 6.16 で遠い)。
★では伸ばしてみる — 箱を縦長にすると 0.57 は出る。出しているのは壁である
恒等式 h = 1/(1+w) は「流域が伸びれば h は 1/2 を超える」と言っている。なら伸ばせばいい。格子を正方形固定から 横 × 縦 の一般形に書き換えて(数を渡せば正方形=1ビットも変わらないことを検査で固定した)、面積を保ったまま縦横比だけを振った。
予言は当たった。h は 0.411(1:1)→ 0.597(1:16)まで上がり、0.57 を素通りする。幅の指数は 1.42 → 0.66 に落ちる。縦横比 8 あたりで文献値をぴったり通過する。
ここで喜んではいけない。「合わせられた」だけかもしれない。伸ばしたのは模型か、それとも箱の横壁か。交絡を2通りに外して測った。
①箱の壁から離れた流域だけ(外接箱の長辺が短辺の4割以下=壁に触れていない流域)で測ると 0.459〜0.490。縦横比 16 倍でも動かない。
②どの箱でも同じ面積帯だけ(A = 180〜1500)で測ると 0.454 → 0.513。上がるが 0.52 を超えない——窓なしの上がり幅 +0.187 の3分の1である。
右の図が理由を言う。細長くなるのは大きい流域だけ(2.69 → 4.41)で、小さい流域は逆に丸くなる(2.93 → 1.67)。伸ばしているのは箱の横壁で、模型の中に流域を伸ばす仕組みがあるわけではない。
★だから「文献値に合わせられる」は「合っている」ではない。自由に選べるつまみが1つ(箱の形)あれば、0.57 は出せる。DLA の異方性で「★は目安のふるいで有意水準ではない、設定を変えても残るかが実質の判定」と書いたのと同じ話が、こちらでは文献値との一致について起きた。
⚠️ 2つの外し方はどちらも完全でない。①は縦横比が上がると「短辺の4割」が小さくなるので見ている流域のスケールが下がる。②は細い箱ではその面積の流域でも横壁に触れうる。だから結論は「この面積ならどちらの外し方でも 0.52 を超えない」までで、「模型の真の値は 0.47 だ」とは書かない。
⚠️ 実際、面積を 25,600 に落とすと②は 0.494 → 0.615 まで上がる。横 40 セルの箱では 1500 セルの流域が横壁を避けられない=窓が壊れる。★窓が壊れる条件が「壁に触れるとき」と一致すること自体が、伸ばしているのが壁である側の証拠になっている。
⚠️ 「小さい流域は逆に丸くなる」は面積 160,000 での測定で、25,600 では小さい流域も細長くなる(1.49 → 2.10)。向きは箱の面積で反転するので、この向きは主張しない。
⚠️ この模型の限界を3つ書いておく
①窪地は「溢れさせる」のではなく「埋める」近似である。窪地埋めは入れた(窪地 0・水は全部海へ)が、Priority-Flood + ε がやるのは地形を持ち上げることで、湖の水面を作って溢れさせているわけではない。だから湖の中の流路は ε の階段が決めた向きに走る。実際の湖は堆積の場でもあるが、その項もない。
②Hack の h が実測に届かない(理由は測った)。届かない理由は幅の指数で、この模型は自分で流域を伸ばす仕組みを持たない。箱を縦長にすれば 0.57 は出るが、それは壁が伸ばしているだけだった(上の節)。残る候補は「河道の争奪(basin capture)」——大きい流域が隣の流域の頭を奪って細長く伸びる過程で、これはこの模型にない。まだ確かめていない。
③R_B は設定で動く。系の大きさ・侵食の回数・川のしきい値を振ると 5.11〜6.46 と動いた(N=160 で 5.49、N=240 で 5.20、侵食80回で 5.11、しきい値を上げると 6.46)。だからこの模型で言えるのは「2 ではなく 5 前後」までで、「3〜5 のどこか」を当てているとは言えない。
⚠️ 道具の癖もある。流れの向きが8種類しかない(D8=8近傍の最急降下)。しかも偏っていて、最も多い向きは最も少ない向きの 41 倍あった。図の流路が 45° と 90° に見えるのはこのせいで、実際の川の蛇行はこの模型では出ない。三角格子を軸座標で丸めると偽の4回対称が立つ件と同じ家系である。
★河道の争奪——最後の候補も、流域を伸ばさなかった
発見36・37 で「h > 1/2 には流域が伸びること(幅の指数 w < 1)が要る」「箱の壁で伸ばすのは反則」と分かった。残った候補が河道の争奪——大きい流域の川が源頭を伸ばして隣の面積を奪い、細長く育つ過程である。地形を捨てて、争奪だけを規則にした模型を作った。海岸から川の先端(源頭)が上へ伸び、各手番で伸ばす源頭を「流域の面積 A の m 乗」に比例する確率で選ぶ。つまみは m だけ。
★争奪は流域を「大きく」はするが「細長く」はしなかった。最大流域の占める割合は m = 0 → 2 で増える(争奪は効いている)。それでも横壁を外した Hack の h は m = 0 / 0.5 / 1 / 1.5 / 2 で 0.499 / 0.510 / 0.457 / 0.521 / 0.487(種3通りの平均・400×200)——全部 1/2 の近くで、m について単調ですらない。幅の指数 w は 0.96〜1.09、細長さの指数(外接箱の長辺÷短辺の面積への傾き)は −0.07〜0.00=流域は相似のまま大きくなるだけ。h = 1/(1+w) の恒等式は 10% 以内で成り立つ。
これで「地形の上を流す」「削る」「箱を伸ばす」「争奪」の4つを試して、どれも壁に頼らずに 0.57 へ届かなかった。⚠️ ここでの争奪の規則(A の m 乗で源頭を選ぶ・源頭は前の向きへ進みたがる・たまに枝分かれ)は自分で決めたもので、文献の再現ではない。h と w の測り方は上と同じ(面積の帯ごとの中央値の両対数の傾き)。
どう作ったか
機械検査は61件: ①流量の保存(39743 セルで「上流の合計+1」に一致・違反0)・★水は全部どこかへ行く(海+窪地=全マス)・⚠️埋めないと窪地に9割溜まる ②Strahler 次数の規則が全川セルで成立・侵食後の最大次数 ③次数ごとの本数が等比(R² 0.98〜0.9997)・★R_B が 5 前後・⚠️設定で 5.11〜6.46 と動く ④★完全二分木とランダム二分木がどちらも 2.000・★川はそれとはっきり違う ⑤★侵食で窪地が74%減・★種のばらつきも縮む ⑥Hack の法則の形は出る(R² 0.987〜)・⚠️h が実測に届かない ⑦⚠️D8 の癖(向きが8種類・41倍の偏り)⑧種を固定すれば同じ流路網(Math.random は使わない)⑩窪地埋めの単体テスト4件(1点の穴が溢れ口+εに厳密一致・穴以外は1セルも動かない・平らな盆地は3ε/2ε/εの階段・埋めれば窪地0)⑪★水の93.6%を海へ通しても h は 0.507→0.506 で動かない ⑫★h を3通りで出して一致・恒等式 h = 1/(1+w) の検算(相対差 0.6〜1.1%)・★幅の指数だけが動き蛇行の指数は動かない・★0.57 が要求する w = 0.754 にどの設定でも届かない・⚠️窓を宣言する理由(両端の飽和)⑬★出口の幅を200分の1にしても近づかない・既定は出口の窓を入れる前と同じ結果 ⑨出荷SVG3枚。重い測定の原本は tools/explore/river-fill.js(種3通り・15分)。
出典
- 数理
- A. N. Strahler (1952) の次数づけ。R. E. Horton (1945) の分岐比・長さ比の法則。J. T. Hack (1957) の法則(L ∝ A^h)。侵食は stream power law(河川侵食の標準的な形)+斜面の拡散。D8 の流向決定は地形解析の標準。窪地埋めは R. Barnes・C. Lehman・D. Mulla (2014) の Priority-Flood(+ε 版)
- 実測の値
- R_B が 3〜5、R_L が 2 前後、h が 0.57 前後というのは文献の値を引いただけ(伝聞)で、こちらでは地図を測っていない
- こちらの主張
- 「完全二分木とランダム二分木の R_B がどちらも 2.000」「侵食を回すと窪地が 74% 減り R_B が下がり種ごとのばらつきも縮む」「窪地に溜まる水を 93.6% → 0% にしても Hack の指数は 0.001 しか動かない」「h = 1/(1+w) で、この模型の w はどの設定でも 0.57 が要求する 0.754 に届かない」「蛇行の指数 L ∝ D^s は侵食を 0→300 回に振っても 1.05〜1.08 で動かない」はこの作品で測ったもの。ただし R_B は設定で 5.11〜6.46 と動くので、実測との一致を主張しない
- 生成
- generators/river.js(多スケールノイズの地形・D8 の流向・Priority-Flood + ε の窪地埋め・出口の幅を変えられる海・流量累積・Strahler 次数・Horton のセグメント数と長さ・Hack の回帰(流路長 L・直線距離 D・上流域の外接箱の3通り)・stream power law の侵食・二分木の対照・図3枚。依存ゼロ・乱数は mulberry32)