Posts

비리얼(virial)이란 무엇인가?

Image
비리얼, 'virial'이란 표현은 'force'를 뜻하는 'vis'에서 유래됐다. 오늘은 비리얼에 대해서 이야기를 해보고자 한다. 지금까지 분자동역학(molecular dynamics, MD)을 공부하면서 '비리얼'이란 단어는 종종 들어봤지만, 내가 직접 비리얼 계수(virial coefficient)나 비리얼 응력(virial stress), 비리얼 압력(virial pressure) 등을 계산하거나, 이를 통해 퍼텐셜을 피팅해 본 적이 없기에 그냥 위키피디아에 한번 쳐보고 뭔지 모르겠다며 지나간 기억이 있다. 그런데 최근에 여러 통계역학적인 기초들, 그리고 분자동역학의 기초 기술들을 차근차근 공부하다보니 한번쯤 짚고 넘어가야 하는 주제라 생각해서 정리해보고자 한다. 내가 비리얼을 구글링하여 처음에 마주친 것은 'virial coefficient'라는 것이었다. 고등학교 시절, 우리는 이상기체의 거동을 나타내는 상태방정식으로 다음의 등식을 배웠다. $$PV  = nRT$$ 헌데, 이 상태방정식은 이상기체를 해석하는데에만 유효하며, 우리는 실재하는 분자들로 구성된 기체를 해석하기 위해 압축인자(compressibility factor) 'Z' 라는 것을 도입했다. 압축인자는 아래와 같이 정의된다. $$Z = \frac{PV}{nRT}$$ 여기서 압축인자는 상태방정식에 곱해지는 hyper parameter이며, 현재 관찰하는 기체의 거동이 이상기체의 거동으로부터 얼마나 벗어나 있는가를 나타내는 척도로 사용된다. 당연한 얘기지만 압축인자가 1일 경우 상태방정식이 정확히 이상기체상태방정식과 동일해진다. 다시 virial로 돌아가서, 'virial coefficient'는 이 압축인자를 결정하는 하나의 방법으로 'virial expansion'이라는 방식을 사용할 때, 이 expansion set의 항에 들어가는 계수들(...

격자구조 내 변형률, 응력 및 탄성계수(elastic constants)의 분석, analysis of elastic strains

이 포스팅은 Kittel의 저서 Introduction to Solid State Physics의 3장 내용의 일부를 따라가는 과정을 정리해 둔 것이다. 최근에 퍼텐셜 피팅을 진행하면서, 퍼텐셜 함수의 계수들을 결정하기 위해 탄성계수를 계산해야 하는 상황을 마주했다. 급한대로 결과를 내야 했기 때문에 Baskes의 1984년도  EAM 논문을 참고해서 일단은 명시된 수식을 그대로 코딩하고 탄성계수를 계산하긴 했으나, 그 당시에는 식의 의미를 100% 이해하고 넘어가진 못했다. 이번 포스팅은 그러한 점을 보완하기 위한 공부이다. 우리가 다루는 물질이 등방성 물질이라고 가정하자. 학부 시절, 우리가 변형률이나 응력을 계산할 때는 보통 연속체로서 물질을 다뤘다. 그러니까, 물질이 원자 하나하나의 결합으로 만들어진 구조체라고 보는 것이 아니라 그냥 하나의 덩어리라고 가정했다. 하지만 이러한 연속체 역학적 관점으로 변형을 해석하는 것은 최소한 elastic wave의 파장이 10^-8 m 이상일 때나 가능한 얘기이고, 이러한 문제가 미시적인 세계로 넘어가면, 이러한 해석 방법은 더이상 맞지 않게 된다. 우리는 연속체 역학에서 변형률과 응력을 계산하기 위해 Hooke's law와 Newton 제2법칙을 사용할 것이다. 다만, Hooke's law는 변형이 아주 작은 (= 변형이 선형적인) 구간에서만 유효한 법칙이며, 우리가 다루는 미시세계는 변형이 비선형적이라고 가정할 것이다. 앞으로는 여러가지 벡터를 정의할 것이다. 뻔한 이야기를 수식으로 풀어쓰는 과정이지만 수식 자체보다는 그 수식이 내포하는 의미를 잘 이해하는 것이 중요하다. 우리가 해석하고자 하는 고체 물질이 놓여있는 공간에 orthogonal한 세 개의 unit vector를 정의한다. $$\textbf{x}', \textbf{y}', \textbf{z}'$$ 이 고체 물질에 균일하면서도 작은 변형이 가해지면, 위에서 세 벡터로 정의한 축들의 방향과 길이는 다...

텐서플로우를 이용한 간단한 다항식 피팅(regression): 텐서플로우 기초 요소 이해

사실상 전통적인 분자동역학 분야에서는 딥러닝을 필요로 하지 않는다. 머신러닝이라 부르든, 그냥 regression이라고 부르든, 아무튼 '주어진 목적함수에 대해 목표치와 예측치 사이의 오차를 최소로 줄여나가는 fitting process에 대해서만 알고 있다면, 누구나 퍼텐셜을 피팅 할 수 있다. 텐서플로우가 주목을 받은 이유는 다양한 deep layer 구조를 쉽게 구현할 수 있도록 코드가 잘 짜여져 있기 때문인데, 그러한 연유로 만약 당신이 potential fitting을 한다면 굳이 텐서플로우를 이용할 필요는 없다. 허나, 나는 이번에 EAM potential을 피팅하는 프로젝트를 진행하면서 텐서플로우를 작업 툴로 선정했다. 그 이유는 여러가지가 있는데, 어쨌든 학문에 몸담으로 사람으로서 세간의 방법론적인 유행에 발은 맞춰놔야 하지 않나, 하는 생각도 들고, 또 앞으로 퍼텐셜의 형태가 종래의 형태와 같이 수식의 형태를 띄지 않고 인공신경망 구조로 학습되어 일종의 예측 프로그램 형태로 발전되지 않을까, 하는 생각도 들었기 때문이다. 이번 포스트는 텐서플로우 공식 홈에 있는 regression 예제 코드를 면밀히 살펴보면서, 텐서플로우의 특징, 사용방법들을 한꺼번에 알아볼 생각이다. 그러면서 나도 텐서플로우와 조금은 친해져 봐야지. 예제 코드는 다음에서 확인할 수 있다[ 예제코드 ]. 먼저 코드의 맨 윗 단을 보면 다음과 같이 세 개의 모듈이 import 되어 있다. import numpy as np import tensorflow as tf import matplotlib.pyplot as plt 'numpy'는 굳이 쓰지 않아도 되는 모듈이지만, 행렬을 많이 사용하는 코드에서 이 모듈을 쓰지 않으면 코딩이 굉장히 귀찮아진다. 여러가지 연산이라든지 행렬 선언, precision 설정 등등에서 numpy를 통한 선언이 훨씬 편하고 유용하므로 numpy를 사용하는 습관을 기르는 것이 좋다. 'matplotlib....

Ergodicity란 무엇인가?

Ergodicity를 이해하기 위해서는 우선 앙상블(ensemble)을 이해해야 한다. 관련글은 블로그의 이전 글을 참고하기 바란다[ 'Statistical Ensemble이란 무엇인가?' ]. Ergodicity의 개념은 간단한 것일지라도, 이 문제는 통계적 분석을 할 때 우선적으로 고려돼야하는 아주 중요한 개념이다. 복잡한 설명 없이, 간단한 예를 통해 ergodictiy를 이해해보자. 우리가 최근 10년간 한국에서 제일 잘팔린 치킨 브랜드를 알고 싶어한다고 치자. 우리가 활용할 수 있는 데이터는 다음의 두 가지가 있다. 첫번째, 영희네 가족이 지난 10년간 쌓아온 5000회의 주문내역. 두번째, 10년 간 한국 국민들이 주문한 내역 중 임의로 샘플링된  5000개. 둘 중 어떤 것을 골라 분석해야 모집단 전체의 통계치에 근접한 추측이 가능할까? 통계를 전혀 모르는 초등학생에게 물어보더라도, 그 사람이 정상적인 지능을 가진 인간이라면 두번째 데이터셋을 고를 것이다. 이유에 대해서는 굳이 설명 않겠다. 대신에 우리는 두 가지 데이터셋이 어떻게 다른지를 살펴볼 것이다. 우선, 두가지 경우 모두 시행 횟수는 오천번으로 동일하다. 하지만 첫번째의 경우는 한사람이 주문한 내역인 반면, 두번째의 경우는 임의로 선택된 오천명이 주문한 정보이다. 위의 상황을 통계학적인 용어로 바뀌 말하자면, 첫번째 경우는 단일 시스템에 대한 시간평균(time-averaged) 거동을 살펴볼 수 있는 자료며(= '영희내 집 치킨 주문 행태, 그 10년간의 기록'), 두번째 경우는 치킨 구매자 앙상블의 다양한 정보를 활용해 앙상블평균(ensemble-averaged) 거동을 살펴볼 수 있는 자료라고 할 수 있다. 내가 예로 든 위의 경우는 앞서 언급 했다시피 두가지 분석 결과가 서로 다를 가능성이 짙다. 분석하려는 대상이 앙상블평균거동에 훨씬 가깝고, 시간평균거동으로 분석하면 특정 앙상블 멤버의 예외성이 두드러지게 발현되기 때문이다. 하지만, 개 ...

Statistical Ensemble이란 무엇인가?

Statistical Ensemble = 통계학적 앙상블 통계역학에서 우리가 살펴보고자 하는 어떤 시스템이 있을 때, 이 시스템을 동일한 조건으로 여러개 복사하여 거대한 집합으로 만들면 '앙상블(ensemble)'이라고 한다. 여기서 핵심은 '동일한 조건'이라는 표현인데, 이것에 대해 아주 섬세한 이해가 필요하다. 현실적으로 모든 실험/계산에는 정밀도의 상한선이 정해져 있다. 예를 들어, 우리가 동전 던지기 실험을 한다고 쳤을 때, 아무리 정밀하게 동일한 방식으로 동전을 던질수 있다 하더라도 모든 조건을 이전 시행과 동일하게 구성할 수는 없다. 즉, 거시적인 관점(macroscopic view)에서 조건을 동일하게 맞추어 준다고 해도 결국 미시적인 관점(microscopic view)에서는 차이가 생기기 마련이며, 앙상블이란 개념은 이러한 상황을 반영해주는 통계적 장치라고 볼 수 있다. (하지만, 앙상블이라는 개념이 단순히 실험에서 발생하는 정밀도나 분해능의 문제로 발현된 개념이라고 보면 곤란하다!) 예를 들어, 내가 연구하고 있는 분자동역학(molecular dynamics, MD) 분야에서는 앙상블을 정의할 때 시스템의 원자 개수, 시스템의 부피, 온도 등등 (거시적인 조건들)을 고정 하더라도 실제로 각각의 원자들이 점유하는 위치나 운동에너지 등은 끝도없이 다양해 질 수 있어, 이러한 잠재적 다양성이 통계역학적 앙상블을 이루게 되는 것이다. 그런데, 만약 이러한 조합들이 앞서 기술한대로 무한정 많다면, 결과적으로 우리가 어떤 물리적 특성값을 도출하기 위해 시스템이 놓여있는 phase space 상의 모든 가능성을 훑어야 하므로, 계산이 불가능할 것이다. 따라서, 이를 해결하기 위해 우리들은 목적에 맞게 앙상블에 제약조건을 부여하여 상황을 단순화 한다. 통계역학 분야에서 앙상블의 핵심은 해당 앙상블이 가진 조건이 되는데, 예를 들어 내가 연구하고 있는 MD에서 주로 사용하는 NVE, NVT, NPT 앙상블에서는 각각...

평균값과 기댓값은 같은가?

다르다. 어떻게 다른가? 평균값은 시행결과값을 모두 더한 다음 시행횟수로 나눈 값이다. 반면 기댓값은 실험에서 관찰될 수 있는 모든 결과 값에 대해 그 값이 관측될 수 있는 확률을 모두 구하고, 다시 모든 경우에 대해 관측값과 관측될 확률을 곱하여 모두 더한 값이다. 다시 말해, 평균값이라는 것은 실제로 관측된 데이터를 정리하여 그 평균치를 도출한 것이며, 기댓값은 각각의 결과값이 관측될 수 있는 확률을 특정한 상태식 모델이나 간단한 분포 모델 등을 통해 예측하여, 그 확률을 기반으로 '기대대는 값'을 의미하는 것이다. 사람들이 종종 평균값과 기댓값을 혼동하는 이유는 항상 다음의 개념들을 공부할 때 값을 도출해내는 과정이 어떠했는가 보다는 결과값이 무엇인가를 중요하기 생각 했기 때문이다.