12/9(月) 応用科学学会シンポジウムで自動運転に関する講演を担当します☆彡

17-7. Youngのモデルでお手軽にチューリング・パターン

やること

17-5ではチューリング・パターンを作ってみましたが、微分方程式アレルギーの方にはちょっと難しかったです。今回は、Youngの単純化したモデル(David A.Young, Mathematical Biosciences 72(1), 51-58, 1984)を用いて、さらにお手軽にチューリング・パターンを楽しんでみましょう。

参考文献

論文はこちらです。

ScienceDirect

単純化したチューリングモデルについてはこちらの「セルオートマトンによるチューリングモデルの再現」の章もご参照ください。

チューリングモデルによる模様生成:いで庵

こちらもご参照ください。

Biological Patterns: Turing and Young
The development of living creatures is all about he formation of patterns. Where hairs/feathers/scales grow on the skin; where ribs form...

単純化モデル

もともとのモデルは、次のような仮定に基づいていました(図・上側)。

  • 2つの物質
  • 周囲の2物質の濃度が影響し合う
  • 2物質とも連続的な濃度(0~1)

Youngのモデルでは、次のように単純化されています(図・下側)。

  • 1つの物質
  • 周囲の濃度が影響する
  • 離散的な濃度(0または1)
David A.Young, Mathematical Biosciences 72(1), 51-58, 1984

具体的には、次のような円形の畳み込みフィルタを用いて、各セルの状態を更新していきます。畳み込んだ結果が0より大きければ1(True)、0以下であれば0(False)とします。

実行環境

WinPythonかGoogle Colaboratoryを用います。

WinPython3.6をおすすめしています。

WinPython - Browse /WinPython_3.6/3.6.7.0 at SourceForge.net
Portable Scientific Python 2/3 32/64bit Distribution for Windows

Google Colaboratoryが利用可能です。

Google Colab

ソースコード

状態の更新が1行で済むってすごくないですかこのモデル。

import numpy as np
import numpy.random as nr
from scipy import signal
import matplotlib.pyplot as plt

#============================
#設定
#============================

#フィールドサイズ
h, w = 100, 100

#パラメータ
r1 = 5
r2 = 10

w1 = 10
w2 = -3.0

#終了ステップ数
max_step = 20


#============================
#メイン処理
#============================

#フィールドの初期化
#f = np.zeros((h, w), dtype=bool) #0で初期化
f = nr.randint(0, 2, (h, w), dtype=bool) #ランダムに初期化

#畳み込み用のフィルタ
g = np.zeros((r2*2 - 1, r2*2 - 1))
for i in range(len(g)):
    for j in range(len(g[0])):
        if (i + 1 - r2)**2 + (j + 1 - r2)**2 < r1**2:
            g[i, j] = w1
        if r1**2 <= (i + 1 - r2)**2 + (j + 1 - r2)**2 < r2**2:
            g[i, j] = w2

#フィルタの表示
plt.imshow(g, cmap='RdGy', vmin=-15, vmax=15)
plt.show(), print()

#初期状態の表示
plt.imshow(f, cmap='binary', vmin=0, vmax=1)
#plt.savefig('save/{}.png'.format(0), bbox_inches='tight', pad_inches=0)
plt.show(), print()

#状態の更新
for i in range(1, max_step + 1):
    #畳み込みとフィールドの更新、0より大きければ生存(True)、0以下であれば死(False)
    f = signal.convolve2d(f, g, mode='same',boundary='wrap') >= 0
    
    #表示
    plt.imshow(f, cmap='binary', vmin=0, vmax=1)
    #plt.savefig('save/{}.png'.format(i), bbox_inches='tight', pad_inches=0)
    plt.show(), print()

基本の条件(r1=5, r2=10)

まずは、線がメインの模様です。w1=10, w2=-3.0

w2を上げると白玉に。w1=10, w2=-2.5

w2を下げると犬の糞黒玉に。w1=10, w2=-3.5

チューリング・パターンが出現するパラメータ条件を探索しました。

細い条件(r1=3, r2=6)

畳み込みフィルターの規模を小さくすると、影響される範囲が狭まって、パターンは細かくなるようです。w1=10, w2=-3.0

パラメータ条件は広くなりました。

太い条件(r1=10, r2=20)

畳み込みフィルターの規模を大きくすると、パターンは太くなります。w1=10, w2=-3.2

パラメータ条件は狭くなりました。

その他の条件

r1とr2のバランスを変えると、w1, w2のパラメータ条件も変わってくるようです。

外の円を狭くしました。r1=5, r2=8

外の円を広くしました。r1=5, r2=12

まとめ

数理モデル化とは、余計なものを取り除き、物事の本質をとらえる作業です(実はビネクラの社名もこれに由来しているとかいないとか)。これだけモデルを単純化してもチューリング・パターンが出現するのには驚かされます。

タイトルとURLをコピーしました