18. ํ…์„œ ํ•ด์„ (Tensor Analysis)

18. ํ…์„œ ํ•ด์„ (Tensor Analysis)

ํ•™์Šต ๋ชฉํ‘œ

  • ํ…์„œ์˜ ์ •์˜๋ฅผ ์ขŒํ‘œ ๋ณ€ํ™˜ ๋ฒ•์น™์˜ ๊ด€์ ์—์„œ ์ดํ•ดํ•˜๊ณ , ์Šค์นผ๋ผยท๋ฒกํ„ฐยทํ–‰๋ ฌ์„ ํ…์„œ์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์•„์ธ์Šˆํƒ€์ธ ํ•ฉ์‚ฐ ๊ทœ์•ฝ๊ณผ ์ธ๋ฑ์Šค ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…์„œ ๋ฐฉ์ •์‹์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ฐ˜๋ณ€(contravariant)ยท๊ณต๋ณ€(covariant) ํ…์„œ์˜ ๋ณ€ํ™˜ ๋ฒ•์น™์„ ๊ตฌ๋ถ„ํ•˜๊ณ , ๊ณ„๋Ÿ‰ ํ…์„œ๋ฅผ ํ†ตํ•œ ์ธ๋ฑ์Šค ์˜ฌ๋ฆผ/๋‚ด๋ฆผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ์™€ ๊ณต๋ณ€ ๋ฏธ๋ถ„์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ , ๊ณก์„  ์ขŒํ‘œ๊ณ„์—์„œ ํ…์„œ์˜ ๋ฏธ๋ถ„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ฆฌ๋งŒ ๊ณก๋ฅ  ํ…์„œ์˜ ์ •์˜์™€ ๊ธฐํ•˜ํ•™์  ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๊ฐ„๋‹จํ•œ ๊ณต๊ฐ„์—์„œ ๊ณก๋ฅ ์„ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค
  • ํ…์„œ ํ•ด์„์˜ ๋ฌผ๋ฆฌ์  ์‘์šฉ(์‘๋ ฅ ํ…์„œ, ์ „์ž๊ธฐ์žฅ ํ…์„œ, ์•„์ธ์Šˆํƒ€์ธ ๋ฐฉ์ •์‹)์„ ์„œ์ˆ ํ•˜๊ณ  Python์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค

ํ…์„œ๋Š” ์™œ ํ•„์š”ํ•œ๊ฐ€? ์ž์—ฐ ๋ฒ•์น™์€ ์ขŒํ‘œ๊ณ„์˜ ์„ ํƒ์— ๋ฌด๊ด€ํ•ด์•ผ ํ•œ๋‹ค. ์Šค์นผ๋ผ(rank-0)์™€ ๋ฒกํ„ฐ(rank-1)๋งŒ์œผ๋กœ๋Š” ์‘๋ ฅ, ๊ด€์„ฑ ๋ชจ๋ฉ˜ํŠธ, ์ „์ž๊ธฐ์žฅ ๊ฐ™์€ ๋ฌผ๋ฆฌ๋Ÿ‰์„ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์—†๋‹ค. ํ…์„œ๋Š” ์ž„์˜์˜ ์ขŒํ‘œ ๋ณ€ํ™˜์—์„œ ๋ช…ํ™•ํ•œ ๋ณ€ํ™˜ ๋ฒ•์น™์„ ๋”ฐ๋ฅด๋Š” ๊ธฐํ•˜ํ•™์  ๋Œ€์ƒ์œผ๋กœ, ๋ฌผ๋ฆฌ ๋ฒ•์น™์„ ์ขŒํ‘œ๊ณ„์— ๋…๋ฆฝ์ ์ธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ์–ธ์–ด์ด๋‹ค.


1. ํ…์„œ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

1.1 ๋™๊ธฐ: ์™œ ์Šค์นผ๋ผ์™€ ๋ฒกํ„ฐ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ๊ฐ€

๋ฌผ๋ฆฌํ•™์—์„œ ๋งŽ์€ ์–‘์€ ์Šค์นผ๋ผ(์˜จ๋„, ์—๋„ˆ์ง€)๋‚˜ ๋ฒกํ„ฐ(ํž˜, ์†๋„)๋กœ ์ถฉ๋ถ„ํžˆ ๊ธฐ์ˆ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌผ๋ฆฌ๋Ÿ‰์€ ํ•˜๋‚˜์˜ ๋ฐฉํ–ฅ์ด ์•„๋‹ˆ๋ผ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ฐฉํ–ฅ ์ •๋ณด๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค:

  • ์‘๋ ฅ ํ…์„œ(stress tensor) $\sigma_{ij}$: ๋ฉด์˜ ๋ฐฉํ–ฅ($j$)๊ณผ ๊ทธ ๋ฉด์— ์ž‘์šฉํ•˜๋Š” ํž˜์˜ ๋ฐฉํ–ฅ($i$)
  • ๊ด€์„ฑ ๋ชจ๋ฉ˜ํŠธ ํ…์„œ(moment of inertia tensor) $I_{ij}$: ๊ฐ์†๋„ ๋ฐฉํ–ฅ๊ณผ ๊ฐ์šด๋™๋Ÿ‰ ๋ฐฉํ–ฅ์˜ ๊ด€๊ณ„
  • ์ „์ž๊ธฐ์žฅ ํ…์„œ(electromagnetic field tensor) $F_{\mu\nu}$: ์ „๊ธฐ์žฅ๊ณผ ์ž๊ธฐ์žฅ์„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐ˜๋Œ€์นญ ํ…์„œ

์ด๋“ค์€ ๋ชจ๋‘ rank-2 ํ…์„œ๋กœ, $n$์ฐจ์› ๊ณต๊ฐ„์—์„œ $n^2$๊ฐœ์˜ ์„ฑ๋ถ„์„ ๊ฐ€์ง„๋‹ค.

1.2 ์ขŒํ‘œ ๋ณ€ํ™˜๊ณผ ํ…์„œ์˜ ์ •์˜

