본문 바로가기

파이썬(PYTHON)

분리막 형상 (대칭 vs 비대칭) 따른 확산 고찰과 그 결과

728x90

본 연구의 목적은 동일한 공간에 동일한 물질의 동일한 농도 사이에 통로 형태에 따른 분리막이 가지는 확산 현상을 고찰하여 외력(에너지)없이도 분리막에 의해 두 영역 사이에 농도 변화를 유발할 수 있음을 Python를 통해 Simulation 하였습니다.

1. 고찰 내용  :

1.1 전제 조건

1.1.1) 전체 영역 크기 : pixel 640(width) x 480(height)

1.1.2) 전체 Nano 입자 수 : 100 ea

1.1.3) 좌측 영역 크기 : pixel 270(width) x 480(height)

1.1.4) 좌측 Nano 입자 수 : 50 ea

1.1.5) 우측 영역 크기 : pixel 270(width) x 480(height)

1.1.6) 우측 Nano 입자 수 : 50 ea

1.1.7) #1 분리막  Hole : 좌측 : 100 pixel / 우측 : 50 pixel

1.1.8) #2 분리막  Hole : 좌측 : 100 pixel / 우측 : 100 pixel

 

분리막 CASE #1 :

분리막 CASE #2 :

분리막 CASE #3 :

2.1 SIMULATION 경계 조건 :

2.1.1 우측 영역과 좌측 영역에 각각 50개, 총 100개의 입자가 들어있음.

2.1.2 각각의 입자는 2차원 공간 움직에 대해서는 서로 반발하지 않고 중첩을 허용한다.

        (2차원 중첩이 3차원 중첩과 동일시 하지 않음)

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회 시도 이후

3.1 1차 결론

- 분리막 좌측의 Hole (LH)과 우측의 Hole (RH)의 크기와 입자의 확신 관계에 대한 인과 관계는 없음

- Hole를 통한 입자의 X 방향 (가로) 확산 속도는 LH와 RH간 X 방향의 기울기에 의해 좌우됨. 즉. X 방향 거리에 대한 편미분 방정식에 따름을 알 수 있음. (Y 방향에 대한 변화는 의미없는 영향을 가짐)

 

CASE #3 Source Code :

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()



 

728x90