「縞を作れ」と一度も書いていない式から縞が出てくる。チューリングパターンを実装して、拡散の速さを揃えたら模様は消えた
約7分で読めます

「縞を作れ」と一度も書いていない式から縞が出てくる。チューリングパターンを実装して、拡散の速さを揃えたら模様は消えた


動物の体表の模様——ヒョウの斑点、シマウマの縞、フグの迷路模様——がどうやって決まるのかを、アラン・チューリングが1952年に提案した仕組みで説明できる、という話がある。「チューリングパターン」と呼ばれている。

驚くのはその仕組みの素っ気なさだ。2種類の物質があって、互いに反応しながら、それぞれの速さで拡散する。それだけ。どこにも「縞を作れ」とも「斑点にしろ」とも書いていない。

今回実装したのはGray-Scottモデルという反応拡散系だ。

ut=Du2uuv2+F(1u),vt=Dv2v+uv2(F+k)v\frac{\partial u}{\partial t} = D_u\nabla^2 u - uv^2 + F(1-u), \qquad \frac{\partial v}{\partial t} = D_v\nabla^2 v + uv^2 - (F+k)v

uu が供給される材料、vvuu を食べて増える物質。FFuu の供給率、kkvv の除去率。この2つの数字を変えるだけで、出てくる模様がまるで変わる。

実験に使ったコードの全文はGitHubに置いています

中央にひとしずく落とす

真ん中に vv を少し置いて、あとは式に任せる。

反応拡散のアニメーション。画面中央の小さな塊から始まり、波紋のように広がりながら分裂を繰り返し、迷路のような曲がりくねった帯が画面全体を埋めていく。左上にステップ数が表示され、40から16,000まで進む

ひとしずくが広がって、分裂して、迷路になる。この過程に外から与えた情報は「中央に少し置いた」ことだけだ。

FとKを42通り振る

FF を7段階、kk を6段階に振って、それぞれ9,000ステップ回した。

7行6列に並んだ42枚の模様の一覧。行が供給率F、列が除去率k。左上のほうは全面が一様に塗られ、右のほうは水玉や迷路の模様が現れ、右端の一部は真っ暗(消滅)になっている。模様が出たマスは赤い枠、一様なマスは灰色の枠で囲まれている

42通りのうち、模様と呼べるものが出たのは 17通りだけだった。16通りは高濃度が全面に広がった一様な状態、9通りは vv が死に絶えて何も残らない。

模様が出る領域は、FF-kk 平面の中の細い帯に限られている。生き物の模様が「なんとなくできる」ものではなく、パラメータがある範囲に入っていないと成立しないことが、絵として見える。

代表例を大きく描くとこうなる。

6枚の模様を大きく並べた図。迷路状の帯、細かい水玉、密集した斑点、虫食い状の穴、粒が散った模様、まばらな点。それぞれに供給率と除去率、主波長、塊の個数、面積の割合が書かれている

Fk主波長塊の数面積
0.0300.05512.61633.0%
0.0220.05112.710417.0%
0.0380.06111.75833.4%
0.0260.05812.342719.5%
0.0340.06514.4813.8%

見た目はまるで違うのに、空間フーリエ変換で測った主波長は11.7〜14.4格子とほとんど同じだった。塊の数は16個から427個まで26倍も違うのに、縞と縞の間隔はどれもほぼ12格子。

模様の「粗さ」は FFkk ではなく、拡散係数と反応速度の関係で決まる。FFkk が決めているのは、その粗さのもとでどう配線されるか(線になるか、点になるか、穴が開くか)のほうだった。

自分で FFkk を選んで見比べられるようにした。

拡散の速さを揃えると、模様は消える

チューリングの1952年の主張の核心は、「反応があるだけでは模様はできない。拡散が加わることで不安定になる」という点にある。しかも条件があって、抑制する側の物質が活性化する側より速く広がる必要がある。

これは実験で確かめられる。FFkk・初期値・乱数をすべて固定したまま、拡散係数の比 Du/DvD_u/D_v だけを変えた。

左は拡散係数の比を横軸、模様が占める面積を縦軸にした折れ線グラフ。比が1.0のとき0.00%で、1.5で5.8%、2.0で32.1%、3.0以上で43%前後の頭打ちになる。右には比が1.0、1.5、3.0のときの模様の実物が3枚並んでいて、1.0は真っ暗、1.5はまばらな粒、3.0ははっきりした迷路模様になっている

Du/DvD_u/D_v模様の面積
1.00.00%
1.10.20%
1.55.83%
2.032.05%
3.042.53%
4.043.09%

比が1.0、つまり2つの物質が同じ速さで広がるとき、模様はまったくできなかった。 反応の式は何ひとつ変えていない。変えたのは「どちらが速く広がるか」だけだ。

比を上げていくと、1.5あたりから模様が立ち上がり、2.0で一気に育ち、3.0以上で頭打ちになる。同時に主波長は53.3格子から7.6格子へと細かくなっていった。

まとめ

  • Gray-Scottモデルを実装し、FFkk を42通り振ったところ、模様が出たのは17通り。16通りは一様に埋まり、9通りは消滅した
  • 見た目が違う模様でも主波長は11.7〜14.4格子とほぼ同じ。塊の数は16個から427個まで26倍違うのに
  • 拡散係数の比を1.0にすると模様の面積は0.00%。反応の式を変えずに、広がる速さの差だけで模様の有無が決まる
  • 比を上げると模様が育ち(2.0で32%)、3.0以上で頭打ち。同時に波長は53.3から7.6へ細かくなる

「縞を作れ」と書かれていない式から縞が出てくる、という話は本当だった。ただしそれは、パラメータが細い帯に入っているときかつ抑制側が速く広がるときに限られる。


42通り試して、25通りは何も起きなかった。引っかかったのはそちらのほうだ。

チューリングパターンの話は、たいてい成功例の絵と一緒に紹介される。ヒョウの斑点、フグの迷路、貝殻の縞。私も知識としてはそこまで知っていた。だが実際に FFkk を振ってみると、大半の設定では全面が一様に埋まるか、あっさり消えるかのどちらかだ。

生き物の模様が「反応拡散で説明できる」というのは、裏返せば、そのパラメータが狭い範囲に収まるように何かが調整されている、ということでもある。仕組みが単純であることと、それが機能する条件がゆるいことは、まったく別の話だった。

きれいな絵だけを見て仕組みを理解した気になっていたのは、42枚のうち17枚しか見ていなかったからだと思う。