์ขŒํ‘œ ๋ณ€ํ™˜ $x^i \to x'^i(x^1, x^2, \ldots, x^n)$์—์„œ, rank-$k$ ํ…์„œ๋Š” ๊ทธ ์„ฑ๋ถ„์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ •ํ•œ ๋ณ€ํ™˜ ๋ฒ•์น™์„ ๋”ฐ๋ฅด๋Š” ๋Œ€์ƒ์ด๋‹ค:

  • Rank-0 (์Šค์นผ๋ผ): $\phi' = \phi$ (๋ถˆ๋ณ€)
  • Rank-1 (๋ฒกํ„ฐ): $A'^i = \frac{\partial x'^i}{\partial x^j}A^j$ (๋ฐ˜๋ณ€ ๋ฒกํ„ฐ์˜ ๊ฒฝ์šฐ)
  • Rank-2 ํ…์„œ: $T'^{ij} = \frac{\partial x'^i}{\partial x^k}\frac{\partial x'^j}{\partial x^l}T^{kl}$

์ผ๋ฐ˜์ ์œผ๋กœ, ํ…์„œ๋Š” ๋‹ค์ค‘์„ ํ˜• ์‚ฌ์ƒ(multilinear map)์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. rank-$(p,q)$ ํ…์„œ๋Š” $p$๊ฐœ์˜ ๊ณต๋ณ€ ๋ฒกํ„ฐ(covector)์™€ $q$๊ฐœ์˜ ๋ฐ˜๋ณ€ ๋ฒกํ„ฐ๋ฅผ ๋ฐ›์•„ ์‹ค์ˆ˜๋ฅผ ๋‚ด๋†“๋Š” ๋‹ค์ค‘์„ ํ˜• ํ•จ์ˆ˜์ด๋‹ค.

1.3 ํ…์„œ์˜ ๊ณ„์ˆ˜(Rank/Order)

Rank ์„ฑ๋ถ„ ์ˆ˜ ($n$์ฐจ์›) ๋ฌผ๋ฆฌ์  ์˜ˆ์‹œ
0 $1$ ์˜จ๋„, ์งˆ๋Ÿ‰, ์—๋„ˆ์ง€
1 $n$ ํž˜, ์†๋„, ์ „๊ธฐ์žฅ
2 $n^2$ ์‘๋ ฅ, ๊ด€์„ฑ ๋ชจ๋ฉ˜ํŠธ, ๊ณ„๋Ÿ‰ ํ…์„œ
3 $n^3$ ์••์ „(piezoelectric) ํ…์„œ
4 $n^4$ ๋ฆฌ๋งŒ ๊ณก๋ฅ  ํ…์„œ, ํƒ„์„ฑ ํ…์„œ

1.4 Python: ์ขŒํ‘œ ๋ณ€ํ™˜ ์˜ˆ์ œ

import numpy as np

# === 2์ฐจ์› ํšŒ์ „ ๋ณ€ํ™˜์—์„œ ํ…์„œ ๋ณ€ํ™˜ ๋ฒ•์น™ ๊ฒ€์ฆ ===

# ํšŒ์ „ ๊ฐ๋„
theta = np.pi / 6  # 30๋„

# ๋ณ€ํ™˜ ํ–‰๋ ฌ: x'^i = R^i_j x^j
R = np.array([
    [np.cos(theta), np.sin(theta)],
    [-np.sin(theta), np.cos(theta)]
])
print(f"ํšŒ์ „ ํ–‰๋ ฌ R (ฮธ = {np.degrees(theta):.0f}ยฐ):")
print(R)

# --- Rank-1 ํ…์„œ (๋ฒกํ„ฐ) ๋ณ€ํ™˜ ---
A = np.array([3.0, 4.0])  # ์›๋ž˜ ์ขŒํ‘œ๊ณ„์˜ ๋ฒกํ„ฐ
A_prime = R @ A            # A'^i = R^i_j A^j
print(f"\n์›๋ž˜ ๋ฒกํ„ฐ: A = {A}")
print(f"๋ณ€ํ™˜๋œ ๋ฒกํ„ฐ: A' = {A_prime}")
print(f"|A| = {np.linalg.norm(A):.4f}, |A'| = {np.linalg.norm(A_prime):.4f}")
# ํฌ๊ธฐ ๋ณด์กด ํ™•์ธ

# --- Rank-2 ํ…์„œ ๋ณ€ํ™˜ ---
# ์‘๋ ฅ ํ…์„œ ์˜ˆ์‹œ
T = np.array([
    [10.0, 3.0],
    [3.0,  5.0]
])  # ๋Œ€์นญ ํ…์„œ

# T'^{ij} = R^i_k R^j_l T^{kl} = R T R^T
T_prime = R @ T @ R.T
print(f"\n์›๋ž˜ ํ…์„œ:\n{T}")
print(f"๋ณ€ํ™˜๋œ ํ…์„œ:\n{T_prime}")

# ํ…์„œ์˜ ๋ถˆ๋ณ€๋Ÿ‰(trace, determinant) ํ™•์ธ
print(f"\ntr(T) = {np.trace(T):.4f}, tr(T') = {np.trace(T_prime):.4f}")
print(f"det(T) = {np.linalg.det(T):.4f}, det(T') = {np.linalg.det(T_prime):.4f}")
# ๋Œ€๊ฐํ•ฉ๊ณผ ํ–‰๋ ฌ์‹์€ ์ขŒํ‘œ ๋ณ€ํ™˜์— ๋ถˆ๋ณ€

2. ์ธ๋ฑ์Šค ํ‘œ๊ธฐ๋ฒ•๊ณผ ์•„์ธ์Šˆํƒ€์ธ ํ•ฉ์‚ฐ ๊ทœ์•ฝ

2.1 ์•„์ธ์Šˆํƒ€์ธ ํ•ฉ์‚ฐ ๊ทœ์•ฝ

์•„์ธ์Šˆํƒ€์ธ(Einstein)์˜ ํ•ฉ์‚ฐ ๊ทœ์•ฝ์€ ํ…์„œ ํ‘œํ˜„์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํ‘œ๊ธฐ๋ฒ•์ด๋‹ค:

๊ฐ™์€ ํ•ญ์—์„œ ์œ„ ์ธ๋ฑ์Šค์™€ ์•„๋ž˜ ์ธ๋ฑ์Šค๊ฐ€ ๋™์ผํ•œ ๋ฌธ์ž๋กœ ๋ฐ˜๋ณต๋˜๋ฉด, ๊ทธ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ํ•ฉ์‚ฐํ•œ๋‹ค.

$$ A^i B_i \equiv \sum_{i=1}^{n} A^i B_i $$

์ž์œ  ์ธ๋ฑ์Šค(free index): ํ•ญ์˜ ์–‘๋ณ€์— ๊ณตํ†ต์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ์ธ๋ฑ์Šค (๋ฐฉ์ •์‹์˜ ๊ฐ ์„ฑ๋ถ„์„ ํ‘œํ˜„)

๋”๋ฏธ ์ธ๋ฑ์Šค(dummy index): ํ•ฉ์‚ฐ ๊ทœ์•ฝ์— ์˜ํ•ด ํ•ฉ์‚ฐ๋˜๋Š” ๋ฐ˜๋ณต ์ธ๋ฑ์Šค (๋ฌธ์ž ๊ต์ฒด ๊ฐ€๋Šฅ)

$$ A^i B_i = A^j B_j \quad (\text{๋”๋ฏธ ์ธ๋ฑ์Šค } i \text{๋ฅผ } j\text{๋กœ ๊ต์ฒด ๊ฐ€๋Šฅ}) $$

2.2 ํฌ๋กœ๋„ค์ปค ๋ธํƒ€ $\delta_{ij}$

ํฌ๋กœ๋„ค์ปค ๋ธํƒ€(Kronecker delta)๋Š” ๋‹จ์œ„ ํ–‰๋ ฌ์˜ ์„ฑ๋ถ„์— ํ•ด๋‹นํ•œ๋‹ค:

$$ \delta_{ij} = \begin{cases} 1 & (i = j) \\ 0 & (i \ne j) \end{cases} $$

์ฃผ์š” ์„ฑ์งˆ: - $\delta_{ij} A^j = A^i$ (์ธ๋ฑ์Šค ์น˜ํ™˜ ์—ญํ• ) - $\delta_{ii} = n$ ($n$์ฐจ์›์—์„œ์˜ ๋Œ€๊ฐํ•ฉ) - $\delta_{ij}\delta_{jk} = \delta_{ik}$

2.3 ๋ ˆ๋น„-์น˜๋น„ํƒ€ ๊ธฐํ˜ธ $\varepsilon_{ijk}$

๋ ˆ๋น„-์น˜๋น„ํƒ€ ๊ธฐํ˜ธ(Levi-Civita symbol)๋Š” ์™„์ „ ๋ฐ˜๋Œ€์นญ ๊ธฐํ˜ธ์ด๋‹ค:

$$ \varepsilon_{ijk} = \begin{cases} +1 & (ijk) \text{๊ฐ€ }(123)\text{์˜ ์ง์ˆ˜ ์น˜ํ™˜} \\ -1 & (ijk) \text{๊ฐ€ }(123)\text{์˜ ํ™€์ˆ˜ ์น˜ํ™˜} \\ 0 & \text{์ธ๋ฑ์Šค ์ค‘ ๋ฐ˜๋ณต์ด ์žˆ์œผ๋ฉด} \end{cases} $$

์™ธ์ ๊ณผ ํ–‰๋ ฌ์‹์˜ ํ‘œํ˜„:

$$ (\mathbf{A} \times \mathbf{B})_i = \varepsilon_{ijk} A_j B_k $$

$$ \det(M) = \varepsilon_{ijk} M_{1i} M_{2j} M_{3k} $$

2.4 $\varepsilon$-$\delta$ ํ•ญ๋“ฑ์‹

ํ…์„œ ๊ณ„์‚ฐ์—์„œ ๋งค์šฐ ์œ ์šฉํ•œ ํ•ญ๋“ฑ์‹:

$$ \varepsilon_{ijk}\varepsilon_{imn} = \delta_{jm}\delta_{kn} - \delta_{jn}\delta_{km} $$

์ด ํ•ญ๋“ฑ์‹์œผ๋กœ๋ถ€ํ„ฐ ๋ฒกํ„ฐ ์‚ผ์ค‘๊ณฑ ๋“ฑ ๋‹ค์–‘ํ•œ ํ•ญ๋“ฑ์‹์„ ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค:

$$ \mathbf{A} \times (\mathbf{B} \times \mathbf{C}) = \mathbf{B}(\mathbf{A} \cdot \mathbf{C}) - \mathbf{C}(\mathbf{A} \cdot \mathbf{B}) $$

2.5 Python: numpy.einsum์„ ์ด์šฉํ•œ ํ…์„œ ์—ฐ์‚ฐ

import numpy as np

# === numpy.einsum: ์•„์ธ์Šˆํƒ€์ธ ํ•ฉ์‚ฐ ๊ทœ์•ฝ์˜ Python ๊ตฌํ˜„ ===

A = np.array([1.0, 2.0, 3.0])
B = np.array([4.0, 5.0, 6.0])

# ๋‚ด์ : A^i B_i
dot = np.einsum('i,i->', A, B)
print(f"๋‚ด์  AยทB = {dot}")  # 32.0

# ์™ธ์  (ํ…์„œ๊ณฑ): C^{ij} = A^i B^j
outer = np.einsum('i,j->ij', A, B)
print(f"\n์™ธ์  AโŠ—B:\n{outer}")

# ํ–‰๋ ฌ-๋ฒกํ„ฐ ๊ณฑ: (Mv)^i = M^{ij} v_j
M = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=float)
v = np.array([1.0, 0.0, -1.0])
Mv = np.einsum('ij,j->i', M, v)
print(f"\nMv = {Mv}")

# ํ–‰๋ ฌ ๊ณฑ: (AB)^{ik} = A^{ij} B^{jk}
N = np.random.rand(3, 3)
MN = np.einsum('ij,jk->ik', M, N)
print(f"\nํ–‰๋ ฌ ๊ณฑ MN (einsum):\n{MN}")
print(f"ํ–‰๋ ฌ ๊ณฑ MN (numpy):  \n{M @ N}")

# ๋Œ€๊ฐํ•ฉ(trace): T^i_i
trace = np.einsum('ii->', M)
print(f"\ntr(M) = {trace}")

# ์ด์ค‘ ์ถ•์•ฝ(double contraction): A_{ij} B_{ij}
A2 = np.random.rand(3, 3)
B2 = np.random.rand(3, 3)
double_contract = np.einsum('ij,ij->', A2, B2)
print(f"A:B (์ด์ค‘ ์ถ•์•ฝ) = {double_contract:.4f}")

# --- ๋ ˆ๋น„-์น˜๋น„ํƒ€ ๊ธฐํ˜ธ์™€ ์™ธ์  ---
# 3์ฐจ์› ๋ ˆ๋น„-์น˜๋น„ํƒ€ ๊ธฐํ˜ธ ์ƒ์„ฑ
def levi_civita_3d():
    """3์ฐจ์› ๋ ˆ๋น„-์น˜๋น„ํƒ€ ๊ธฐํ˜ธ ฮต_{ijk}๋ฅผ ์ƒ์„ฑ"""
    eps = np.zeros((3, 3, 3))
    eps[0, 1, 2] = eps[1, 2, 0] = eps[2, 0, 1] = 1
    eps[0, 2, 1] = eps[2, 1, 0] = eps[1, 0, 2] = -1
    return eps

eps = levi_civita_3d()

# ์™ธ์ : (A ร— B)_i = ฮต_{ijk} A_j B_k
cross_einsum = np.einsum('ijk,j,k->i', eps, A, B)
cross_numpy = np.cross(A, B)
print(f"\nA ร— B (einsum): {cross_einsum}")
print(f"A ร— B (numpy):  {cross_numpy}")

# ฮต-ฮด ํ•ญ๋“ฑ์‹ ๊ฒ€์ฆ: ฮต_{ijk} ฮต_{imn} = ฮด_{jm}ฮด_{kn} - ฮด_{jn}ฮด_{km}
lhs = np.einsum('ijk,imn->jkmn', eps, eps)
delta = np.eye(3)
rhs = np.einsum('jm,kn->jkmn', delta, delta) - np.einsum('jn,km->jkmn', delta, delta)
print(f"\nฮต-ฮด ํ•ญ๋“ฑ์‹ ๊ฒ€์ฆ: {np.allclose(lhs, rhs)}")

3. ๋ฐ˜๋ณ€ยท๊ณต๋ณ€ ํ…์„œ

3.1 ๋ฐ˜๋ณ€ ๋ฒกํ„ฐ (Contravariant Vector)

์ขŒํ‘œ ๋ณ€ํ™˜ $x^i \to x'^i$์—์„œ, ๋ฐ˜๋ณ€ ๋ฒกํ„ฐ(contravariant vector)์˜ ์„ฑ๋ถ„์€ ์ขŒํ‘œ์˜ ๋ฏธ๋ถ„์ฒ˜๋Ÿผ ๋ณ€ํ™˜ํ•œ๋‹ค:

$$ A'^i = \frac{\partial x'^i}{\partial x^j}A^j $$

์œ„ ์ธ๋ฑ์Šค(upper index)๋กœ ํ‘œ๊ธฐํ•˜๋ฉฐ, ๋ณ€์œ„ ๋ฒกํ„ฐ $dx^i$๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค.

3.2 ๊ณต๋ณ€ ๋ฒกํ„ฐ (Covariant Vector)

