요즘 물리학은 전산 시뮬레이션에 의존하는 분야가 상당히 많은데 (특히 복잡한 시스템의 모델을 만들때 특정한 물리량을 계산할 closed-form expression이 존재하지 않는다던가 할 때), 전산시뮬은 특성상 유한한 공간상에서의 계산밖에 할 수 없기 때문에 알맞는 경계조건을 골라서 쓰는게 상당히 중요합니다. 그래서 요즘 물리챈에 글쓰는걸 소홀히한것 같아서 간략하게 여러 경계조건 설정에 대해서 가볍게 소개해봅니다.


먼저 한가지 짚고 넘어갈건, 시뮬레이션 종류에 따라 Discrete-time/space와 continuous-time/space 시뮬레이션이 갈리고, 공간/시간 연속이냐 불연속이냐에 따라 경계조건의 영향이 바뀌기도 하다는 거에요. continuous time 시뮬레이션은 말만 들어봤지 실제로 써본적도 없고 딱히 생각나는 예시도 없어서 여기서는 다루지 않을거고, 어차피 시간을 독립변수로 쓰는 시뮬이면 discrete time을 쓸 수밖에 없을 듯 합니다. 그리고 당연히 시간/공간상의 시뮬레이션 말고도 엄청나게 다양한 변수 값을 쓰는 시뮬레이션들이 있고 변수값의 성질에 따라 경계조건의 활용이 달라지지만 시공간상 시뮬레이션이 제일 직관적이니까 그것만 다루겠습니다.


1. 그런거 없다

시뮬중에는 아예 유한한 공간의 제약을 안두는 경우도 있어요. 점입자의 경우 그냥 x,y,z,t등 좌표값이 무제한으로 계속 커지는거야 큰 문제가 아니기 때문에 여러 점입자를 시뮬레이션 할때에는 경계조건을 따로 안 써도 시뮬 자체가 터지는 일은 사실상 없거든요 (float64의 최대값이 1.8E308정도). 다만 점입자간의 상호작용이라던가 이런걸 시뮬레이션하는게 목적인 경우 포텐셜이 localized 돼있는데 입자가 포텐셜의 범위 밖으로 날아가버리면 계속 시뮬레이션 해봤자 의미는 없겠죠.


반대로 discrete space의 경우 좀 골치아파지는데, 예를들어 n x n 격자위에서 파동함수 시뮬을 한다고 했을때, 공간의 제약이 없는 시뮬을 하려면 함수가 격자 밖으로 나가려고 할 때 마다 격자의 크기를 그에 맞춰서 계속 확장해야 하기 때문에 데이터 값이 미친듯이 커집니다 (최대 O(t^2)까지). 왜냐면 대부분의 프로그래밍 언어에서는 행렬을 정의할때 각 항의 데이터값 (e.g. float32일경우 32bit) 곱하기 행렬의 항 수 (=n^2) 에 메모리를 각각 배정을 해줘야해서 만일 nxn 행렬이 0으로 가득채워져 있어도 최대값으로 가득 채웠을때랑 데이터상의 크기가 똑같기 때문이죠. 그래서 discrete space 시뮬레이션의 경우 경계조건을 쓸 수밖에 없습니다.


2. 자유경계조건

1이랑 약간 비슷한데, 차이점은 일단 n x n 크기의 공간 (좌표값 범위 또는 격자)을 정해놓고, 시뮬레이션 하는 대상이 그 범위 밖으로 나갈 경우 그냥 추적을 포기하는 경우입니다. 예를들어 n x n 크기의 공간에서 m개의 입자의 움직임을 추적하는데 그중 하나가 x > n으로 멀리 날라가버릴 경우 그 입자는 잃어버린걸로 간주하고 나머지 m - 1개의 입자만 갖고 시뮬레이션을 하는거죠. 이렇게 하면 특정한 상황 (예를들어 여러 자유입자끼리 충돌하는 시뮬)에서 물리를 정확하게 기술할 수 있다는 장점이 있긴 한데, 계산값에서 물리량이 하나도 보존되지 않는다는 치명적인 단점이 있습니다 (운동량, 각운동량, 질량, 에너지 등등.. 입자가 탈줄하면 입자가 가지고 있는 물리량이 계에서 빠져나가니까). 그리고 끌어당기는 힘이 작용할 경우 격자 밖으로 나간 입자가 적용하는 힘이 무시되기 때문에 상황에 따라서는 부정확한 결과가 발생합니다.


