Continue(s)

Twitter:@dn0t_ GitHub:@ogrew

Rustでフラクタル図形の次元を求める

はじめに

最近読み始めたこの本がとても面白い。フラクタル幾何学が専門の大学教授が私のようなアマチュア数学ファン向けに『フラクタル』な図形が持つ学術的な面白さ、あるいは自然界に見られる『フラクタル』の神秘性についてコンパクトに解説する内容である。

日本では岩波科学ライブラリーから出ているが、原著はオックスフォード大学出版局が出している「Very Short Introduction」というシリーズから出版されている。

今回はこの本で解説されていた「フラクタル図形の次元」について調べたことをまとめたい。

フラクタル図形

フラクタル』と言う言葉を聞くと人それぞれ思い浮かぶものが違うと思う。

※もしもポロックの名前がすぐ出てきたとしたらあなたは相当のフラクタル通でしょう。

ぱっと見でそれがフラクタルの対象であるかの判断はそう難しくなさそうだが、逆にその"定義"となるとはっきりと決めるのは難しいらしい。

こういうことは数学ではよくあることのようだ。

例えばF(x)=x^{2}-x+2を見て関数だと言えても、逆に関数とは何か?という質問に答えるのは慎重になる。

なので、今回はその定義自体には深く踏み込まない。あくまで自己相似性をもった図形、つまりその図形の一部分に図形全体と相似な形を内包するような図形、というおそらく一番簡潔な定義に留める。

そして今回はそのフラクタル図形の次元を求めてみたい。

フラクタル図形の次元?

次元とはなんであるか、というのもまた難しい質問だと思う。私も自信を持って応えられる自信はない。

しかし、次元がわかったら何が便利かという目線で考えるとぱっと見えてくるところがある。

それは比較することができるかどうかの判断材料になる。

例えば、1次元の直線と2次元の長方形はどちらがより大きいかというのは直接比較ができない。2次元の円と3次元の四角錐でも同じことだ。

つまり、同じ次元に住む者同士で初めてその大きさを単純比較することができる。

さて、そうなったときフラクタル図形の次元はなんであるか?シェルピンスキーの三角形というくらいだから2次元?コッホ曲線というくらいだから1次元?

例としてコッホ曲線の「大きさ」を2つの次元の視点から考えてみる。

まず1次元的な「大きさ」、つまり長さは数え切れない凹凸によって成り立っていることから無限に発散することが容易に想像がつく。

他方、2次元的な「大きさ」、つまり面積はいくら遠巻きに見て図形が入り組んでいたとしても究極的にそれは線である以上0である。

つまりコッホ曲線は1次元と仮定して考えるには大きすぎ、2次元と仮定して考えると薄すぎるのである。

さてどうしたものだろうか。困った数学者たちはその図形の次元は整数値では表せないのではないかと考えた。それがフラクタル次元である。

フラクタル次元

フラクタル次元の求め方、考えた方はいくつかあるようで、今回は一番わかり易いボックスカウンティング法からフラクタル図形の次元を調べる。

ボックスカウンティング法は容量次元とも呼ばれ、名前の通り、ある図形をボックス(円とかでもいいらしい)を使って細かく分割して対象の図形と重なる部分の数を地道に数える方式である。

ここでその分割したボックスの一辺の大きさをz、図形と重なるボックスの数をN(z)とおく。求めたいフラクタル次元d

d = - lim_{z \to 0} \dfrac{log N(z)}{log z}

で求められる。プログラムで計算する場合はz=0は計算できないので複数のボックスの大きさで実験した結果を線形回帰したときの傾きから求める。

フラクタル図形を描く

なにはなくともまず、もととなるフラクタル図形を描画する必要がある。

ここで手間を掛けたくないので手慣れたp5jsでシェルピンスキーの三角形を描く。

gist.github.com

f:id:taiga006:20220412225823p:plain ※実際に出力される画像より解像度を落としています。

フラクタル次元を求める

では、本題。

今回もRustを使ってシェルピンスキーの三角形の次元を計算する。

(画像処理をRustでするというのもあんまり聞かない話だが練習と思ってやってみる。)

gist.github.com

実行結果は以下のようになる。

> cargo run ./src/sample.png 
...
Image path : ./src/sample.png
box size : 3200 -> count : 8
box size : 1600 -> count : 22
box size : 800 -> count : 53
box size : 400 -> count : 167
box size : 200 -> count : 518
box size : 100 -> count : 1569
box size : 50 -> count : 4724
box size : 25 -> count : 14220
box size : 12.5 -> count : 42855
box size : 6.25 -> count : 131197
box size : 3.125 -> count : 350352
box size : 1.5625 -> count : 715195
slope: 1.5434166 / intercept : -14.455021

求めた傾き(slope)が私たちが知りたいフラクタル次元だ。

フラクタル次元の直感的理解

d_{exptl.} \fallingdotseq 1.543

さて、この数値はどこまで信用できるのか。

実はフラクタル図形の次元の考え方にはもう少し直感的なものがある。言葉だけだと逆にわかりにくいかもしれないが、次のような論理である。

元の図形を a 倍したときにそこに現れる元の図形が  b 個であるときその図形の次元を

d = log_a {b} =  \dfrac{log_e {b}}{log_e {a}}

と考える。

この考えは

  • 直線を2倍に拡大したとき、元の図形の2個分の直線になるので d = log_2 2 = 1 次元
  • 正方形を2倍に拡大したとき、元の図形の4個分の正方形になるので d = log_2 4 = 2 次元
  • 立方体を2倍に拡大したとき、元の図形の8個分の立方体になるので d = log_2 8 = 3 次元

といった具合に私たちの普段使っている次元の拡張概念になっていることがわかる。

ちなみに今回は面倒くさすぎてやらないがメンガーのスポンジはこの定義でいけば約2.72次元になる。

ということでこの定義で今回実験したシェルピンスキの三角形を考える。

図形を2倍に拡大したとき元の図形3個分の三角形が現れる d = log_2 3 = \dfrac{log_e {3}}{log_e {2}} で求められる。近似値は

d_{theory} \fallingdotseq 1.585

ということで、今回の実験結果との誤差はおよそ 3 \%となった。

...とても精度良く結果が出たと思われたかもしれないが、種明かしをすると解析する際に用いたedge というパラメータを幾ばくか変更すると\pm10 \%くらいで値が前後する。あくまで近似値ということで。てへ。

おわりに

フラクタル図形が実は非整数の次元を持つという興味深い話を知ってから、二日がかりでいろいろ調べたり実験したりした。

フラクタル図形もちょっと足を踏み込めば、すぐに集合論や測度論といったガチ数学の分野に繋がっていることが知れたのが収穫として大きかった。

まあ、マンデルブロ集合っていうくらいですから。

ちなみに、フラクタル次元はネットで調べているとスピ系のサイトも多く引っかかるのでお気をつけください。

参考

www.youtube.com

(追記)
書いている人は数学の専門家ではないので間違いなどあればご連絡ください。特に今回フラクタル次元について書いておきながら「ハウスドルフ次元」あたりに触れていないのは私の理解が追いついていないからです。