๊ณต๋ณ€ ๋ฒกํ„ฐ(covariant vector, 1-form)์˜ ์„ฑ๋ถ„์€ ๊ธฐ์šธ๊ธฐ(gradient)์ฒ˜๋Ÿผ ๋ณ€ํ™˜ํ•œ๋‹ค:

$$ A'_i = \frac{\partial x^j}{\partial x'^i}A_j $$

์•„๋ž˜ ์ธ๋ฑ์Šค(lower index)๋กœ ํ‘œ๊ธฐํ•˜๋ฉฐ, ์Šค์นผ๋ผ ํ•จ์ˆ˜์˜ ํŽธ๋ฏธ๋ถ„ $\partial_i \phi = \frac{\partial \phi}{\partial x^i}$๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค.

3.3 ํ˜ผํ•ฉ ํ…์„œ์™€ ์ธ๋ฑ์Šค ์˜ฌ๋ฆผ/๋‚ด๋ฆผ

ํ˜ผํ•ฉ ํ…์„œ(mixed tensor): ์œ„ยท์•„๋ž˜ ์ธ๋ฑ์Šค๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง„ ํ…์„œ. ์˜ˆ๋ฅผ ๋“ค์–ด rank-$(1,1)$ ํ…์„œ $T^i{}_j$๋Š”:

$$ T'^i{}_j = \frac{\partial x'^i}{\partial x^k}\frac{\partial x^l}{\partial x'^j}T^k{}_l $$

์ธ๋ฑ์Šค ์˜ฌ๋ฆผ/๋‚ด๋ฆผ์€ ๊ณ„๋Ÿ‰ ํ…์„œ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค:

$$ A^i = g^{ij}A_j \quad (\text{์˜ฌ๋ฆผ}), \qquad A_i = g_{ij}A^j \quad (\text{๋‚ด๋ฆผ}) $$

3.4 Python: ๋ฐ˜๋ณ€/๊ณต๋ณ€ ๋ณ€ํ™˜ ์˜ˆ์ œ

import numpy as np
import sympy as sp

# === ๊ทน์ขŒํ‘œ โ†” ์ง๊ต์ขŒํ‘œ ๋ณ€ํ™˜์—์„œ ๋ฐ˜๋ณ€/๊ณต๋ณ€ ๋ฒกํ„ฐ ===

r_val, theta_val = 2.0, np.pi / 4  # (r, ฮธ) = (2, 45ยฐ)

# ์ง๊ต ์ขŒํ‘œ โ†’ ๊ทน์ขŒํ‘œ ๋ณ€ํ™˜์˜ ์•ผ์ฝ”๋น„์•ˆ
# x = r cosฮธ, y = r sinฮธ
# โˆ‚x^i/โˆ‚x'^j ๊ณ„์‚ฐ (x' = ๊ทน์ขŒํ‘œ, x = ์ง๊ต์ขŒํ‘œ)

# โˆ‚(x,y)/โˆ‚(r,ฮธ) : ์ง๊ต๋ฅผ ๊ทน์ขŒํ‘œ๋กœ ๋ฏธ๋ถ„
J = np.array([
    [np.cos(theta_val), -r_val * np.sin(theta_val)],  # โˆ‚x/โˆ‚r, โˆ‚x/โˆ‚ฮธ
    [np.sin(theta_val),  r_val * np.cos(theta_val)]   # โˆ‚y/โˆ‚r, โˆ‚y/โˆ‚ฮธ
])

# ์—ญ์•ผ์ฝ”๋น„์•ˆ: โˆ‚(r,ฮธ)/โˆ‚(x,y)
J_inv = np.linalg.inv(J)

print("์•ผ์ฝ”๋น„์•ˆ โˆ‚(x,y)/โˆ‚(r,ฮธ):")
print(J)
print(f"\n์—ญ์•ผ์ฝ”๋น„์•ˆ โˆ‚(r,ฮธ)/โˆ‚(x,y):")
print(J_inv)

# ์ง๊ต์ขŒํ‘œ์—์„œ์˜ ๋ฒกํ„ฐ (๋ฐ˜๋ณ€ ์„ฑ๋ถ„)
A_cart = np.array([1.0, 1.0])  # (Ax, Ay)

# ๋ฐ˜๋ณ€ ๋ณ€ํ™˜: A'^i = (โˆ‚x'^i/โˆ‚x^j) A^j
# ๊ทน์ขŒํ‘œ์˜ ๋ฐ˜๋ณ€ ์„ฑ๋ถ„ = J_inv @ A_cart
A_polar_contra = J_inv @ A_cart
print(f"\n์ง๊ต์ขŒํ‘œ ๋ฒกํ„ฐ A = {A_cart}")
print(f"๊ทน์ขŒํ‘œ ๋ฐ˜๋ณ€ ์„ฑ๋ถ„ (A^r, A^ฮธ) = {A_polar_contra}")

# ๊ณต๋ณ€ ๋ณ€ํ™˜: A'_i = (โˆ‚x^j/โˆ‚x'^i) A_j
# ๊ทน์ขŒํ‘œ์˜ ๊ณต๋ณ€ ์„ฑ๋ถ„ = J^T @ A_cart
A_polar_cov = J.T @ A_cart
print(f"๊ทน์ขŒํ‘œ ๊ณต๋ณ€ ์„ฑ๋ถ„ (A_r, A_ฮธ) = {A_polar_cov}")

# ๊ทน์ขŒํ‘œ์˜ ๊ณ„๋Ÿ‰ ํ…์„œ๋กœ ๊ฒ€์ฆ: g_{ij} = diag(1, rยฒ)
g = np.diag([1.0, r_val**2])
A_cov_from_contra = g @ A_polar_contra
print(f"\ng_{ij} A^j = {A_cov_from_contra}")
print(f"์ง์ ‘ ๊ณ„์‚ฐํ•œ ๊ณต๋ณ€ ์„ฑ๋ถ„๊ณผ ์ผ์น˜: {np.allclose(A_polar_cov, A_cov_from_contra)}")

4. ๊ณ„๋Ÿ‰ ํ…์„œ (Metric Tensor)

4.1 ์„ ์†Œ(Line Element)์™€ ๊ณ„๋Ÿ‰ ํ…์„œ์˜ ์ •์˜

์ขŒํ‘œ๊ณ„์—์„œ ๋‘ ์ธ์ ‘ํ•œ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ(์„ ์†Œ, line element)๋Š” ๊ณ„๋Ÿ‰ ํ…์„œ $g_{ij}$์— ์˜ํ•ด ์ •์˜๋œ๋‹ค:

$$ ds^2 = g_{ij} \, dx^i \, dx^j $$

๊ณ„๋Ÿ‰ ํ…์„œ๋Š” ๋‚ด์ ์„ ์ •์˜ํ•˜๋Š” ๋Œ€์นญ rank-2 ๊ณต๋ณ€ ํ…์„œ์ด๋‹ค: $g_{ij} = g_{ji}$.

4.2 ๋‹ค์–‘ํ•œ ์ขŒํ‘œ๊ณ„์—์„œ์˜ ๊ณ„๋Ÿ‰ ํ…์„œ

์ง๊ต ์ขŒํ‘œ $(x, y, z)$:

$$ ds^2 = dx^2 + dy^2 + dz^2 \quad \Rightarrow \quad g_{ij} = \delta_{ij} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

์›ํ†ต ์ขŒํ‘œ $(\rho, \phi, z)$:

$$ ds^2 = d\rho^2 + \rho^2 d\phi^2 + dz^2 \quad \Rightarrow \quad g_{ij} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & \rho^2 & 0 \\ 0 & 0 & 1 \end{pmatrix} $$

๊ตฌ๋ฉด ์ขŒํ‘œ $(r, \theta, \phi)$:

$$ ds^2 = dr^2 + r^2 d\theta^2 + r^2 \sin^2\theta \, d\phi^2 \quad \Rightarrow \quad g_{ij} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & r^2 & 0 \\ 0 & 0 & r^2\sin^2\theta \end{pmatrix} $$

4.3 ๊ณก๋ฉด ์œ„์˜ ๊ณ„๋Ÿ‰ ํ…์„œ

2์ฐจ์› ๊ตฌ๋ฉด ($r = R$ ๊ณ ์ •):

$$ ds^2 = R^2 d\theta^2 + R^2 \sin^2\theta \, d\phi^2 \quad \Rightarrow \quad g_{ij} = R^2\begin{pmatrix} 1 & 0 \\ 0 & \sin^2\theta \end{pmatrix} $$

4.4 ์—ญ๊ณ„๋Ÿ‰ ํ…์„œ์™€ ์ฒด์  ์š”์†Œ

์—ญ๊ณ„๋Ÿ‰ ํ…์„œ(inverse metric) $g^{ij}$๋Š” $g^{ik}g_{kj} = \delta^i{}_j$๋ฅผ ๋งŒ์กฑํ•œ๋‹ค.

์ฒด์  ์š”์†Œ: ์ขŒํ‘œ๊ณ„์˜ ์ฒด์  ์š”์†Œ๋Š” ๊ณ„๋Ÿ‰ ํ…์„œ์˜ ํ–‰๋ ฌ์‹์œผ๋กœ ๊ฒฐ์ •๋œ๋‹ค:

$$ dV = \sqrt{|g|} \, dx^1 \, dx^2 \cdots dx^n, \quad g = \det(g_{ij}) $$

4.5 Python: ๊ณ„๋Ÿ‰ ํ…์„œ ๊ณ„์‚ฐ

import sympy as sp

# === ๋‹ค์–‘ํ•œ ์ขŒํ‘œ๊ณ„์—์„œ ๊ณ„๋Ÿ‰ ํ…์„œ ๊ณ„์‚ฐ ===

def compute_metric(coords, transform):
    """
    ์ขŒํ‘œ ๋ณ€ํ™˜์œผ๋กœ๋ถ€ํ„ฐ ๊ณ„๋Ÿ‰ ํ…์„œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

    Parameters:
        coords: ๊ณก์„ ์ขŒํ‘œ ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ
        transform: ์ง๊ต์ขŒํ‘œ ํ‘œํ˜„ ๋ฆฌ์ŠคํŠธ [x(...), y(...), z(...)]
    Returns:
        ๊ณ„๋Ÿ‰ ํ…์„œ ํ–‰๋ ฌ (SymPy Matrix)
    """
    n = len(coords)
    r = sp.Matrix(transform)
    g = sp.zeros(n, n)
    for i in range(n):
        for j in range(i, n):
            g[i, j] = sp.trigsimp(r.diff(coords[i]).dot(r.diff(coords[j])))
            g[j, i] = g[i, j]
    return g

# ๊ตฌ๋ฉด ์ขŒํ‘œ
r, theta, phi = sp.symbols('r theta phi', positive=True)
g_sph = compute_metric(
    [r, theta, phi],
    [r * sp.sin(theta) * sp.cos(phi),
     r * sp.sin(theta) * sp.sin(phi),
     r * sp.cos(theta)]
)
print("๊ตฌ๋ฉด ์ขŒํ‘œ ๊ณ„๋Ÿ‰ ํ…์„œ:")
sp.pprint(g_sph)
print(f"det(g) = {sp.trigsimp(g_sph.det())}")
print(f"sqrt(|g|) = {sp.sqrt(sp.trigsimp(g_sph.det()))}")
# r^4 sin^2(theta) โ†’ sqrt = r^2 sin(theta)

# 2์ฐจ์› ๊ตฌ๋ฉด (r = R ๊ณ ์ •)
R = sp.Symbol('R', positive=True)
g_sphere = compute_metric(
    [theta, phi],
    [R * sp.sin(theta) * sp.cos(phi),
     R * sp.sin(theta) * sp.sin(phi),
     R * sp.cos(theta)]
)
print("\n2์ฐจ์› ๊ตฌ๋ฉด ๊ณ„๋Ÿ‰ ํ…์„œ:")
sp.pprint(g_sphere)

# ์—ญ๊ณ„๋Ÿ‰ ํ…์„œ
g_sph_inv = g_sph.inv()
print("\n๊ตฌ๋ฉด ์ขŒํ‘œ ์—ญ๊ณ„๋Ÿ‰ ํ…์„œ g^{ij}:")
sp.pprint(sp.simplify(g_sph_inv))

# ๊ฒ€์ฆ: g^{ik} g_{kj} = ฮด^i_j
identity_check = sp.simplify(g_sph_inv * g_sph)
print(f"\ng^{{ik}} g_{{kj}} = I ๊ฒ€์ฆ: {identity_check == sp.eye(3)}")

5. ํ…์„œ ๋Œ€์ˆ˜

5.1 ํ…์„œ์˜ ๋ง์…ˆ๊ณผ ์Šค์นผ๋ผ ๊ณฑ

๊ฐ™์€ type์˜ ํ…์„œ๋ผ๋ฆฌ๋งŒ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค:

$$ (A + B)^{ij} = A^{ij} + B^{ij}, \quad (\alpha A)^{ij} = \alpha A^{ij} $$

5.2 ํ…์„œ๊ณฑ (Tensor Product, Outer Product)

rank-$(p,q)$ ํ…์„œ์™€ rank-$(r,s)$ ํ…์„œ์˜ ํ…์„œ๊ณฑ์€ rank-$(p+r, q+s)$ ํ…์„œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค:

$$ (A \otimes B)^{ij}{}_{kl} = A^i{}_k \, B^j{}_l $$

5.3 ์ถ•์•ฝ (Contraction)

์œ„ ์ธ๋ฑ์Šค์™€ ์•„๋ž˜ ์ธ๋ฑ์Šค ํ•˜๋‚˜์”ฉ์„ ๊ฐ™์€ ๋ฌธ์ž๋กœ ๋†“๊ณ  ํ•ฉ์‚ฐํ•˜๋ฉด rank๊ฐ€ 2๋งŒํผ ์ค„์–ด๋“ ๋‹ค:

$$ T^i{}_{ij} = \sum_i T^i{}_{ij} \quad (\text{rank-}(2,1) \to \text{rank-}(1,0)) $$

๋Œ€ํ‘œ์ ์ธ ์˜ˆ: ๋Œ€๊ฐํ•ฉ(trace) $T^i{}_i = \text{tr}(T)$

5.4 ๋Œ€์นญํ™”์™€ ๋ฐ˜๋Œ€์นญํ™”

๋Œ€์นญ ํ…์„œ: $T_{ij} = T_{ji}$

$$ T_{(ij)} = \frac{1}{2}(T_{ij} + T_{ji}) \quad (\text{๋Œ€์นญํ™”}) $$

๋ฐ˜๋Œ€์นญ ํ…์„œ: $T_{ij} = -T_{ji}$

$$ T_{[ij]} = \frac{1}{2}(T_{ij} - T_{ji}) \quad (\text{๋ฐ˜๋Œ€์นญํ™”}) $$

์ž„์˜์˜ rank-2 ํ…์„œ๋Š” ๋Œ€์นญ ๋ถ€๋ถ„๊ณผ ๋ฐ˜๋Œ€์นญ ๋ถ€๋ถ„์œผ๋กœ ๋ถ„ํ•ด๋œ๋‹ค:

$$ T_{ij} = T_{(ij)} + T_{[ij]} $$

5.5 Python: ํ…์„œ ๋Œ€์ˆ˜ ์—ฐ์‚ฐ

import numpy as np

# === ํ…์„œ ๋Œ€์ˆ˜ ์—ฐ์‚ฐ ===

# rank-2 ํ…์„œ (3ร—3)
T = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
], dtype=float)

