gray_scott.py
code:gray_scott.py
# -*- coding: utf-8 -*-
これなんだっけ?あんも.icon
特別なコメントの記法をすると文字コードとかを指定できるのかな code:gray_scott.py
import sys, os
sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定
import numpy as np
from alifebook_lib.visualizers import MatrixVisualizer
code:gray_scott.py
# 初期化
u = np.ones((SPACE_GRID_SIZE, SPACE_GRID_SIZE))
v = np.zeros((SPACE_GRID_SIZE, SPACE_GRID_SIZE))
code:gray_scott.py
# 中央にSQUARE_SIZE四方の正方形を置く
SQUARE_SIZE = 20
u[SPACE_GRID_SIZE//2-SQUARE_SIZE//2:SPACE_GRID_SIZE//2+SQUARE_SIZE//2,
SPACE_GRID_SIZE//2-SQUARE_SIZE//2:SPACE_GRID_SIZE//2+SQUARE_SIZE//2] = 0.5
v[SPACE_GRID_SIZE//2-SQUARE_SIZE//2:SPACE_GRID_SIZE//2+SQUARE_SIZE//2,
SPACE_GRID_SIZE//2-SQUARE_SIZE//2:SPACE_GRID_SIZE//2+SQUARE_SIZE//2] = 0.25
//: 切り捨て除算
グリットに分けているので整数にしたい
スライスで特定の範囲のみ値を書き換える
初期値を与える
code:gray_scott.py
# 対称性を壊すために、少しノイズを入れる
u += np.random.rand(SPACE_GRID_SIZE, SPACE_GRID_SIZE)*0.1
v += np.random.rand(SPACE_GRID_SIZE, SPACE_GRID_SIZE)*0.1
初期値にゆらぎを与えるのが目的
対称性を崩すとパターンが生じやすいから
code:gray_scott.py
while visualizer: # visualizerはウィンドウが閉じられるとFalseを返す
for i in range(VISUALIZATION_STEP):
# ラプラシアンの計算
laplacian_u = (np.roll(u, 1, axis=0) + np.roll(u, -1, axis=0) +
np.roll(u, 1, axis=1) + np.roll(u, -1, axis=1) - 4*u) / (dx*dx)
laplacian_v = (np.roll(v, 1, axis=0) + np.roll(v, -1, axis=0) +
np.roll(v, 1, axis=1) + np.roll(v, -1, axis=1) - 4*v) / (dx*dx)
np.roll()の他の使い方があるだろうけど知らないあんも.icon
code:py
# ラプラシアンの計算
# 空間の両境界でパラメタが急に変化するため周期境界条件は不適切なので、対称境界条件を使う
# まず外側に1つ大きくした行列(u_pad, v_pad)をつくり、それによってラプラシアンを計算する
u_pad = np.pad(u, 1, 'edge')
v_pad = np.pad(v, 1, 'edge')
laplacian_u = (np.roll(u_pad, 1, axis=0) + np.roll(u_pad, -1, axis=0) +
np.roll(u_pad, 1, axis=1) + np.roll(u_pad, -1, axis=1) - 4*u_pad) / (dx*dx)
laplacian_v = (np.roll(v_pad, 1, axis=0) + np.roll(v_pad, -1, axis=0) +
np.roll(v_pad, 1, axis=1) + np.roll(v_pad, -1, axis=1) - 4*v_pad) / (dx*dx)
# その後、サイズを揃える
code:gray_scott.py
# Gray-Scottモデル方程式
dudt = Du*laplacian_u - u*v*v + f*(1.0-u)
dvdt = Dv*laplacian_v + u*v*v - (f+k)*v
u += dt * dudt
v += dt * dvdt
# 表示をアップデート
visualizer.update(u)