スマホのニュースで"「複雑系」入門"という本の紹介が掲載されており、コッホ曲線について解説されていた。フラクタル図形はこれまで知らなかった(※1)が、数学で導き出される幾何学的な模様かつ現実にはあり得ないような特徴を持っている(後述のコッホ曲線の長さは無限大!?)ところにとても興味がわいた。
※1 読んですぐは聞いたことあるような、と思ったが、『クレイジーで行こう』の加藤崇さんの会社名がFractaだったのが頭の片隅にあっただけだった。
折角なので自分で描いてみるべく、久しぶりにPythonをさわる。
フラクタルと検索すると決まってロマネスコという野菜の画像が掲載されている。 個人的にあまりなじみがないが、身近にあるフラクタル構造の代表的なモノらしい (画像 from photo AC) |
フラクタル図形とは・・・
Wikipediaの定義には以下の様に書かれていたが、いまいち意味が分からない。
- ”フラクタルの特徴は直感的には理解できるものの、数学的に厳密に定義するのは非常に難しい。”
- ”図形の部分と全体が自己相似(再帰)になっているものなど”
どれだけ拡大していっても無限にディテールが描かれている様な図形が多いっぽい。Wikipediaに載っている例だけでも15個ほどあり、多くの数学者が研究テーマにするほど奥が深い概念らしい。
- カントール集合
- シェルピンスキーのギャスケット
- コッホ曲線
- ペアノ曲線
- 高木曲線
- ヒルベルト曲線
- マンデルブロ集合
- ジュリア集合
- メンガーのスポンジ
- ロマネスコ・ブロッコリー - 明確なフラクタル図形をした野菜。
- バーニングシップ・フラクタル
- リアプノフ・フラクタル
- バーンズリーのシダ
コッホ曲線
フラクタル図形の中でもシンプルなコッホ曲線。直線を三等分した真ん中部分を正三角形に立ち上げる動作を無限に繰り返す。
Wikipediaより |
様々なサイトで既にコードが掲載されているが、一応自分なりに考えて理解しながら進めてみた。一つの”トゲ”を描画する手順は以下:
- 最初の線の両端の座標(a, e)を設定
- 3等分した2点の座標(b, d)を求める
- ベクトル(bd)を60度回転させて三角形の頂点(c)を求める
- 求めた頂点(a, b, c, d, e)をリストに格納
再帰関数の考え方に少し混乱したが、ひとまずplot出来るようになった。n=5の時点で既に画面上では変化があまりない。おそらく画像の分解能を上げて作っていけば、ズームをした際に細かいところまで再現されたフラクタル図形が出来るはず。
n=1 |
n=2 |
n=3 |
n=4 |
n=5 |
n=10 |
頂点の数は2^(2*n)+1個になるため、n=10の時点でも100万点を超える。そもそもn=10の時点でも詳細は描画しきれてないので意味はないのだが、むやみやたらとnを大きくするとメモリ不足で計算できなくなった。
おそらく他のフラクタル図形でも詳細を描こうとすると意外とPCのパワー・容量を食うことになりそう。コッホ曲線以外も今後気が向いたら試してみたい。
参考にしたサイト
- Kodansha Bluebacks
- 数学の美しき謎…「フラクタル」を形成する「コッホ曲線」には、これほどの「不思議」が詰まっている (金 重明)
- https://gendai.media/articles/-/110079
- Wikipedia
- morikomorou’s blog
- 【python】matplotlibでフラクタル図形(コッホ曲線)を描く
- https://mori-memo.hateblo.jp/entry/2022/02/05/172505
- KIT数学ナビゲーション