# ๋Œ€์นญ ๋ถ€๋ถ„๊ณผ ๋ฐ˜๋Œ€์นญ ๋ถ€๋ถ„ ๋ถ„ํ•ด
T_sym = 0.5 * (T + T.T)       # T_{(ij)}
T_antisym = 0.5 * (T - T.T)   # T_{[ij]}
print("์›๋ž˜ ํ…์„œ T:")
print(T)
print("\n๋Œ€์นญ ๋ถ€๋ถ„ T_{(ij)}:")
print(T_sym)
print("\n๋ฐ˜๋Œ€์นญ ๋ถ€๋ถ„ T_{[ij]}:")
print(T_antisym)
print(f"\n๋ณต์› ๊ฒ€์ฆ: T = T_sym + T_antisym? {np.allclose(T, T_sym + T_antisym)}")

# ํ…์„œ๊ณฑ (outer product)
A = np.array([1, 2, 3], dtype=float)
B = np.array([4, 5, 6], dtype=float)
AB_outer = np.einsum('i,j->ij', A, B)  # A^i B^j
print(f"\nํ…์„œ๊ณฑ AโŠ—B:\n{AB_outer}")

# ์ถ•์•ฝ (contraction)
# rank-2 ํ…์„œ์˜ trace: T^i_i
trace_T = np.einsum('ii->', T)
print(f"\n์ถ•์•ฝ (trace): T^i_i = {trace_T}")

# rank-4 ํ…์„œ์—์„œ ์ถ•์•ฝ
R = np.random.rand(3, 3, 3, 3)
# R^i_{jkl} โ†’ ์ฒซ์งธ์™€ ์…‹์งธ ์ธ๋ฑ์Šค ์ถ•์•ฝ โ†’ R^i_{jil} = S_{jl}
S = np.einsum('ijil->jl', R)
print(f"\nrank-4 ํ…์„œ ์ถ•์•ฝ ๊ฒฐ๊ณผ (rank-2): shape = {S.shape}")

6. ๊ณต๋ณ€ ๋ฏธ๋ถ„๊ณผ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ

6.1 ์ผ๋ฐ˜ ๋ฏธ๋ถ„์˜ ๋ฌธ์ œ์ 

๊ณก์„ ์ขŒํ‘œ๊ณ„์—์„œ ํ…์„œ์˜ ์ผ๋ฐ˜ ํŽธ๋ฏธ๋ถ„ $\partial_i A^j$๋Š” ํ…์„œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ์ € ๋ฒกํ„ฐ ์ž์ฒด๊ฐ€ ์ ๋งˆ๋‹ค ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฏธ๋ถ„ ์—ฐ์‚ฐ์ž๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ด๊ฒƒ์ด ๊ณต๋ณ€ ๋ฏธ๋ถ„(covariant derivative)์ด๋‹ค.

6.2 ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ์˜ ์ •์˜

ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ(Christoffel symbol of the second kind) $\Gamma^k{}_{ij}$๋Š” ๊ณ„๋Ÿ‰ ํ…์„œ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋œ๋‹ค:

$$ \Gamma^k{}_{ij} = \frac{1}{2}g^{kl}\left(\frac{\partial g_{jl}}{\partial x^i} + \frac{\partial g_{il}}{\partial x^j} - \frac{\partial g_{ij}}{\partial x^l}\right) $$

ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ๋Š” ํ…์„œ๊ฐ€ ์•„๋‹ˆ๋‹ค (๋น„๊ท ์งˆ ๋ณ€ํ™˜ ๋ฒ•์น™์„ ๋”ฐ๋ฆ„). ์ด๋Š” ์ขŒํ‘œ๊ณ„์˜ "๋น„๊ด€์„ฑ" ํšจ๊ณผ๋ฅผ ๋ณด์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋Œ€์นญ์„ฑ: $\Gamma^k{}_{ij} = \Gamma^k{}_{ji}$ (๊ณ„๋Ÿ‰ ํ…์„œ๊ฐ€ ๋น„ํ‹€๋ฆผ์ด ์—†๋Š” ๊ฒฝ์šฐ)

6.3 ๊ณต๋ณ€ ๋ฏธ๋ถ„

๋ฐ˜๋ณ€ ๋ฒกํ„ฐ์˜ ๊ณต๋ณ€ ๋ฏธ๋ถ„:

$$ \nabla_i A^j = \partial_i A^j + \Gamma^j{}_{ik} A^k $$

๊ณต๋ณ€ ๋ฒกํ„ฐ์˜ ๊ณต๋ณ€ ๋ฏธ๋ถ„:

$$ \nabla_i A_j = \partial_i A_j - \Gamma^k{}_{ij} A_k $$

์ผ๋ฐ˜ ํ…์„œ์˜ ๊ณต๋ณ€ ๋ฏธ๋ถ„ (์œ„ ์ธ๋ฑ์Šค๋งˆ๋‹ค $+\Gamma$, ์•„๋ž˜ ์ธ๋ฑ์Šค๋งˆ๋‹ค $-\Gamma$):

$$ \nabla_i T^j{}_k = \partial_i T^j{}_k + \Gamma^j{}_{il} T^l{}_k - \Gamma^l{}_{ik} T^j{}_l $$

๊ณ„๋Ÿ‰ ํ…์„œ์˜ ๊ณต๋ณ€ ๋ฏธ๋ถ„: $\nabla_i g_{jk} = 0$ (๋ฉ”ํŠธ๋ฆญ ์ ํ•ฉ์„ฑ ์กฐ๊ฑด)

6.4 ํ‰ํ–‰ ์ด๋™๊ณผ ์ธก์ง€์„  ๋ฐฉ์ •์‹

๋ฒกํ„ฐ $A^i$๋ฅผ ๊ณก์„  $x^i(\tau)$๋ฅผ ๋”ฐ๋ผ ํ‰ํ–‰ ์ด๋™(parallel transport)ํ•˜๋Š” ์กฐ๊ฑด:

$$ \frac{DA^i}{D\tau} = \frac{dA^i}{d\tau} + \Gamma^i{}_{jk}\frac{dx^j}{d\tau}A^k = 0 $$