3. 고정 경계조건

굉장히 흔하게 쓰이는 경계조건인데, 말그대로 경계값을 고정시켜놓는 경우를 말합니다. 파동함수 시뮬에서 경계의 값을 0으로 고정시켜놓는다던지 (=경계에 포텐셜이 무한대), 전자기학 시뮬에서 경계에 고정된 전자기 포텐셜의 근원이 있다던지 하는식으로 쓰이고, 계 내의 물리량이 보존되고 외부와의 상호작용이 없는 닫힌/고립된 계의 시뮬레이션을 할때 매우 적합한 방식입니다. 열린 계를 시뮬레이션할때에도 외부와의 상호작용이 충분히 약하거나 (예를들어 localized된 포텐셜), 아니면 외부와의 상호작용이 일정할 때 (유체역학에서 특정한 경계에서 들어오고 나가는 흐름이 시간 이외의 변수에 영향을 받지 않는다던가)에도 사용가능하고, 하여튼 쓸데가 아주 많은 방식입니다. 단점은 당연히 외부와 강한 상호작용을 하는 열린 계에 대한 시뮬레이션이 불가능하다는거고 자유입자, 자유공간상의 파동 등을 시뮬레이션을 할수가 없다는것 (사실 이것도 각종 꼼수를 동원해서 가능하게 만들 수는 있음)이고요.


4. 주기적 경계조건


마지막으로 많이 쓰이는 경계조건은 주기적 경계조건입니다. 주기적 경계조건은 무한하게 반복하는 패턴이 있다는 가정하에 뭘 시뮬레이션 하기가 아주 용이한 조건인데 여기서 중심이 되는 아이디어가, 내가 보고있는 공간의 왼쪽, 오른쪽, 위 아래에 있는 공간들이 지금 보고있는 공간과 똑같다면, 무한한 공간을 시뮬레이션하는것과 이 공간의 왼쪽, 오른쪽 경계를 서로이어주고 위쪽 아래쪽경계를 서로 이어주는거랑 구별할 수 없다는 발상입니다. (예를들어 무한히 많은 스핀 입자들을 이용한 Ising model이나 Hopf 연결망, 고체물리에서 결정구조 시뮬레이션 등) 일단 장점은 유한한 공간으로 무한한 공간을 시뮬레이션하는것과 같은 효과를 낼 수 있다는거죠. 예를들어 연속적인 공간상에서 브라우니안 운동을 하는 기체입자 시뮬레이션을 한다고 하면, 한 입자가 정해진 공간의 위쪽으로 빠져나가면 아래쪽으로 다시 들어오고, 왼쪽으로 나가면 오른쪽으로 다시 들어오고, 하는식이죠.


이 경계조건의 문제점은 굉장히 재미있는데, 공간이 정확하게 반복되는 상황 일 경우, 해당 경계조건을 직교좌표공간에서 무한히 반복하는 구조의 기본 단위를 시뮬레이션하는걸로 해석할 수 있지만, 공간이 반복되는 상황이 아닐 경우 그 공간의 상,하, 좌,우를 각각 이어버리면 원환체의 표면 위에서 시뮬레이션을 하는걸로 해석해야 하기 때문입니다 (그래서 주기적 경계조건의 또다른 이름이 원환체 경계조건입니다). 무슨소린지 감이 안오면 머릿속으로 네모난 도화지의 양쪽 끝을 테이프로 붙이고, 그렇게 생긴 종이 튜브를 꺾어서 또 위 아래를 테이프로 붙여서 아래와 같은 원환체를 만들었다고 생각해보세요. 

당연히 원환체의 표면상에서 계산한 거리 (= 시뮬레이션 상에서 계산하는 거리)와 실제 물리적 거리 (=3차원 공간에서 두 점의 실제 직선거리)가 다릅니다. 따라서 단위공간의 반복성이 보장되어있지 않은 상황에서 주기적 경계조건을 적용해버리면 계산한 물리량의 해석이 이상해질 수도 있습니다. 보통 통계적으로 유의미한 차이가 없으면 반복성이 있다고 보고 주기적 경계조건을 사용하긴 하는데, 이것도 나름 문제가 될지 안될지 확인을 미리 안해놓으면 발표할때 누가 태클걸어서 영혼까지 탈곡될 수 있으니 유의해야 할 점입니다.