Python3에서 반응 확산 시스템의 패턴 그리기
이 기사의 목적
반응 확산 시스템에서의 Gray-Scott 모델이라는 자기 촉매 반응의 수리 모델을 2 차원 정사각형 공간에서 Python3에 의한 시뮬레이션을 실시한다.
사용한 환경
· Python3.7
· MacOS Mojave
취급하는 시스템
이번에 생각하는 2 차원 정사각형 공간이란 구체적으로 말하면, 2 차원 평면의 영역에서 $ dx $라는 유한 길이로 분할 (이산화)한다. 또한 시간도 이산화되어 0 이상의 정수 값만을 취한다.
양해법
이번에 사용되는 Gray-Scott 모델은 다음 수식으로 표시되며 양해법을 사용하여 수치 계산을 수행합니다.
\begin{array}{l}{
\frac{\partial u}{\partial t}=D_{u} \Delta v -u^{2}v + F(1-v)} \\
{\frac{\partial v}{\partial t}=D_{v} \Delta u +u^{2}v -(F+K) u}
\end{array}
특정 시간 $ t $에서 $ u $와 $ v $는 농도에서 $ u = u (x, y, t) $, $ v = v (x, y, t) $로 표현됩니다. $ D_ {u} $, $ D_ {v} $는 확산 계수이고 계수 $ F, K $는 0 이상의 실수입니다. 2식의 우변 제1항은 확산항이라고 하고, 제2, 3항은 반응항이라고 부른다.
수치 계산으로 풀리는 식이 다음의 2식이 됩니다.
u(x,y,t+dt) = u(x,y,t) + dt \Biggl(\frac{D_{u}}{dx^{2}}\biggr(u(x+dx,y,t)+u(x−dx,y,t)+u(x,y+dy,t)+u(x,y−dy,t)−4u(x,y,t) \biggr) −u(x,y,t)^{2}v(x,y,t)+F(1−v(x,y,t)) \Biggr) \\
v(x,y,t+dt) = v(x,y,t) + dt \Biggr(\frac{D_{v}}{dx^{2}}\biggr( v(x+dx,y,t)+v(x−dx,y,t)+v(x,y+dy,t)+v(x,y−dy,t)−4v(x,y,t) \biggr) +u(x,y,t)^{2}v(x,y,t)−(F+K)u(x,y,t)) \Biggr)
단, $dx, dy$는 공간 방향에서의 유한값의 차분 간격으로 합니다.
사용한 라이브러리
import numpy as np
import matplotlib.pyplot as plt
import math
각 파라미터 설정
여기의 우변에 4종의 파라미터를 대입합니다.
Du, Dv, F, k = 0.14, 0.06, 0.035, 0.065
수치 계산 및 그리기 프로그램
이하에 수치 계산과 그레이 스케일로의 묘화를 하는 프로그램입니다. V의 값을 0에서 1까지의 그레이 스케일로 출력하도록 설정했습니다. 또, 1만회 계산하도록 프로그램을 짜고 있으므로, 실행 시간이 조금 걸릴까라고 생각합니다.
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )#解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )#解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
전체 프로그램
main.py# -*- coding: utf-8 -*-
#python3に対応化@2019/3/24
import numpy as np
import matplotlib.pyplot as plt
import math
#パラメータはここを参考にした。
# from http://www.aliensaint.com/uo/java/rd/
# -----------------------------------------------------
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.065
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )##解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )##解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
이 프로그램을 실행하면 박테리아라는 다음 패턴이 형성됩니다.
다른 파라미터의 수치 시뮬레이션
마지막으로 다른 파라미터로 실험해 보니 네 가지 패턴을 확인할 수있었습니다.
파라미터는 다음 사이트를 참고로 설정했습니다.
h tp // w w. 아엔사인 t. 코 m/우오/쟈ゔ아/rd/
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062의 경우라면, Coral Pattern이라고 하는 패턴이 됩니다
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062의 경우라면 Fingerprint라는 패턴이 됩니다.
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050의 경우라면 Spirals Dense라는 패턴이 됩니다.
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060이면 Zebrafish라는 패턴이됩니다.
참고 문헌.
· 2차원 Turing 패턴 생성
htps : // m / S chin rS pin l / ms / b9d844c98 63d 72 a dc
반응 확산계 그 자체의 설명은 다음의 2개의 문헌이 상세하다고 생각합니다
· Mechanism of pigment pattern formation
htps //w w. fbs-오사카-안녕하세요. 네 t / 피 g 멘 t 파테 r
・반응 확산계(Reaction-Diffusion system)
h tp // w w. fbs. 오사카. 아 c. jp/bs/s 혼자/오자키/우아 t%20이 s%20RD%202(오우 tぃね). htm
Reference
이 문제에 관하여(Python3에서 반응 확산 시스템의 패턴 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/syuya_abe/items/e229992288092732e40d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
· Python3.7
· MacOS Mojave
취급하는 시스템
이번에 생각하는 2 차원 정사각형 공간이란 구체적으로 말하면, 2 차원 평면의 영역에서 $ dx $라는 유한 길이로 분할 (이산화)한다. 또한 시간도 이산화되어 0 이상의 정수 값만을 취한다.
양해법
이번에 사용되는 Gray-Scott 모델은 다음 수식으로 표시되며 양해법을 사용하여 수치 계산을 수행합니다.
\begin{array}{l}{
\frac{\partial u}{\partial t}=D_{u} \Delta v -u^{2}v + F(1-v)} \\
{\frac{\partial v}{\partial t}=D_{v} \Delta u +u^{2}v -(F+K) u}
\end{array}
특정 시간 $ t $에서 $ u $와 $ v $는 농도에서 $ u = u (x, y, t) $, $ v = v (x, y, t) $로 표현됩니다. $ D_ {u} $, $ D_ {v} $는 확산 계수이고 계수 $ F, K $는 0 이상의 실수입니다. 2식의 우변 제1항은 확산항이라고 하고, 제2, 3항은 반응항이라고 부른다.
수치 계산으로 풀리는 식이 다음의 2식이 됩니다.
u(x,y,t+dt) = u(x,y,t) + dt \Biggl(\frac{D_{u}}{dx^{2}}\biggr(u(x+dx,y,t)+u(x−dx,y,t)+u(x,y+dy,t)+u(x,y−dy,t)−4u(x,y,t) \biggr) −u(x,y,t)^{2}v(x,y,t)+F(1−v(x,y,t)) \Biggr) \\
v(x,y,t+dt) = v(x,y,t) + dt \Biggr(\frac{D_{v}}{dx^{2}}\biggr( v(x+dx,y,t)+v(x−dx,y,t)+v(x,y+dy,t)+v(x,y−dy,t)−4v(x,y,t) \biggr) +u(x,y,t)^{2}v(x,y,t)−(F+K)u(x,y,t)) \Biggr)
단, $dx, dy$는 공간 방향에서의 유한값의 차분 간격으로 합니다.
사용한 라이브러리
import numpy as np
import matplotlib.pyplot as plt
import math
각 파라미터 설정
여기의 우변에 4종의 파라미터를 대입합니다.
Du, Dv, F, k = 0.14, 0.06, 0.035, 0.065
수치 계산 및 그리기 프로그램
이하에 수치 계산과 그레이 스케일로의 묘화를 하는 프로그램입니다. V의 값을 0에서 1까지의 그레이 스케일로 출력하도록 설정했습니다. 또, 1만회 계산하도록 프로그램을 짜고 있으므로, 실행 시간이 조금 걸릴까라고 생각합니다.
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )#解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )#解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
전체 프로그램
main.py# -*- coding: utf-8 -*-
#python3に対応化@2019/3/24
import numpy as np
import matplotlib.pyplot as plt
import math
#パラメータはここを参考にした。
# from http://www.aliensaint.com/uo/java/rd/
# -----------------------------------------------------
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.065
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )##解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )##解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
이 프로그램을 실행하면 박테리아라는 다음 패턴이 형성됩니다.
다른 파라미터의 수치 시뮬레이션
마지막으로 다른 파라미터로 실험해 보니 네 가지 패턴을 확인할 수있었습니다.
파라미터는 다음 사이트를 참고로 설정했습니다.
h tp // w w. 아엔사인 t. 코 m/우오/쟈ゔ아/rd/
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062의 경우라면, Coral Pattern이라고 하는 패턴이 됩니다
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062의 경우라면 Fingerprint라는 패턴이 됩니다.
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050의 경우라면 Spirals Dense라는 패턴이 됩니다.
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060이면 Zebrafish라는 패턴이됩니다.
참고 문헌.
· 2차원 Turing 패턴 생성
htps : // m / S chin rS pin l / ms / b9d844c98 63d 72 a dc
반응 확산계 그 자체의 설명은 다음의 2개의 문헌이 상세하다고 생각합니다
· Mechanism of pigment pattern formation
htps //w w. fbs-오사카-안녕하세요. 네 t / 피 g 멘 t 파테 r
・반응 확산계(Reaction-Diffusion system)
h tp // w w. fbs. 오사카. 아 c. jp/bs/s 혼자/오자키/우아 t%20이 s%20RD%202(오우 tぃね). htm
Reference
이 문제에 관하여(Python3에서 반응 확산 시스템의 패턴 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/syuya_abe/items/e229992288092732e40d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이번에 사용되는 Gray-Scott 모델은 다음 수식으로 표시되며 양해법을 사용하여 수치 계산을 수행합니다.
\begin{array}{l}{
\frac{\partial u}{\partial t}=D_{u} \Delta v -u^{2}v + F(1-v)} \\
{\frac{\partial v}{\partial t}=D_{v} \Delta u +u^{2}v -(F+K) u}
\end{array}
특정 시간 $ t $에서 $ u $와 $ v $는 농도에서 $ u = u (x, y, t) $, $ v = v (x, y, t) $로 표현됩니다. $ D_ {u} $, $ D_ {v} $는 확산 계수이고 계수 $ F, K $는 0 이상의 실수입니다. 2식의 우변 제1항은 확산항이라고 하고, 제2, 3항은 반응항이라고 부른다.
수치 계산으로 풀리는 식이 다음의 2식이 됩니다.
u(x,y,t+dt) = u(x,y,t) + dt \Biggl(\frac{D_{u}}{dx^{2}}\biggr(u(x+dx,y,t)+u(x−dx,y,t)+u(x,y+dy,t)+u(x,y−dy,t)−4u(x,y,t) \biggr) −u(x,y,t)^{2}v(x,y,t)+F(1−v(x,y,t)) \Biggr) \\
v(x,y,t+dt) = v(x,y,t) + dt \Biggr(\frac{D_{v}}{dx^{2}}\biggr( v(x+dx,y,t)+v(x−dx,y,t)+v(x,y+dy,t)+v(x,y−dy,t)−4v(x,y,t) \biggr) +u(x,y,t)^{2}v(x,y,t)−(F+K)u(x,y,t)) \Biggr)
단, $dx, dy$는 공간 방향에서의 유한값의 차분 간격으로 합니다.
사용한 라이브러리
import numpy as np
import matplotlib.pyplot as plt
import math
각 파라미터 설정
여기의 우변에 4종의 파라미터를 대입합니다.
Du, Dv, F, k = 0.14, 0.06, 0.035, 0.065
수치 계산 및 그리기 프로그램
이하에 수치 계산과 그레이 스케일로의 묘화를 하는 프로그램입니다. V의 값을 0에서 1까지의 그레이 스케일로 출력하도록 설정했습니다. 또, 1만회 계산하도록 프로그램을 짜고 있으므로, 실행 시간이 조금 걸릴까라고 생각합니다.
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )#解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )#解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
전체 프로그램
main.py# -*- coding: utf-8 -*-
#python3に対応化@2019/3/24
import numpy as np
import matplotlib.pyplot as plt
import math
#パラメータはここを参考にした。
# from http://www.aliensaint.com/uo/java/rd/
# -----------------------------------------------------
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.065
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )##解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )##解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
이 프로그램을 실행하면 박테리아라는 다음 패턴이 형성됩니다.
다른 파라미터의 수치 시뮬레이션
마지막으로 다른 파라미터로 실험해 보니 네 가지 패턴을 확인할 수있었습니다.
파라미터는 다음 사이트를 참고로 설정했습니다.
h tp // w w. 아엔사인 t. 코 m/우오/쟈ゔ아/rd/
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062의 경우라면, Coral Pattern이라고 하는 패턴이 됩니다
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062의 경우라면 Fingerprint라는 패턴이 됩니다.
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050의 경우라면 Spirals Dense라는 패턴이 됩니다.
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060이면 Zebrafish라는 패턴이됩니다.
참고 문헌.
· 2차원 Turing 패턴 생성
htps : // m / S chin rS pin l / ms / b9d844c98 63d 72 a dc
반응 확산계 그 자체의 설명은 다음의 2개의 문헌이 상세하다고 생각합니다
· Mechanism of pigment pattern formation
htps //w w. fbs-오사카-안녕하세요. 네 t / 피 g 멘 t 파테 r
・반응 확산계(Reaction-Diffusion system)
h tp // w w. fbs. 오사카. 아 c. jp/bs/s 혼자/오자키/우아 t%20이 s%20RD%202(오우 tぃね). htm
Reference
이 문제에 관하여(Python3에서 반응 확산 시스템의 패턴 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/syuya_abe/items/e229992288092732e40d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import numpy as np
import matplotlib.pyplot as plt
import math
여기의 우변에 4종의 파라미터를 대입합니다.
Du, Dv, F, k = 0.14, 0.06, 0.035, 0.065
수치 계산 및 그리기 프로그램
이하에 수치 계산과 그레이 스케일로의 묘화를 하는 프로그램입니다. V의 값을 0에서 1까지의 그레이 스케일로 출력하도록 설정했습니다. 또, 1만회 계산하도록 프로그램을 짜고 있으므로, 실행 시간이 조금 걸릴까라고 생각합니다.
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )#解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )#解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
전체 프로그램
main.py# -*- coding: utf-8 -*-
#python3に対応化@2019/3/24
import numpy as np
import matplotlib.pyplot as plt
import math
#パラメータはここを参考にした。
# from http://www.aliensaint.com/uo/java/rd/
# -----------------------------------------------------
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.065
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )##解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )##解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
이 프로그램을 실행하면 박테리아라는 다음 패턴이 형성됩니다.
다른 파라미터의 수치 시뮬레이션
마지막으로 다른 파라미터로 실험해 보니 네 가지 패턴을 확인할 수있었습니다.
파라미터는 다음 사이트를 참고로 설정했습니다.
h tp // w w. 아엔사인 t. 코 m/우오/쟈ゔ아/rd/
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062의 경우라면, Coral Pattern이라고 하는 패턴이 됩니다
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062의 경우라면 Fingerprint라는 패턴이 됩니다.
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050의 경우라면 Spirals Dense라는 패턴이 됩니다.
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060이면 Zebrafish라는 패턴이됩니다.
참고 문헌.
· 2차원 Turing 패턴 생성
htps : // m / S chin rS pin l / ms / b9d844c98 63d 72 a dc
반응 확산계 그 자체의 설명은 다음의 2개의 문헌이 상세하다고 생각합니다
· Mechanism of pigment pattern formation
htps //w w. fbs-오사카-안녕하세요. 네 t / 피 g 멘 t 파테 r
・반응 확산계(Reaction-Diffusion system)
h tp // w w. fbs. 오사카. 아 c. jp/bs/s 혼자/오자키/우아 t%20이 s%20RD%202(오우 tぃね). htm
Reference
이 문제에 관하여(Python3에서 반응 확산 시스템의 패턴 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/syuya_abe/items/e229992288092732e40d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )#解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )#解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
main.py
# -*- coding: utf-8 -*-
#python3に対応化@2019/3/24
import numpy as np
import matplotlib.pyplot as plt
import math
#パラメータはここを参考にした。
# from http://www.aliensaint.com/uo/java/rd/
# -----------------------------------------------------
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.065
n = 200
Z = np.zeros((n+2,n+2), [('U', np.double), ('V', np.double)] )
U,V = Z['U'], Z['V']
u,v = U[1:-1,1:-1], V[1:-1,1:-1]#それぞれ-1から1までを範囲とする
r = 20
u[...] = 1.0
U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50
V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25
#初期濃度はランダム関数で与える
u += 0.05*np.random.random((n,n))
v += 0.05*np.random.random((n,n))
plt.ion()
size = np.array(Z.shape)
dpi = 72.0
figsize= size[1]/float(dpi),size[0]/float(dpi)
fig = plt.figure(figsize=figsize, dpi=dpi, facecolor="white")
fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False)
im = plt.imshow(V, interpolation='bicubic', cmap=plt.cm.gray_r)
plt.xticks([])
plt.yticks([])
for i in range(10000):#陽解法
Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] )
Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] )
u += (Du*Lu - u*v*v + F *(1-u) )##解く式1
v += (Dv*Lv + u*v*v - (F+k)* v )##解く式2
im.set_data(V)#Vを出力
im.set_clim(vmin=V.min(), vmax=V.max())
plt.draw()
plt.ioff()
plt.show()
이 프로그램을 실행하면 박테리아라는 다음 패턴이 형성됩니다.
다른 파라미터의 수치 시뮬레이션
마지막으로 다른 파라미터로 실험해 보니 네 가지 패턴을 확인할 수있었습니다.
파라미터는 다음 사이트를 참고로 설정했습니다.
h tp // w w. 아엔사인 t. 코 m/우오/쟈ゔ아/rd/
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062의 경우라면, Coral Pattern이라고 하는 패턴이 됩니다
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062의 경우라면 Fingerprint라는 패턴이 됩니다.
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050의 경우라면 Spirals Dense라는 패턴이 됩니다.
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060이면 Zebrafish라는 패턴이됩니다.
참고 문헌.
· 2차원 Turing 패턴 생성
htps : // m / S chin rS pin l / ms / b9d844c98 63d 72 a dc
반응 확산계 그 자체의 설명은 다음의 2개의 문헌이 상세하다고 생각합니다
· Mechanism of pigment pattern formation
htps //w w. fbs-오사카-안녕하세요. 네 t / 피 g 멘 t 파테 r
・반응 확산계(Reaction-Diffusion system)
h tp // w w. fbs. 오사카. 아 c. jp/bs/s 혼자/오자키/우아 t%20이 s%20RD%202(오우 tぃね). htm
Reference
이 문제에 관하여(Python3에서 반응 확산 시스템의 패턴 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/syuya_abe/items/e229992288092732e40d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Du, Dv, F, k = 0.16, 0.08, 0.060, 0.062
Du, Dv, F, k = 0.19, 0.05, 0.060, 0.062
Du, Dv, F, k = 0.12, 0.08, 0.020, 0.050
Du, Dv, F, k = 0.16, 0.08, 0.035, 0.060
· 2차원 Turing 패턴 생성
htps : // m / S chin rS pin l / ms / b9d844c98 63d 72 a dc
반응 확산계 그 자체의 설명은 다음의 2개의 문헌이 상세하다고 생각합니다
· Mechanism of pigment pattern formation
htps //w w. fbs-오사카-안녕하세요. 네 t / 피 g 멘 t 파테 r
・반응 확산계(Reaction-Diffusion system)
h tp // w w. fbs. 오사카. 아 c. jp/bs/s 혼자/오자키/우아 t%20이 s%20RD%202(오우 tぃね). htm
Reference
이 문제에 관하여(Python3에서 반응 확산 시스템의 패턴 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/syuya_abe/items/e229992288092732e40d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)