์ธก์ง€์„ (geodesic)์€ ์ ‘์„  ๋ฒกํ„ฐ ์ž์ฒด๋ฅผ ํ‰ํ–‰ ์ด๋™ํ•˜๋Š” ๊ณก์„ ์ด๋‹ค:

$$ \frac{d^2x^k}{d\tau^2} + \Gamma^k{}_{ij}\frac{dx^i}{d\tau}\frac{dx^j}{d\tau} = 0 $$

ํ‰ํƒ„ ๊ณต๊ฐ„์—์„œ ์ธก์ง€์„ ์€ ์ง์„ ์ด๊ณ , ๊ตฌ๋ฉด ์œ„์—์„œ๋Š” ๋Œ€์›(great circle)์ด๋‹ค.

6.5 Python: ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ์™€ ์ธก์ง€์„  ๊ณ„์‚ฐ

import sympy as sp

# === ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ๊ณ„์‚ฐ ํ•จ์ˆ˜ ===

def christoffel_symbols(g, coords):
    """
    ๊ณ„๋Ÿ‰ ํ…์„œ๋กœ๋ถ€ํ„ฐ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ฮ“^k_{ij}๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

    Parameters:
        g: ๊ณ„๋Ÿ‰ ํ…์„œ (SymPy Matrix)
        coords: ์ขŒํ‘œ ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ
    Returns:
        ฮ“[k][i][j] ํ˜•ํƒœ์˜ 3์ฐจ์› ๋ฆฌ์ŠคํŠธ
    """
    n = len(coords)
    g_inv = g.inv()

    Gamma = [[[sp.Integer(0) for _ in range(n)]
              for _ in range(n)]
             for _ in range(n)]

    for k in range(n):
        for i in range(n):
            for j in range(n):
                s = sp.Integer(0)
                for l in range(n):
                    s += sp.Rational(1, 2) * g_inv[k, l] * (
                        sp.diff(g[j, l], coords[i]) +
                        sp.diff(g[i, l], coords[j]) -
                        sp.diff(g[i, j], coords[l])
                    )
                Gamma[k][i][j] = sp.simplify(s)
    return Gamma

# --- ๊ตฌ๋ฉด ์ขŒํ‘œ์—์„œ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ---
r, theta, phi = sp.symbols('r theta phi', positive=True)
g_sph = sp.diag(1, r**2, r**2 * sp.sin(theta)**2)
coords_sph = [r, theta, phi]

Gamma_sph = christoffel_symbols(g_sph, coords_sph)

print("๊ตฌ๋ฉด ์ขŒํ‘œ์˜ 0์ด ์•„๋‹Œ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ:")
names = ['r', 'ฮธ', 'ฯ†']
for k in range(3):
    for i in range(3):
        for j in range(i, 3):
            if Gamma_sph[k][i][j] != 0:
                print(f"  ฮ“^{names[k]}_{{{names[i]}{names[j]}}} = {Gamma_sph[k][i][j]}")

# --- 2์ฐจ์› ๊ตฌ๋ฉด ์œ„์˜ ์ธก์ง€์„  (์ˆ˜์น˜ ๊ณ„์‚ฐ) ---
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

def geodesic_sphere(tau, y, R_val=1.0):
    """
    ๋‹จ์œ„ ๊ตฌ๋ฉด ์œ„์˜ ์ธก์ง€์„  ๋ฐฉ์ •์‹.
    y = [ฮธ, ฯ†, dฮธ/dฯ„, dฯ†/dฯ„]
    """
    th, ph, dth, dph = y

    # 2์ฐจ์› ๊ตฌ๋ฉด์˜ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ
    # ฮ“^ฮธ_{ฯ†ฯ†} = -sinฮธ cosฮธ
    # ฮ“^ฯ†_{ฮธฯ†} = ฮ“^ฯ†_{ฯ†ฮธ} = cosฮธ/sinฮธ

    d2th = np.sin(th) * np.cos(th) * dph**2
    d2ph = -2.0 * np.cos(th) / np.sin(th) * dth * dph if np.sin(th) > 1e-10 else 0.0

    return [dth, dph, d2th, d2ph]

# ์ดˆ๊ธฐ ์กฐ๊ฑด: ์ ๋„์—์„œ ๋ถ๋™ ๋ฐฉํ–ฅ์œผ๋กœ ์ถœ๋ฐœ
th0, ph0 = np.pi / 2, 0.0
dth0, dph0 = -0.3, 1.0  # ๋ถ์ชฝ์œผ๋กœ ์•ฝ๊ฐ„ + ๋™์ชฝ์œผ๋กœ

y0 = [th0, ph0, dth0, dph0]
sol = solve_ivp(geodesic_sphere, [0, 8], y0, max_step=0.01, dense_output=True)

# ๊ตฌ๋ฉด ์œ„์— ์ธก์ง€์„  ํ‘œ์‹œ
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')

# ๊ตฌ๋ฉด ๊ทธ๋ฆฌ๊ธฐ
u = np.linspace(0, np.pi, 40)
v = np.linspace(0, 2*np.pi, 40)
U, V = np.meshgrid(u, v)
X = np.sin(U) * np.cos(V)
Y = np.sin(U) * np.sin(V)
Z = np.cos(U)
ax.plot_surface(X, Y, Z, alpha=0.15, color='lightblue')

# ์ธก์ง€์„  (๋Œ€์›)
th_geo = sol.y[0]
ph_geo = sol.y[1]
xg = np.sin(th_geo) * np.cos(ph_geo)
yg = np.sin(th_geo) * np.sin(ph_geo)
zg = np.cos(th_geo)
ax.plot(xg, yg, zg, 'r-', linewidth=2.5, label='์ธก์ง€์„  (๋Œ€์›)')
ax.plot([xg[0]], [yg[0]], [zg[0]], 'go', markersize=8, label='์ถœ๋ฐœ์ ')

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('๊ตฌ๋ฉด ์œ„์˜ ์ธก์ง€์„ ')
ax.legend()
plt.tight_layout()
plt.savefig('geodesic_sphere.png', dpi=150, bbox_inches='tight')
plt.show()

7. ๊ณก๋ฅ  ํ…์„œ (Curvature)

7.1 ๋ฆฌ๋งŒ ๊ณก๋ฅ  ํ…์„œ

๋ฆฌ๋งŒ ๊ณก๋ฅ  ํ…์„œ(Riemann curvature tensor) $R^l{}_{kij}$๋Š” ๊ณต๋ณ€ ๋ฏธ๋ถ„์˜ ๋น„๊ตํ™˜์„ฑ์œผ๋กœ ์ •์˜๋œ๋‹ค:

$$ (\nabla_i \nabla_j - \nabla_j \nabla_i)A^l = R^l{}_{kij}A^k $$

ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ๋ช…์‹œ์  ํ‘œํ˜„:

$$ R^l{}_{kij} = \partial_i \Gamma^l{}_{jk} - \partial_j \Gamma^l{}_{ik} + \Gamma^l{}_{im}\Gamma^m{}_{jk} - \Gamma^l{}_{jm}\Gamma^m{}_{ik} $$

7.2 ๊ธฐํ•˜ํ•™์  ์˜๋ฏธ

๋ฆฌ๋งŒ ๊ณก๋ฅ  ํ…์„œ๋Š” ๋‹ซํžŒ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ๋ฒกํ„ฐ๋ฅผ ํ‰ํ–‰ ์ด๋™ํ–ˆ์„ ๋•Œ ์›๋ž˜ ๋ฒกํ„ฐ์™€ ๋‹ฌ๋ผ์ง€๋Š” ์ •๋„๋ฅผ ์ธก์ •ํ•œ๋‹ค.

  • ํ‰ํƒ„ ๊ณต๊ฐ„: $R^l{}_{kij} = 0$ (ํ‰ํ–‰ ์ด๋™์ด ๊ฒฝ๋กœ์— ๋ฌด๊ด€)
  • ๊ณก๋ฅ ์ด ์žˆ๋Š” ๊ณต๊ฐ„: $R^l{}_{kij} \ne 0$ (๊ฒฝ๋กœ ์˜์กด์ )

7.3 ๋ฆฌ์น˜ ํ…์„œ, ์Šค์นผ๋ผ ๊ณก๋ฅ , ์•„์ธ์Šˆํƒ€์ธ ํ…์„œ

๋ฆฌ์น˜ ํ…์„œ(Ricci tensor): ๋ฆฌ๋งŒ ํ…์„œ์˜ ์ถ•์•ฝ

$$ R_{ij} = R^k{}_{ikj} $$

์Šค์นผ๋ผ ๊ณก๋ฅ (Ricci scalar): ๋ฆฌ์น˜ ํ…์„œ์˜ ์ถ•์•ฝ

$$ R = g^{ij}R_{ij} $$

2์ฐจ์› ๊ณก๋ฉด์˜ ๊ฐ€์šฐ์Šค ๊ณก๋ฅ (Gaussian curvature):

$$ K = \frac{R}{2} \quad (\text{2์ฐจ์›์—์„œ}) $$

  • ๊ตฌ๋ฉด ($r = a$): $K = 1/a^2 > 0$
  • ํ‰๋ฉด: $K = 0$
  • ์Œ๊ณก๋ฉด: $K < 0$

์•„์ธ์Šˆํƒ€์ธ ํ…์„œ(Einstein tensor):

$$ G_{ij} = R_{ij} - \frac{1}{2}g_{ij}R $$

$G_{ij}$๋Š” $\nabla_i G^{ij} = 0$ (๋น„์•ˆํ‚ค ํ•ญ๋“ฑ์‹์— ์˜ํ•ด)์„ ๋งŒ์กฑํ•˜๋ฉฐ, ์ด๋Š” ์—๋„ˆ์ง€-์šด๋™๋Ÿ‰ ๋ณด์กด๊ณผ ์ง๊ฒฐ๋œ๋‹ค.

7.4 Python: ๊ณก๋ฅ  ๊ณ„์‚ฐ

import sympy as sp

# === ๋ฆฌ๋งŒ ๊ณก๋ฅ  ํ…์„œ ๊ณ„์‚ฐ ํ•จ์ˆ˜ ===

def riemann_tensor(Gamma, coords):
    """
    ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ๋กœ๋ถ€ํ„ฐ ๋ฆฌ๋งŒ ๊ณก๋ฅ  ํ…์„œ R^l_{kij}๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
    """
    n = len(coords)
    R = [[[[sp.Integer(0) for _ in range(n)]
           for _ in range(n)]
          for _ in range(n)]
         for _ in range(n)]

    for l in range(n):
        for k in range(n):
            for i in range(n):
                for j in range(n):
                    # โˆ‚_i ฮ“^l_{jk} - โˆ‚_j ฮ“^l_{ik}
                    term = sp.diff(Gamma[l][j][k], coords[i]) - \
                           sp.diff(Gamma[l][i][k], coords[j])
                    # + ฮ“^l_{im} ฮ“^m_{jk} - ฮ“^l_{jm} ฮ“^m_{ik}
                    for m in range(n):
                        term += Gamma[l][i][m] * Gamma[m][j][k] - \
                                Gamma[l][j][m] * Gamma[m][i][k]
                    R[l][k][i][j] = sp.simplify(term)
    return R

