여과 이론이 무엇인지 알아보기 전에 어쩌면(?) 일상생활에서도 겪을 수 있는 일화를 예시로 들어 보도록 하겠습니다.

위 그림은 체스판과 같은 격자를 나태낸 것 입니다. 격자의 작은 사각형에 흰색 혹은 검은색으로 색칠을 하였습니다. 기본 색깔이 흰색이라고 한다면, 일부분에 검은색을 칠했다고 할 수 있습니다. 이 격자의 아랫쪽에 시작이라고 쓰여진 곳에서 시작하여 도착이라고 쓰여진 반대편 쪽으로 가려고 합니다. 단, 격자에서 검은색 부분을 통해서만 이동할 수 있고, 각 위치를 기준으로 상-하-좌-우로만 움직일 수 있다고 하겠습니다. 시작점에서 부터 도착점까지 갈 수 있을까요?

답은 쉽습니다. 위 그림에서 붉은색으로 칠한 길을 따라가면 됩니다. 위 그림에서 조각(가장 작은 사각형)은 64개이며, 이 중에서 검은색으로 칠한 조각의 갯수는 28개 입니다.

똑같이 28개의 조각에 검은색을 칠한 배치입니다. 이 배치에서는 시작점에서 부터 도착점까지 검은색 조각만을 통해서는 도달할 수 없습니다. 동일한 숫자의 검은색 조각을 배치하였으나, 이 검은색 조각을 어떻게 배치하느냐에 따라서 시작점에서 도착점까지 갈 수 있을 수도 있고, 반대로 그렇지 못 할 수 도 있습니다.
시작점에서 도착점까지 갈 수 있기 위해 필요한 최소한의 검은색 조각은 8개 입니다.

위 그림처럼 검은색 조각을 한 줄로 배치하면, 단 8개의 조각만으로 시작점에서 도착점까지 도달할 수 있습니다. 물론 8개의 조각으로 반대편으로 가기 위해서는 위 그림과 같이 모든 조각을 도착점을 향해 한 줄로 배치해야 합니다. 그렇지 않은 경우에는 도착점으로 도달할 수 없습니다.
이 문제를 약간 더 분석해 보겠습니다. 64개의 조각에 8개의 검은색을 배치할 수 있는 방법의 갯수는
개 입니다. 실로 큰 숫자 입니다. 이 갯수 만큼의 조각 배치의 경우의 수 중에서 단 8개의 배치가 시작점에서 도착점까지 연결할 수 있는 배치 입니다. 그 비율은
입니다. 검은 조각의 갯수가 많으면 당연히 시작에서 도착점까지 연결할 수 있는 배치의 경우의 수는 더 늘어납니다.
여과 이론이란?
여과 이론percolation theory는 위에서 설명한 일상 생활(?)의 예시를 수학적, 물리학적으로 정교하게 연구하는 분야입니다. 위 예시에서는 흰색 바탕에 검은색 조각을 샐칙 하는 것으로 예시를 들었지만, 보다 더 물리학적으로 의미 있는 예시는 도체와 부도체의 배치에 따라 시작 지점에서 도착 지점까지 전기가 흐르게 하는 도체 연결 경로가 존재하는지 혹은 그렇지 않은지를 조사하는 것 입니다. 위 예시에 대응을 시키면, 흰색 조각은 부도체, 검은색 조각은 도체로 하여 생각할 수 있습니다. 도체 연결 망이 시작 지점 부터 도착 지점까지 연결 돼 있으면, 이 시스템에는 전기가 흐르게 되고, 그렇지 않으면 전기가 흐르지 않게 됩니다.
여과는 percolation을 우리말로 옮긴 것으로 한자로 濾過로 쓰여집니다. 그런데 여과를 사전에서 찾아 보면 제일 처음 나오는 영어 단어는 filtration 입니다. 사실 일상적인 용어에서의 여과는 여과 이론에서 말하는 여과와는 정확히 같은 것은 아닌 것 같습니다. 어쨌든 여과라는 것은 한 쪽에서 흐르기 시작한 액체(혹은 일반적으로 입자)가 필터 혹은 일반적으로 흐름을 방해하는 물질을 거쳐 계속 흐르는 것을 의미 합니다. 이 일상 생활에서의 여과의 의미가 여과 이론의 여과와 완전히 같은 것은 아닌것 같지만, 일맥상통하는 의미 인것 같기도합니다. 바로 위 문단에서 물리적으로 의미 있는 여과 이론의 대상이 도체 / 부도체로 이루어진 물질 시스템으로 생각하였는데, 만일 이를 물(액체 혹은 일반적으로 입자)이 흐를 수 있는 부분 / 물리 흐르지 못 하는 부분으로 이루어진 어떠한 물체라고 생각했을 때, 한 쪽 (시작 지점)에서 흐르기 시작한 물이 다른 쪽 (도착 지점)까지 흘러갈 수 있는지 아닌지로 생각할 수도 있습니다.
(아래에서 부터는 논의의 편의를 위해서 맨 위에서 설명했던 일상생활의 예시를 사용하도록 하겠습니다. 즉, 전체 시스템이 흰색 조각으로 돼 있을 때, 이 중 일부분에 특정 갯수의 검은색 조각을 배치한 것을 고려하도록 하겠습니다. 물리적인 상황에 맞게 검은색 조각은 도체 혹은 물이 흐를 수 있는 물질을 의미 합니다)
여과 이론에서 핵심이 되는 개념은 말 그대로 여과 입니다. 굳이 따로 설명이 필요한가 싶지만, 여과는 시작 지점에서 부터 도착 지점까지 검은색 조각만으로 이루어진 경로가 있다는 것을 의미 합니다. 또한 전체 조각에서 검은색 조각의 갯수의 비율이
컴퓨터로 계산하는 여과 이론
일반적으로 주어진
따라서, 이번 포스팅에서는 컴퓨터를 이용하여

