[pythn] 30줄 칸 자동 그림

개요


python으로 단원 자동 그림을 몰래 씁니다.
arch linux, python3.5 완성.

생명 게임


생명 게임

회색 이미지처럼 자동 마톤을 처리하면scipy의 볼륨 계산은 matplitlib의 이미지 디스플레이 기능으로 쉽게 할 수 있습니다.
그림으로 보이기 때문에 축소하면 칸을 손상시킬 수 있습니다.
import numpy as np
import scipy.signal
import matplotlib.pyplot as plt

h = np.array([[1, 1, 1],
              [1, 0, 1],
              [1, 1, 1]])
def update(U):
    '''
    Update rule:
    current_state\N_neighbors | 0   1   2   3   4   5   6   7   8
    ---------------------------+----------------------------------
                             0 | 0   0   0   1   0   0   0   0   0
                             1 | 0   0   1   1   0   0   0   0   0
    '''
    N_neighbors = scipy.signal.convolve2d(U, h, boundary='wrap', mode='same')
    U_next = np.zeros_like(U)
    U_next[N_neighbors == 3] = 1
    U_next[np.logical_and(N_neighbors == 2, U == 1)] = 1
    return U_next

size = (256, 256)
U = np.random.randint(2,size=size)

fig = plt.figure()
ax = fig.add_subplot(111)
img = ax.imshow(U, interpolation="nearest", cmap=plt.cm.gray)

i = 0
while True:
    U = update(U)
    img.set_data(U)
    i += 1
    ax.set_title("t = {}".format(i))
    plt.pause(0.01)

조화 모드


조화 모드

단원 자동화의 정의에서 벗어날 수 있지만 확산 반응 시스템도 마찬가지다.
업데이트는 다음과 같은 조정 모드를 사용합니다.
\begin{align}
\frac{\partial u}{\partial t} &= D_u \nabla u + u ( 1 - u^2) - v \\
\frac{\partial v}{\partial t} &= D_v \nabla v + 3 u - 2 v 
\end{align}
$u(x, y)$를 픽셀 값으로 표시계산에만 사용됩니다.
$D_u$, $D_v달러는 확산 계수다.
이 계수는 도안이 형성되었는지 형성되지 않았는지, 발산되었는지 결정한다.
이번에는 $D.u=0.2, D_v=1.8달러로 도안이 형성되었습니다.(시도 및 오류에 의해 결정됨)
이번에는 scipy의 라프라스 필터로 $\nabla달러를 계산합니다.
import numpy as np
import scipy.ndimage.filters
import matplotlib.pyplot as plt

lap = lambda X: scipy.ndimage.filters.laplace(X)
def update(U, V, Du=0.2, Dv=1.8):
    return (Du*lap(U) + U*(1.-U*U) - V,
            Dv*lap(V) + 3.*U - 2.*V)

size = (64, 64)
U = np.random.random(size)
V = np.random.random(size)
dt = 0.1

fig = plt.figure()
ax = fig.add_subplot(111)
img = ax.imshow(U, interpolation="nearest", cmap=plt.cm.gray)

view_interval = 10
for i in range(10000):
    dU, dV = update(U, V)
    U += dt*dU
    V += dt*dV
    if i % view_interval == 0:
        img.set_data(U)
        ax.set_title("t = {}".format(i))
        plt.pause(0.01)
plt.show()
업데이트식 대신 핏스퓨치-남운 방정식을 사용하면 이미지가 불안정하게 진동해 생물처럼 꿈틀거린다.재미있었어

좋은 웹페이지 즐겨찾기