def ricci_tensor(R_riem, n):
    """๋ฆฌ์น˜ ํ…์„œ R_{ij} = R^k_{ikj}"""
    Ric = sp.zeros(n, n)
    for i in range(n):
        for j in range(n):
            s = sp.Integer(0)
            for k in range(n):
                s += R_riem[k][i][k][j]
            Ric[i, j] = sp.simplify(s)
    return Ric

def scalar_curvature(Ric, g_inv, n):
    """์Šค์นผ๋ผ ๊ณก๋ฅ  R = g^{ij} R_{ij}"""
    R_scalar = sp.Integer(0)
    for i in range(n):
        for j in range(n):
            R_scalar += g_inv[i, j] * Ric[i, j]
    return sp.simplify(R_scalar)

# --- 2์ฐจ์› ๊ตฌ๋ฉด (r = a)์˜ ๊ฐ€์šฐ์Šค ๊ณก๋ฅ  ๊ณ„์‚ฐ ---
theta, phi = sp.symbols('theta phi', positive=True)
a = sp.Symbol('a', positive=True)

g_sphere = sp.diag(a**2, a**2 * sp.sin(theta)**2)
coords_sphere = [theta, phi]

# ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ
Gamma_sp = christoffel_symbols(g_sphere, coords_sphere)
print("2์ฐจ์› ๊ตฌ๋ฉด์˜ 0์ด ์•„๋‹Œ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ:")
snames = ['ฮธ', 'ฯ†']
for k in range(2):
    for i in range(2):
        for j in range(i, 2):
            if Gamma_sp[k][i][j] != 0:
                print(f"  ฮ“^{snames[k]}_{{{snames[i]}{snames[j]}}} = {Gamma_sp[k][i][j]}")

# ๋ฆฌ๋งŒ ํ…์„œ
R_riem_sp = riemann_tensor(Gamma_sp, coords_sphere)

# ๋ฆฌ์น˜ ํ…์„œ
Ric_sp = ricci_tensor(R_riem_sp, 2)
print(f"\n๋ฆฌ์น˜ ํ…์„œ R_{{ij}}:")
sp.pprint(Ric_sp)

# ์Šค์นผ๋ผ ๊ณก๋ฅ 
g_sp_inv = g_sphere.inv()
R_sc = scalar_curvature(Ric_sp, g_sp_inv, 2)
print(f"\n์Šค์นผ๋ผ ๊ณก๋ฅ  R = {R_sc}")

# ๊ฐ€์šฐ์Šค ๊ณก๋ฅ  (2์ฐจ์›์—์„œ K = R/2)
K = sp.simplify(R_sc / 2)
print(f"๊ฐ€์šฐ์Šค ๊ณก๋ฅ  K = R/2 = {K}")
# ์ถœ๋ ฅ: K = 1/a^2 (์–‘์˜ ์ผ์ •ํ•œ ๊ณก๋ฅ  โ†’ ๊ตฌ๋ฉด)

8. ๋ฌผ๋ฆฌ์  ์‘์šฉ

8.1 ์—ฐ์†์ฒด ์—ญํ•™: ์‘๋ ฅ ํ…์„œ

์ฝ”์‹œ ์‘๋ ฅ ํ…์„œ(Cauchy stress tensor) $\sigma_{ij}$๋Š” ์—ฐ์†์ฒด ๋‚ด๋ถ€์˜ ์ž„์˜์˜ ๋ฉด์— ์ž‘์šฉํ•˜๋Š” ์‘๋ ฅ์„ ๊ธฐ์ˆ ํ•œ๋‹ค. ๋ฉด์˜ ๋ฒ•์„  ๋ฐฉํ–ฅ์ด $\hat{n}$์ผ ๋•Œ, ๊ทธ ๋ฉด์— ์ž‘์šฉํ•˜๋Š” ๋‹จ์œ„ ๋ฉด์ ๋‹น ํž˜(๊ฒฌ์ธ๋ ฅ, traction)์€:

$$ t_i = \sigma_{ij} n_j $$

$\sigma_{ij}$๋Š” ๋Œ€์นญ ํ…์„œ($\sigma_{ij} = \sigma_{ji}$, ๊ฐ์šด๋™๋Ÿ‰ ๋ณด์กด์— ์˜ํ•ด)์ด๋ฉฐ, ๋Œ€๊ฐ ์„ฑ๋ถ„์€ ๋ฒ•์„  ์‘๋ ฅ(normal stress), ๋น„๋Œ€๊ฐ ์„ฑ๋ถ„์€ ์ „๋‹จ ์‘๋ ฅ(shear stress)์ด๋‹ค.

import numpy as np
import matplotlib.pyplot as plt

# === 2D ์‘๋ ฅ ํ…์„œ์˜ ๋ชจ์–ด ์› (Mohr's Circle) ===
# ์‘๋ ฅ ํ…์„œ ฯƒ = [[ฯƒ_xx, ฯ„_xy], [ฯ„_xy, ฯƒ_yy]]
sigma_xx, sigma_yy, tau_xy = 50.0, 20.0, 15.0
sigma = np.array([[sigma_xx, tau_xy],
                   [tau_xy, sigma_yy]])

# ์ฃผ์‘๋ ฅ (๊ณ ์œ ๊ฐ’)
eigenvalues, eigenvectors = np.linalg.eigh(sigma)
sigma_1 = eigenvalues[1]  # ์ตœ๋Œ€ ์ฃผ์‘๋ ฅ
sigma_2 = eigenvalues[0]  # ์ตœ์†Œ ์ฃผ์‘๋ ฅ
print(f"์ฃผ์‘๋ ฅ: ฯƒโ‚ = {sigma_1:.2f} MPa, ฯƒโ‚‚ = {sigma_2:.2f} MPa")
print(f"์ฃผ์‘๋ ฅ ๋ฐฉํ–ฅ:\n{eigenvectors}")

# ๋ชจ์–ด ์› ๊ทธ๋ฆฌ๊ธฐ
center = (sigma_1 + sigma_2) / 2
radius = (sigma_1 - sigma_2) / 2

fig, ax = plt.subplots(figsize=(8, 6))
circle = plt.Circle((center, 0), radius, fill=False, color='blue', linewidth=2)
ax.add_patch(circle)

# ์›๋ž˜ ์‘๋ ฅ ์ƒํƒœ ํ‘œ์‹œ
ax.plot(sigma_xx, tau_xy, 'ro', markersize=8, label=f'(ฯƒ_xx, ฯ„_xy) = ({sigma_xx}, {tau_xy})')
ax.plot(sigma_yy, -tau_xy, 'go', markersize=8, label=f'(ฯƒ_yy, -ฯ„_xy) = ({sigma_yy}, {-tau_xy})')
ax.plot([sigma_1, sigma_2], [0, 0], 'k^', markersize=10, label=f'์ฃผ์‘๋ ฅ ฯƒโ‚={sigma_1:.1f}, ฯƒโ‚‚={sigma_2:.1f}')

ax.axhline(y=0, color='gray', linestyle='-', alpha=0.3)
ax.axvline(x=0, color='gray', linestyle='-', alpha=0.3)
ax.set_xlabel('๋ฒ•์„  ์‘๋ ฅ ฯƒ (MPa)')
ax.set_ylabel('์ „๋‹จ ์‘๋ ฅ ฯ„ (MPa)')
ax.set_title('๋ชจ์–ด ์› (Mohr\'s Circle)')
ax.set_aspect('equal')
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('mohr_circle.png', dpi=150, bbox_inches='tight')
plt.show()

8.2 ์ „์ž๊ธฐํ•™: ์ „์ž๊ธฐ์žฅ ํ…์„œ $F_{\mu\nu}$

ํŠน์ˆ˜ ์ƒ๋Œ€๋ก ์  ์ „์ž๊ธฐํ•™์—์„œ, ์ „๊ธฐ์žฅ $\mathbf{E}$์™€ ์ž๊ธฐ์žฅ $\mathbf{B}$๋Š” ํ•˜๋‚˜์˜ ๋ฐ˜๋Œ€์นญ rank-2 ํ…์„œ $F_{\mu\nu}$๋กœ ํ†ตํ•ฉ๋œ๋‹ค:

$$ F_{\mu\nu} = \begin{pmatrix} 0 & -E_x/c & -E_y/c & -E_z/c \\ E_x/c & 0 & -B_z & B_y \\ E_y/c & B_z & 0 & -B_x \\ E_z/c & -B_y & B_x & 0 \end{pmatrix} $$

๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹์˜ ํ…์„œ ํ˜•ํƒœ:

$$ \partial_\mu F^{\mu\nu} = \mu_0 J^\nu \quad (\text{๋น„๊ท ์งˆ ๋ฐฉ์ •์‹: ๊ฐ€์šฐ์Šค ๋ฒ•์น™ + ์•™ํŽ˜๋ฅด-๋งฅ์Šค์›ฐ ๋ฒ•์น™}) $$

$$ \partial_{[\lambda} F_{\mu\nu]} = 0 \quad (\text{๊ท ์งˆ ๋ฐฉ์ •์‹: ํŒจ๋Ÿฌ๋ฐ์ด ๋ฒ•์น™ + ์ž๊ธฐ ๊ฐ€์šฐ์Šค ๋ฒ•์น™}) $$

์ด ํ‘œํ˜„์€ ๋กœ๋ Œ์ธ  ๋ณ€ํ™˜์—์„œ์˜ ๊ณต๋ณ€์„ฑ์„ ์ž๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

import numpy as np

# === ์ „์ž๊ธฐ์žฅ ํ…์„œ ๊ตฌ์„ฑ ๋ฐ ๋กœ๋ Œ์ธ  ๋ณ€ํ™˜ ===

c = 1.0  # ์ž์—ฐ ๋‹จ์œ„ (c = 1)

def em_field_tensor(E, B):
    """์ „๊ธฐ์žฅ E์™€ ์ž๊ธฐ์žฅ B๋กœ๋ถ€ํ„ฐ ์ „์ž๊ธฐ์žฅ ํ…์„œ F_ฮผฮฝ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค."""
    Ex, Ey, Ez = E
    Bx, By, Bz = B
    F = np.array([
        [0,      -Ex/c,  -Ey/c,  -Ez/c],
        [Ex/c,    0,     -Bz,     By  ],
        [Ey/c,    Bz,     0,     -Bx  ],
        [Ez/c,   -By,     Bx,     0   ]
    ])
    return F