지금까지 앞에서는 흰색 / 검은색으로 표시하였는데, 지금 부터는 편의상 붉은색 / 노란색으로 표시하도록 하겠습니다. 특별한 이유는 없고, 파이썬 프로그래밍을 하고 그래프를 그리는 과정에서 붉은색 / 노란색 / 녹색으로 표시하는 것이 조금 더 편하고 이쁘기 때문입니다. 전체 격자의 조각 100개 중에서 50개는 붉은색, 50개는 노란색 입니다. 이와 같은 배치에서 시작 지점 (아래쪽)에서 도착 지점 (위쪽)으로 여과 하는 경로가 있을까요? 답은 없다 입니다. 도착 지점에서 부터 연결된 노란색 조각을 모두 연결하면,

위 그래프와 같이 녹색 조각들이 얻어집니다. 녹색 조각은 도착 지점까지 연결 돼 있지 않습니다. 따라서, 위와 같이 구체적인 배치에서는 여과가 일어나지 않았습니다.

동일한 조건 (

위와 같습니다. 이와 같은 배치에서는 여과가 이루어 졌습니다.
동일한 조건 (
개나 됩니다. 전 세계의 슈퍼컴퓨터를 다 동원하더라도 이 숫자 만큼의 경우의 수는 모두 계산 할 수 없습니다.
따라서, 전체 경우의 수에 대해서 계산을 하는 것은 불가능 하고, 이 중에서 선택된 몇 몇개의 경우에 대해서만 계산을 할 수 밖에 없습니다. 우리의 컴퓨터의 계산 능력이 허락되는 한에서 많은 경우를 조사할 수 밖에 없습니다.

위 그림은

위와 같습니다. X축을 로그 스케일로 그리면,

위와 같습니다. 경우의 숫자를 작게 한다면,
일반적인
위에서는

위 그래프는
약간 신기(?) 한 것은
조금 큰
지금까지는

결과는 위와 같습니다.
단란의 제목에서 이미 결과를 언급했는데,

이 시뮬레이션에는 무작위성이 들어가 있기 때문에, 항상 이와 같은 결과를 얻는 것은 아니지만 대체적으로 이와 비슷한 결과를 얻게 됩니다.

위에서
여과 전이percolation transition
(
여과 현상 역시 위에서 시뮬레이션을 통해서 살펴본 것 처럼,
여과 전이 한계값percolation threshold
여과 전이의 양상이나
Percolation threshold - Wikipedia
en.wikipedia.org
일반적인 여과 전이
시각적인 편의를 위해서 지금까지는 2차원 공간에서의 격자를 생각했지만, 일반적으로는 3차원, 4차원 혹은 임의의 차원에 놓인 격자 공간에서 여과 전이를 생각할 수 있습니다. 격자 뿐 아니라 일반적인 그래프에서 여과 전이를 고려할 수 도 있습니다. 격자가 놓인 공간 차원의 증가에 따라 여과 전이가 어떻게 달라지는지에 대해서는 매우 재미난 논의가 가능하지만, 이는 어렵고 방대한 내용이라서 이번 포스팅에서 다룰 만한 내용은 아닌것 같아서 생략합니다. 시간이 허락된다면 다음 포스팅에서 하나 하나 다루도록 하겠습니다. 어쩌면, 이 포스팅에서 다룬 내용보다는 다음 포스팅에서 다룰 내용이 더 중요하다고 볼 수 있습니다.
일반적인 전이 이론과의 접목
앞에서 이미 설명한 것과 같이 여과 전이는 일반적인 전이 이론의 하나 입니다. 따라서, 일반적인 전이 이론에서 활용 될 수 있는 방법론을 활용하여 여과 전이를 설명할 수 있습니다. 예를들면 전이 한계값
파이썬 코드
위 계산에서 활용한 파이썬 코드를 공유 합니다.
import numpy as np
from matplotlib import pyplot as plt
import sys
import random
sys.setrecursionlimit(10 ** 6)
move = [[1, 0], [0, 1], [0, -1], [-1, 0]]
def select_position(N, Nreturn):
p = []
for x in range(N):
for y in range(N):
p.append([x, y])
random.shuffle(p)
return p[:Nreturn]
class DFS():
def __init__(self, A, N):
self.A = A
self.Visited = []
self.move = [[1, 0], [0, 1], [0, -1], [-1, 0]]
self.N = N
self.find = False
def return_start(self):
self.start = [[0, y] for y in range(self.N) if self.A[0, y] == 1]
def return_populated(self):
self.populated = []
for x in range(self.N):
for y in range(self.N):
if self.A[x, y] == 1:
self.populated.append([x, y])
def run_connect(self):
self.return_start()
while len(self.start) > 0 and (not self.find):
xs, ys = self.start[0]
self.start.remove([xs, ys])
self.check_connectivity(xs, ys)
return self.find
def check_connectivity(self, x, y):
if not self.find:
self.Visited.append([x, y])
if self.N - 1 == x:
self.find = True
if x == 0 and [x, y] in self.start:
self.start.remove([x, y])
for dx, dy in self.move:
nx, ny = x + dx, y + dy
if (not [nx, ny] in self.Visited) and (0 <= nx <= self.N - 1 and 0 <= ny <= self.N - 1) and (
self.A[nx, ny] == 1):
self.check_connectivity(nx, ny)
def get_percolation_probability(N, concentration):
A = np.zeros([N, N])
Nc = int(N * N * concentration)
position = select_position(N, Nc)
for x, y in position:
A[x, y] = 1
dsf = DFS(A, N)
dsf.run_connect()
for x, y in dsf.Visited:
dsf.A[x, y] = 2
plt.matshow(dsf.A, origin='lower', cmap=plt.get_cmap("RdYlGn"))
plt.show()
plt.close('all')
if __name__ == '__main__':
N = 100
p = 0.55
get_percolation_probability(N, p)
'물리학' 카테고리의 다른 글
중심력장 하에서 입자의 운동 (2) : 태양계 행성의 운동 시뮬레이션 + 파이썬 코드 (1) | 2023.05.17 |
---|---|
시간에 따른 파동 함수의 변화 계산 하기 102 : 단조화 진동자와 결맞은 상태(coherent state) (0) | 2022.06.04 |
시간에 따른 파동 함수의 변화 계산 하기 101 : 상자 속 입자 문제와 1차원 스케터링 문제 (0) | 2022.06.01 |
렌즈, 물방울에 의한 빛의 굴절 : 공간에 따라 굴절률이 변하는 상황에서 Eikonal 방정식 풀기 + 신기루 현상 설명 (0) | 2022.04.17 |
빛의 진행 경로와 페르마의 원리와 Eikonal(아이코널) 방정식 : 페르마의 원리로 부터 스넬의 법칙 유도와 수치해법으로 문제 풀기(파이썬 코드) (1) | 2022.04.16 |