데이터 분석/해석 및 시각화(그래프) 등 기초 컴퓨터 활용 능력
한 벡터 $\boldsymbol a$는 아래와 같이 세 성분으로 이루어져 있다.
$\boldsymbol a = (a_x,a_y,a_z)$
벡터 $\boldsymbol a$ 와 $\boldsymbol b$의 합은 새로운 벡터 $\boldsymbol c$가 된다.
\[\boldsymbol c = \boldsymbol a + \boldsymbol b\]이는 아래와 같이 각 성분들간의 합을 수행하고,
\[c_x = a_x+b_x, \ \ \ c_y = a_y+b_y, \ \ \ c_z = a_z+b_z\]이 결과 값이 성분으로 이루어진 벡터가 그 결과가 된다.
\[\boldsymbol c = (c_x,c_y,c_z)=(a_x+b_x,a_y+b_y,a_z+b_z)\]이는 아래와 같이 List 자료를 활용해 구현할 수 있다.
a=[3,4,5]
b=[3,-5,-2]
c=[0,0,0]
for i in range(len(a)):
c[i]=a[i]+b[i]
아래와 같이 두 벡터의 차도 새로운 벡터가 된다. \(\boldsymbol c = \boldsymbol a - \boldsymbol b\)
\[c_x = a_x-b_x, \ \ \ c_y = a_y-b_y, \ \ \ c_z = a_z-b_z\] \[\boldsymbol c = (c_x,c_y,c_z)=(a_x-b_x,a_y-b_y,a_z-b_z)\]위를 구현하면 아래와 같이 된다.
a=[3,4,5]
b=[3,-5,-2]
c=[0,0,0]
for i in range(len(a)):
c[i]=a[i]-b[i]
주어진 벡터 $\boldsymbol a$에 스칼라 $c$를 곱하면 또 다른 벡터 $\boldsymbol b$이 된다.
3차원 공간에서 각 벡터는 3성분을 이를 각각 $(a_x,a_y,a_z)$ 라 하자.
스케일링이 된 벡터 $\boldsymbol b$는 아래와 같이 계산된다.
\[(b_x,b_y,b_z)=(ca_x,ca_y,ca_z)\]위를 Python의 List, 그리고 NumPy를 가지고 각기 표현할 수도 있겠다.
## List로 구현
c=0.3
a=[1,2,3]
b=[] # empty list
for i in range(3): ## iteration
b.append(c*a[i])
## Range와 len의 조합을 활용해, 임의의 크기를 가진 list에 적용 가능
c=0.3
a=[1,2,3]
b=[] # empty list
for i in range(len(a)): ## iteration
b.append(c*a[i])
## NumPy로 구현
c=0.3
a=np.array([1,2,3])
b=c*a ## broadcasting (?!)
벡터는 방향과 크기를 모두 가지고 있다. 한 벡터 $\boldsymbol a$의 크기를 $|\boldsymbol a|$라 표기하자. 이는 다음과 같이 정의된다.
\[|\boldsymbol a|=\sqrt{a_x^2+a_y^2+a_z^2}\]이를 List를 활용해 구현한다면:
a=[2,3,4]
mag=a[0]**2+a[1]**2+a[2]**2
mag=mag**0.5
혹은 numpy를 활용해서 아래와 같이 구현할 수 있다.
import numpy as np
a=np.array([2,3,4])
mag=(a**2).sum()
mag=mag**0.5
# 혹은 더 줄여서
mag=((a**2).sum())**0.5
벡터 $\boldsymbol a$의 크기가 1 이라면 (즉 $|\boldsymbol a=1|$), 벡터 $\boldsymbol a$ 를 단위 벡터(unit vector)라 부른다. 즉 단위 벡터란, 크기가 1인 벡터를 뜻한다. 주어진 한 벡터 $\boldsymbol a$의 단위 벡터를 $\bar{\boldsymbol a}$라 할 때, $\boldsymbol a$와 $\bar{\boldsymbol a}$의 관계를 다음과 같이 표현할 수 있다:
\[(\bar a_x,\bar a_y,\bar a_z) =\bigg( \frac{a_x}{\sqrt{a_x^2+a_y^2+a_z^2}}, \frac{a_y}{\sqrt{a_x^2+a_y^2+a_z^2}}, \frac{a_z}{\sqrt{a_x^2+a_y^2+a_z^2}} \bigg)\]이와 같은 연산을 Python을 활용해 아래와 같이 구현할 수 있겠다.
def get_mag(v):
import math
return math.sqrt(v[0]**2+v[1]**2+v[2]**2)
혹은 아래와 같이 math 페키지 없이 구현할 수 있겠다.
def get_mag(v):
return (v[0]**2+v[1]**2+v[2]**2)**0.5
두 3D 벡터가 주어졌을 때 사이 끼인 각을 구하려면, 앞서 활용된 서로다른 두 벡터의 정의를 함께 활용할 수 있다. 즉
\[\boldsymbol a \cdot \boldsymbol b=a_1b_1+a_2b_2+a_3b_3=\sum_i^3a_ib_i=|\boldsymbol a||\boldsymbol b|\cos\theta\]위 식을 정리하여 활용하면 아래와 같다.
\[\frac{a_1b_1+a_2b_2+a_3b_3}{|\boldsymbol a||\boldsymbol b|}=\cos\theta\]따라서
\[\theta=\cos^{-1}\bigg(\frac{a_1b_1+a_2b_2+a_3b_3}{|\boldsymbol a||\boldsymbol b|}\bigg)\]위를 math모듈과 그 모듈내의 sqrt, acos을 활용하여 아래와 같은 간단한 코드를 작성할 수 있다. <aside><p>sqrt는 square root, 즉 제곱근에서 따왔고 acos 함수는 arccosine, 즉 코사인 함수의 역함수, $\cos^{-1}$ 에서 따왔다. </p></aside>
def get_ang(a,b):
import math
dotprod=0.
for i in range(len(a)):
dotprod+=a[i]*b[i]
costh=dotprod/(get_mag(a)*get_mag(b))
print(f'costh:{costh}')
th=math.acos(costh)
return th
a=[1,0,0]
b=[0,1,0]
angle=get_ang(a,b)
print('ang in radian:', angle)
## angle to degree?
print('ang in degree:', angle*180/3.141592)
## 정확히 90도가 아니라 90.00001872397223 로 표현된다면??? 무엇 때문일까?
## cubic 결정구조내의 밀러 인덱스 [uvw]로 주어진 결정방위에 해당하는 unit vector 구하기
miller1=np.array([u1,v1,w1])
unit_vector1=miller / get_mag(miller1)
miller2=np.array([u2,v2,w2])
unit_vector2=miller / get_mag(miller2)
angle=get_ang(unit_vector1,unit_vector2)
angle*180/np.pi ## np.pi: 원주율
np.deg2rad(angle) ## np 패키지내의 메소드 활용 가능
사이의 각도?
따라서, $c/a$ ratio가 알려진 Tetragonal의 Miller index [$u_1v_1w_1$]로 표현된 결정방위의 실제 길이는: \(\sqrt{ (u_1\times 1)^2+(v_1\times 1)^2+(w_1\times \frac{c}{a})^2 }\)
def miller2vect_tetragonal(miller,ca_ratio):
u,v,w=miller
## 오직 z성분값을 구할때만 c over a 비율이 곱해진 것에 유의하시오.
x=u
y=v
z=w*ca_ratio
return x,y,z
위 결과인 벡터 $(x,y,z)$를 unit 벡터 $(\bar x,\bar y,\bar z)$로 바꾸면? \(\bar x= \frac{x}{\sqrt{x^2+y^2+{\color{red}z}^2}} = \frac{x}{\sqrt{u^2+v^2+({\color{red} w\frac{c}{a}})^2}} \newline \bar y= \frac{y}{\sqrt{x^2+y^2+{\color{red}z}^2}} = \frac{y}{\sqrt{u^2+v^2+({\color{red} w\frac{c}{a}})^2}} \newline \bar z= \frac{z}{\sqrt{x^2+y^2+{\color{red}z}^2}} = \frac{z}{\sqrt{u^2+v^2+({\color{red} w\frac{c}{a}})^2}} \newline\)
def m2unitv_tetragonal(miller,ca_ratio):
v=miller2vect_tetragonal(miller,ca_ratio)
v=np.array(v)
mag=get_mag(v)
return v/mag ## element-wise operation
um1=m2unitv_tetragonal(m1) um2=m2unitv_tetragonal(m2)
get_ang(um1,um2) #
## 8.5. 예시 5:
- Tetragonal 내의 결정면 $(hkl)$의 수직 방향은?
결정 방향(crystal direction)과 다르게 결정면의 수직방향은 (norm of crystal plane)
다른 방식으로 영향을 받는다.
결정 방향의 경우 아래와 같이 벡터로 바뀌었다면
$(x,y,z)=(u,v,w{\color{red}\frac{c}{a}})$
결정 면의 수직방향은 아래와 같이 바뀐다.
$(x,y,z)=(h,k,l{\color{green}\frac{a}{c}})$
- 두 결정면 $(h_1,k_1,l_1)$과 $(h_2,k_2,l_2)$의 수직선 사이의 각도 구하는 Python script 작성해보기
## 8.6. 예시 6 (take-home)
cubic내에서는 $[101]$ 결정방향과 $(101)$면의 법선방향이 일치한다. 하지만
Tetragonal의 경우 $[101]$ 결정방향과 $(101)$면의 법선 방향이 일치하지 않는다.
$\beta$Tin은 상온에서 Body-centered tetragonal 구조를 가진다. 격자상수 $a,b,c$가
각각 5.81, 5.81, 3.18 $\AA$ 라면, $[101]$ 결정 방향과 $(101)$ 결정면의 법선 방향
사이의 끼인 각도는 얼마인가? 이미 작성된 Python script를 활용하고, 보완하거나 추가하여
각도를 계산해보자.
# 9. 외적 (cross product)
- 설명
두 벡터 $\boldsymbol a, \boldsymbol b$의 외적이 다음과 같이 표현된다.
$$
\boldsymbol c = \boldsymbol a \times \boldsymbol b
$$
$$
c_i=\sum_j^3 \sum_k^3 \epsilon_{ijk}a_jb_k \newline
c_x= a_yb_z - a_zb_y \newline
c_y= a_zb_x - a_xb_z \newline
c_z= a_xb_y - a_yb_x
$$
어떻게 파이썬으로 구현할 수 있나?
```python
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.zeros(3)
c[0]=a[1]*b[2]-a[2]*b[1]
c[1]=a[2]*b[0]-a[0]*b[2]
c[2]=a[0]*b[1]-a[1]*b[0]
전위선 (dislocation line)의 방향 $\boldsymbol{l}$이고 버거스 벡터의 방향 $\boldsymbol{b}$이라면 슬립면의 법선 벡터 $\boldsymbol{n}$은 다음의 관계를 가진다.
\[\boldsymbol{n}=\boldsymbol{l}\times \boldsymbol{b}\]위를 통해 임의의 전위 선 방향 $\boldsymbol{l}=[uvw]$와 버거스 벡터 $\boldsymbol{b}=[hkl]$ 가 주어진 cubic 결정 구조에서 슬립면 벡터 $\boldsymbol{n}$ 을 계산하는 함수를 작성해보시오.
앞선 예시에서 주어진 결정법선 $n$을 miller index로 구해보시오.