본 연구의 목적은 동일한 공간에 동일한 물질의 동일한 농도 사이에 통로 형태에 따른 분리막이 가지는 확산 현상을 고찰하여 외력(에너지)없이도 분리막에 의해 두 영역 사이에 농도 변화를 유발할 수 있음을 Python를 통해 Simulation 하였습니다.
1. 고찰 내용 :
2.1.1 우측 영역과 좌측 영역에 각각 50개, 총 100개의 입자가 들어있음.
2.1.2 각각의 입자는 2차원 공간 움직에 대해서는 서로 반발하지 않고 중첩을 허용한다.
2.1.3 각각의 입자의 현재 위치 좌표 x, y에 대해 random한 값을 취하여 이동함.
2.1.4 입자의 다음 위치는 특정 이동량에 대해 각각 random 값에 의해 (-) 또는 (+) 되어 다음 위치 좌표 x, y를 취함.
2.1.5 입자의 다음 위치 좌표가 주어진 영역의 경계면과 분리막 경계면의 값을 취할 경우 (-)는 (+)로, (+)는 (-)를 취함.
2.1.6 입자의 중심 위치 좌표 (x, y)와 입자의 반지름을 고려한 위치 좌표 x, y에 대해 경계 조건을 취함.
3. 1 1차 Simulation 결과 : 약 80000회 시도 이후
- Hole를 통한 입자의 X 방향 (가로) 확산 속도는 LH와 RH간 X 방향의 기울기에 의해 좌우됨. 즉. X 방향 거리에 대한 편미분 방정식에 따름을 알 수 있음. (Y 방향에 대한 변화는 의미없는 영향을 가짐)
import pygame
import time, random
pygame.init()
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("NANO 3")
done = False
clock = pygame.time.Clock()
myFont1 = pygame.font.Font(None, 50)
myFont2 = pygame.font.Font(None, 50)
pos_x = []
pos_y = []
EA = 50
RAD = 5
K = 3
frame = 0
BW = 50
SB = int((SCREEN_WIDTH - BW)/2)
for i in range(EA):
pos_x.append(random.randint(RAD+K+1, SB-RAD-K))
pos_y.append(random.randint(RAD+K+1, SCREEN_HEIGHT-RAD-K-1))
for i in range(EA):
pos_x.append(random.randint(SB+BW+RAD+K+1, SCREEN_WIDTH-RAD-K-1))
pos_y.append(random.randint(RAD+K+1, SCREEN_HEIGHT-RAD-K-1))
def wall():
pygame.draw.line(screen, '#00FF00', [SB, 0], [SB, 190], RAD+K)
pygame.draw.line(screen, '#00FF00', [SB, 190], [SB+BW, 215],RAD+K)
pygame.draw.line(screen, '#00FF00', [SB+BW, 215], [SB+BW, 0], RAD+K)
pygame.draw.rect(screen, '#00FF00', (SB, 0, BW, 190), 0)
pygame.draw.line(screen, '#00FF00', [SB, 480], [SB, 290], RAD+K)
pygame.draw.line(screen, '#00FF00', [SB, 290], [SB+BW, 265], RAD+K)
pygame.draw.line(screen, '#00FF00', [SB+BW, 265], [SB+BW, 480], RAD+K)
pygame.draw.rect(screen, '#00FF00', (SB, 290, BW, 190), 0)
def wall_boundry(x, y, RAD, K):
a1, b1, c, d = pygame.Surface.get_at(screen, (x-RAD-K, y))
a2, b2, c, d = pygame.Surface.get_at(screen, (x+RAD+K, y))
a3, b3, c, d = pygame.Surface.get_at(screen, (x, y-RAD-K))
a4, b4, c, d = pygame.Surface.get_at(screen, (x, y+RAD+K))
# 적색 입자간 반발
#if a1 == 255:
# x += K
#elif a2 == 255:
# x -= K
#elif a3 == 255:
# y += K
#elif a4 == 255:
# y -= K
# 녹색 분리막 경계
if b1 == 255:
x += K
elif b2 == 255:
x -= K
elif b3 == 255:
y += K
elif b4 == 255:
y -= K
return x, y
if __name__ == '__main__':
while not done:
clock.tick(300)
for event in pygame.event.get():
if event.type == pygame.QUIT:
done=True
screen.fill('#000000')
wall()
for i in range(len(pos_x)):
cre1 = random.random()
if cre1 > 0.5:
pos_x[i] += K
if pos_x[i] >= SCREEN_WIDTH - RAD - K:
pos_x[i] -= K
else:
pos_x[i] -= K
if pos_x[i] <= RAD + K:
pos_x[i] += K
pos_x[i], pos_y[i] = wall_boundry(pos_x[i], pos_y[i], RAD, K)
cre2 = random.random()
if cre2 > 0.5:
pos_y[i] += K
if pos_y[i] >= SCREEN_HEIGHT - RAD - K:
pos_y[i] -= K
else:
pos_y[i] -= K
if pos_y[i] <= RAD + K:
pos_y[i] += K
pos_x[i], pos_y[i] = wall_boundry(pos_x[i], pos_y[i], RAD, K)
pygame.draw.circle(screen, '#FF0000', [pos_x[i], pos_y[i]], RAD, 0)
RR_cou = 0
LL_cou = 0
for i in range(len(pos_x)):
if pos_x[i] < SB:
LL_cou += 1
elif pos_x[i] > SB+BW:
RR_cou += 1
LL_text = myFont1.render(str(LL_cou), True, '#FFFFFF')
screen.blit(LL_text, [100, 100])
RR_text = myFont1.render(str(RR_cou), True, '#FFFFFF')
screen.blit(RR_text, [500, 100])
pygame.display.update()
pygame.quit()