# x ๋ฐฉํ–ฅ ์ „๊ธฐ์žฅ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ
E = np.array([1.0, 0.0, 0.0])
B = np.array([0.0, 0.0, 0.0])
F = em_field_tensor(E, B)
print("์ „์ž๊ธฐ์žฅ ํ…์„œ F_ฮผฮฝ (์ˆœ์ˆ˜ ์ „๊ธฐ์žฅ):")
print(F)

# ๋กœ๋ Œ์ธ  ๋ณ€ํ™˜ (x ๋ฐฉํ–ฅ, ์†๋„ v = 0.6c)
v = 0.6
gamma = 1.0 / np.sqrt(1 - v**2)
beta = v

# ๋กœ๋ Œ์ธ  ๋ณ€ํ™˜ ํ–‰๋ ฌ ฮ›^ฮผ'_ฮฝ
Lambda = np.array([
    [gamma,      -gamma*beta, 0, 0],
    [-gamma*beta, gamma,      0, 0],
    [0,           0,          1, 0],
    [0,           0,          0, 1]
])

# ํ…์„œ ๋ณ€ํ™˜: F'^{ฮผฮฝ} = ฮ›^ฮผ_ฮฑ ฮ›^ฮฝ_ฮฒ F^{ฮฑฮฒ}
# ๋จผ์ € F^{ฮผฮฝ} = ฮท^{ฮผฮฑ} ฮท^{ฮฝฮฒ} F_{ฮฑฮฒ} (๋ฏผ์ฝ”ํ”„์Šคํ‚ค ๊ณ„๋Ÿ‰์œผ๋กœ ์ธ๋ฑ์Šค ์˜ฌ๋ฆผ)
eta = np.diag([-1, 1, 1, 1])  # ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ๊ณ„๋Ÿ‰ (-,+,+,+)
F_up = eta @ F @ eta           # F^{ฮผฮฝ}

F_prime_up = Lambda @ F_up @ Lambda.T
F_prime = eta @ F_prime_up @ eta  # F'_{ฮผฮฝ}๋กœ ๋‚ด๋ฆผ

print(f"\n๋กœ๋ Œ์ธ  ๋ณ€ํ™˜ ํ›„ (v = {v}c):")
print(f"F'_ฮผฮฝ:")
print(np.round(F_prime, 4))

# ๋ณ€ํ™˜๋œ ์ „๊ธฐ์žฅ๊ณผ ์ž๊ธฐ์žฅ ์ถ”์ถœ
E_prime = np.array([F_prime[0, 1], F_prime[0, 2], F_prime[0, 3]]) * (-c)
B_prime = np.array([F_prime[2, 3], F_prime[3, 1], F_prime[1, 2]])
print(f"\n๋ณ€ํ™˜๋œ ์ „๊ธฐ์žฅ: E' = {np.round(E_prime, 4)}")
print(f"๋ณ€ํ™˜๋œ ์ž๊ธฐ์žฅ: B' = {np.round(B_prime, 4)}")
print("์ˆœ์ˆ˜ ์ „๊ธฐ์žฅ์ด ๋กœ๋ Œ์ธ  ๋ณ€ํ™˜์— ์˜ํ•ด ์ž๊ธฐ์žฅ ์„ฑ๋ถ„์„ ํš๋“ํ•จ!")

# ๋กœ๋ Œ์ธ  ๋ถˆ๋ณ€๋Ÿ‰ ๊ฒ€์ฆ
inv1 = -0.5 * np.einsum('ij,ij->', F, F)   # F_{ฮผฮฝ}F^{ฮผฮฝ}/2
inv1_prime = -0.5 * np.einsum('ij,ij->', F_prime, F_prime)
print(f"\n๋กœ๋ Œ์ธ  ๋ถˆ๋ณ€๋Ÿ‰ F_ฮผฮฝ F^ฮผฮฝ: ์›๋ž˜ = {inv1:.4f}, ๋ณ€ํ™˜ ํ›„ = {inv1_prime:.4f}")

8.3 ์ผ๋ฐ˜ ์ƒ๋Œ€๋ก : ์•„์ธ์Šˆํƒ€์ธ ์žฅ๋ฐฉ์ •์‹

์ผ๋ฐ˜ ์ƒ๋Œ€๋ก ์˜ ํ•ต์‹ฌ์ธ ์•„์ธ์Šˆํƒ€์ธ ์žฅ๋ฐฉ์ •์‹(Einstein field equations)์€ ์‹œ๊ณต๊ฐ„์˜ ๊ธฐํ•˜ํ•™(๊ณก๋ฅ )๊ณผ ๋ฌผ์งˆ-์—๋„ˆ์ง€ ๋ถ„ํฌ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค:

$$ G_{\mu\nu} + \Lambda g_{\mu\nu} = \frac{8\pi G}{c^4}T_{\mu\nu} $$

์—ฌ๊ธฐ์„œ: - $G_{\mu\nu} = R_{\mu\nu} - \frac{1}{2}g_{\mu\nu}R$: ์•„์ธ์Šˆํƒ€์ธ ํ…์„œ (๊ธฐํ•˜ํ•™) - $\Lambda$: ์šฐ์ฃผ์ƒ์ˆ˜ - $T_{\mu\nu}$: ์—๋„ˆ์ง€-์šด๋™๋Ÿ‰ ํ…์„œ (๋ฌผ์งˆ)

์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๊ณ„๋Ÿ‰(Schwarzschild metric): ๊ตฌ๋Œ€์นญ ์ง„๊ณต ํ•ด

$$ ds^2 = -\left(1 - \frac{r_s}{r}\right)c^2 dt^2 + \left(1 - \frac{r_s}{r}\right)^{-1}dr^2 + r^2 d\theta^2 + r^2\sin^2\theta \, d\phi^2 $$

์—ฌ๊ธฐ์„œ $r_s = 2GM/c^2$๋Š” ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๋ฐ˜์ง€๋ฆ„์ด๋‹ค.

import sympy as sp

# === ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๊ณ„๋Ÿ‰์˜ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ๊ณ„์‚ฐ ===
t, r, theta, phi = sp.symbols('t r theta phi')
r_s, c_sym = sp.symbols('r_s c', positive=True)

# ์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๊ณ„๋Ÿ‰ ํ…์„œ (๋Œ€๊ฐ)
f = 1 - r_s / r  # f(r) = 1 - r_s/r

g_schw = sp.diag(
    -f * c_sym**2,   # g_{tt}
    1 / f,           # g_{rr}
    r**2,            # g_{ฮธฮธ}
    r**2 * sp.sin(theta)**2  # g_{ฯ†ฯ†}
)
coords_schw = [t, r, theta, phi]

print("์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๊ณ„๋Ÿ‰ ํ…์„œ:")
sp.pprint(g_schw)

# ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ ๊ณ„์‚ฐ (์‹œ๊ฐ„ ์†Œ์š” ๊ฐ€๋Šฅ)
Gamma_schw = christoffel_symbols(g_schw, coords_schw)

print("\n์Šˆ๋ฐ”๋ฅด์ธ ์‹คํŠธ ๊ณ„๋Ÿ‰์˜ 0์ด ์•„๋‹Œ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ:")
coord_names = ['t', 'r', 'ฮธ', 'ฯ†']
for k in range(4):
    for i in range(4):
        for j in range(i, 4):
            val = Gamma_schw[k][i][j]
            if val != 0:
                print(f"  ฮ“^{coord_names[k]}_{{{coord_names[i]}{coord_names[j]}}} = {val}")

์—ฐ์Šต ๋ฌธ์ œ

๋ฌธ์ œ 1: ํ…์„œ ๋ณ€ํ™˜

2์ฐจ์›์—์„œ ์ขŒํ‘œ ๋ณ€ํ™˜ $x' = x\cosh\alpha + y\sinh\alpha$, $y' = x\sinh\alpha + y\cosh\alpha$ (๋กœ๋ Œ์ธ  ๋ถ€์ŠคํŠธ)๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

(a) ๋ณ€ํ™˜ ํ–‰๋ ฌ $\frac{\partial x'^i}{\partial x^j}$๋ฅผ ๊ตฌํ•˜๋ผ.

(b) ๋ฒกํ„ฐ $A^i = (3, 4)$๋ฅผ ์ƒˆ ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•˜๋ผ ($\alpha = 0.5$).

(c) ํ…์„œ $T^{ij} = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}$๋ฅผ ์ƒˆ ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•˜๋ผ.

๋ฌธ์ œ 2: ์•„์ธ์Šˆํƒ€์ธ ํ•ฉ์‚ฐ ๊ทœ์•ฝ

๋‹ค์Œ ํ…์„œ ํ‘œํ˜„์„ ํ•ฉ์‚ฐ ๊ธฐํ˜ธ ์—†์ด ์•„์ธ์Šˆํƒ€์ธ ํ•ฉ์‚ฐ ๊ทœ์•ฝ์œผ๋กœ ์“ฐ๊ณ , 3์ฐจ์›์—์„œ ์ „๊ฐœํ•˜๋ผ:

(a) ๋ฒกํ„ฐ์˜ ๋‚ด์  $\sum_i A^i B_i$

(b) ํ–‰๋ ฌ ๊ณฑ $\sum_k M^i{}_k N^k{}_j$

(c) $\varepsilon_{ijk}\varepsilon_{imn}$์„ $\delta$-ํ•ญ๋“ฑ์‹์œผ๋กœ ํ™˜์›ํ•˜๋ผ.

๋ฌธ์ œ 3: ๊ณ„๋Ÿ‰ ํ…์„œ์™€ ์ธ๋ฑ์Šค ์˜ฌ๋ฆผ/๋‚ด๋ฆผ

2์ฐจ์› ๊ทน์ขŒํ‘œ $(r, \theta)$์—์„œ $ds^2 = dr^2 + r^2 d\theta^2$์ด๋‹ค.

(a) ๊ณ„๋Ÿ‰ ํ…์„œ $g_{ij}$์™€ ์—ญ๊ณ„๋Ÿ‰ ํ…์„œ $g^{ij}$๋ฅผ ๊ตฌํ•˜๋ผ.

(b) ๋ฐ˜๋ณ€ ๋ฒกํ„ฐ $A^i = (A^r, A^\theta) = (2, 1/r)$์˜ ๊ณต๋ณ€ ์„ฑ๋ถ„ $A_i = g_{ij}A^j$๋ฅผ ๊ตฌํ•˜๋ผ.

(c) $A^i A_i$๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฒกํ„ฐ ํฌ๊ธฐ์˜ ์ œ๊ณฑ์ด ์ขŒํ‘œ์— ๋ฌด๊ด€ํ•œ ๋ถˆ๋ณ€๋Ÿ‰์ž„์„ ํ™•์ธํ•˜๋ผ.

๋ฌธ์ œ 4: ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ

2์ฐจ์› ๊ทน์ขŒํ‘œ์˜ ๊ณ„๋Ÿ‰ ํ…์„œ $g = \text{diag}(1, r^2)$์— ๋Œ€ํ•ด:

(a) ๋ชจ๋“  ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ $\Gamma^k{}_{ij}$๋ฅผ ๊ณ„์‚ฐํ•˜๋ผ.

(b) ๋ฒกํ„ฐ์žฅ $A^r = \cos\theta$, $A^\theta = -\sin\theta / r$์˜ ๊ณต๋ณ€ ๋ฐœ์‚ฐ $\nabla_i A^i$๋ฅผ ๊ณ„์‚ฐํ•˜๋ผ.

(c) ์ด ๊ฒฐ๊ณผ๊ฐ€ ์ง๊ต ์ขŒํ‘œ์—์„œ์˜ ๋ฐœ์‚ฐ๊ณผ ์ผ์น˜ํ•จ์„ ํ™•์ธํ•˜๋ผ.

๋ฌธ์ œ 5: ์ธก์ง€์„ 

2์ฐจ์› ์Œ๊ณก๋ฉด(pseudosphere, $K = -1$)์˜ ๊ณ„๋Ÿ‰์ด $ds^2 = du^2 + e^{-2u}dv^2$๋กœ ์ฃผ์–ด์ง„๋‹ค.

(a) ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ๋ฅผ ๊ตฌํ•˜๋ผ.

(b) ๊ฐ€์šฐ์Šค ๊ณก๋ฅ  $K$๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ $K = -1$์ž„์„ ํ™•์ธํ•˜๋ผ.

(c) ์ธก์ง€์„  ๋ฐฉ์ •์‹์„ ์“ฐ๊ณ , $u = \text{const}$ ๊ณก์„ ์ด ์ธก์ง€์„ ์ธ์ง€ ํŒ๋ณ„ํ•˜๋ผ.

๋ฌธ์ œ 6: ๊ณก๋ฅ  ํ…์„œ

ํ† ๋Ÿฌ์Šค(torus) ํ‘œ๋ฉด์˜ ๊ณ„๋Ÿ‰์ด ๋งค๊ฐœ๋ณ€์ˆ˜ $(\theta, \phi)$๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค:

$$ ds^2 = a^2 d\theta^2 + (R + a\cos\theta)^2 d\phi^2 $$

์—ฌ๊ธฐ์„œ $R$์€ ํ† ๋Ÿฌ์Šค์˜ ํฐ ๋ฐ˜์ง€๋ฆ„, $a$๋Š” ์ž‘์€ ๋ฐ˜์ง€๋ฆ„์ด๋‹ค.

(a) ๊ฐ€์šฐ์Šค ๊ณก๋ฅ  $K(\theta)$๋ฅผ ๊ตฌํ•˜๋ผ.

(b) $K > 0$, $K = 0$, $K < 0$์ธ ์˜์—ญ์„ $\theta$ ๊ฐ’์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋ผ.

(c) ๊ฐ€์šฐ์Šค-๋ณด๋„ค ์ •๋ฆฌ $\int K \, dA = 2\pi\chi$์—์„œ $\chi = 0$ (ํ† ๋Ÿฌ์Šค์˜ ์˜ค์ผ๋Ÿฌ ์ˆ˜)์ž„์„ ํ™•์ธํ•˜๋ผ.

๋ฌธ์ œ 7: ์ „์ž๊ธฐ์žฅ ํ…์„œ

์ „๊ธฐ์žฅ $\mathbf{E} = E_0 \hat{x}$, ์ž๊ธฐ์žฅ $\mathbf{B} = B_0 \hat{z}$๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

(a) ์ „์ž๊ธฐ์žฅ ํ…์„œ $F_{\mu\nu}$๋ฅผ ๊ตฌ์„ฑํ•˜๋ผ.

(b) ๋กœ๋ Œ์ธ  ๋ถˆ๋ณ€๋Ÿ‰ $F_{\mu\nu}F^{\mu\nu}$์™€ $\frac{1}{2}\varepsilon^{\mu\nu\rho\sigma}F_{\mu\nu}F_{\rho\sigma}$๋ฅผ ๊ณ„์‚ฐํ•˜๋ผ.

(c) $x$-๋ฐฉํ–ฅ ๋กœ๋ Œ์ธ  ๋ถ€์ŠคํŠธ($v = 0.8c$)๋กœ ๋ณ€ํ™˜ํ•œ ํ›„์˜ $\mathbf{E}'$, $\mathbf{B}'$๋ฅผ ๊ตฌํ•˜๋ผ.

๋ฌธ์ œ 8: ์‘๋ ฅ ํ…์„œ์˜ ์ฃผ์ถ•

3์ฐจ์› ์‘๋ ฅ ํ…์„œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค:

$$ \sigma_{ij} = \begin{pmatrix} 100 & 30 & 0 \\ 30 & 50 & 20 \\ 0 & 20 & 80 \end{pmatrix} \text{ (MPa)} $$

(a) ์ฃผ์‘๋ ฅ(principal stresses)๊ณผ ์ฃผ์‘๋ ฅ ๋ฐฉํ–ฅ์„ ๊ตฌํ•˜๋ผ (๊ณ ์œ ๊ฐ’/๊ณ ์œ ๋ฒกํ„ฐ).

(b) ์ตœ๋Œ€ ์ „๋‹จ ์‘๋ ฅ์„ ๊ตฌํ•˜๋ผ.

(c) ํฐ ๋ฏธ์ œ์Šค ์‘๋ ฅ(von Mises stress)์„ ๊ณ„์‚ฐํ•˜๋ผ: $\sigma_v = \sqrt{\frac{1}{2}[(\sigma_1-\sigma_2)^2 + (\sigma_2-\sigma_3)^2 + (\sigma_3-\sigma_1)^2]}$.


์‹ฌํ™” ํ•™์Šต

๋ฏธ๋ถ„ ํ˜•์‹ (Differential Forms)

ํ…์„œ ํ•ด์„์˜ ํ˜„๋Œ€์  ์–ธ์–ด์ธ ๋ฏธ๋ถ„ ํ˜•์‹(differential forms)์€ ๋ฐ˜๋Œ€์นญ ๊ณต๋ณ€ ํ…์„œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค. ์™ธ๋Œ€์ˆ˜(exterior algebra)์™€ ์™ธ๋ฏธ๋ถ„(exterior derivative) $d$๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ:

  • 0-ํ˜•์‹ = ์Šค์นผ๋ผ ํ•จ์ˆ˜
  • 1-ํ˜•์‹ = $\omega = A_i dx^i$
  • 2-ํ˜•์‹ = $F = \frac{1}{2}F_{ij}dx^i \wedge dx^j$

๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹์€ ๋ฏธ๋ถ„ ํ˜•์‹์œผ๋กœ ๊ทน๋„๋กœ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค: $dF = 0$, $d{*F} = J$

๋ฆฌ ๋ฏธ๋ถ„ (Lie Derivative)

๋ฆฌ ๋ฏธ๋ถ„(Lie derivative) $\mathcal{L}_X T$๋Š” ๋ฒกํ„ฐ์žฅ $X$๋ฅผ ๋”ฐ๋ผ ํ…์„œ $T$์˜ ๋ณ€ํ™”๋ฅผ ์ขŒํ‘œ์— ๋ฌด๊ด€ํ•˜๊ฒŒ ์ •์˜ํ•œ๋‹ค. ์ด๋Š” ๋Œ€์นญ๊ณผ ๋ณด์กด ๋ฒ•์น™(ํ‚ฌ๋ง ๋ฒกํ„ฐ์žฅ)์„ ๋‹ค๋ฃจ๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ด๋‹ค.

์˜ฌ๋‹ค๋ฐœ๊ณผ ๊ฒŒ์ด์ง€ ์ด๋ก  (Fiber Bundles and Gauge Theory)

์–‘-๋ฐ€์Šค ์ด๋ก (Yang-Mills theory)์—์„œ ๊ฒŒ์ด์ง€ ๊ฒฐํ•ฉ(gauge connection)์€ ํฌ๋ฆฌ์Šคํ† ํŽ  ๊ธฐํ˜ธ์˜ ์ผ๋ฐ˜ํ™”์ด๋ฉฐ, ๊ณก๋ฅ ์€ ์žฅ ๊ฐ•๋„ ํ…์„œ(field strength tensor)์— ๋Œ€์‘ํ•œ๋‹ค. ์ด๋Š” ํ‘œ์ค€ ๋ชจํ˜•์˜ ์ˆ˜ํ•™์  ๊ธฐ์ดˆ๋ฅผ ์ด๋ฃฌ๋‹ค.

๊ณ„์‚ฐ ๋„๊ตฌ

๋„๊ตฌ ์–ธ์–ด ์„ค๋ช…
sympy.diffgeom Python ๋ฏธ๋ถ„ ๊ธฐํ•˜ ๊ณ„์‚ฐ
einsteinpy Python ์ผ๋ฐ˜ ์ƒ๋Œ€๋ก  ํ…์„œ ๊ณ„์‚ฐ
xAct / xTensor Mathematica ์ „๋ฌธ์  ํ…์„œ ๋Œ€์ˆ˜ ์‹œ์Šคํ…œ
SageManifolds SageMath ๋ฏธ๋ถ„ ๋‹ค์–‘์ฒด ๊ณ„์‚ฐ
cadabra2 Python/C++ ์žฅ๋ก (field theory) ํ…์„œ ๊ณ„์‚ฐ

์ถ”์ฒœ ์ฐธ๊ณ  ์ž๋ฃŒ

  1. Boas, M. L. (2005). Mathematical Methods in the Physical Sciences, 3rd ed., Chapter 10. Wiley.
  2. Carroll, S. M. (2019). Spacetime and Geometry, 2nd ed. Cambridge University Press.
  3. ์ผ๋ฐ˜ ์ƒ๋Œ€๋ก ์—์„œ์˜ ํ…์„œ ํ•ด์„์„ ์œ„ํ•œ ์ตœ๊ณ ์˜ ๊ต์žฌ
  4. Schutz, B. (2009). A First Course in General Relativity, 2nd ed. Cambridge University Press.
  5. Arfken, G. B., Weber, H. J., & Harris, F. E. (2012). Mathematical Methods for Physicists, 7th ed., Chapter 3. Academic Press.
  6. Nakahara, M. (2003). Geometry, Topology and Physics, 2nd ed. CRC Press.
  7. ๋ฏธ๋ถ„ ํ˜•์‹, ์˜ฌ๋‹ค๋ฐœ, ๊ฒŒ์ด์ง€ ์ด๋ก ์˜ ์ˆ˜ํ•™์  ๊ธฐ์ดˆ

์ด์ „: 17. ๋ณ€๋ถ„๋ฒ• ๋‹ค์Œ: ๊ณผ์ • ์™„๋ฃŒ! 00. ๊ฐœ์š”๋กœ ๋Œ์•„๊ฐ€๊ธฐ

to navigate between lessons