05. ๋ฒกํ„ฐ ํ•ด์„ (Vector Analysis)

05. ๋ฒกํ„ฐ ํ•ด์„ (Vector Analysis)

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

  • ๊ธฐ์šธ๊ธฐ(gradient), ๋ฐœ์‚ฐ(divergence), ํšŒ์ „(curl) ์—ฐ์‚ฐ์ž์˜ ๋ฌผ๋ฆฌ์  ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์„ ์ ๋ถ„๊ณผ ๋ฉด์ ๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ณด์กด์žฅ(conservative field)์˜ ํŒ๋ณ„ ์กฐ๊ฑด์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๊ทธ๋ฆฐ ์ •๋ฆฌ, ์Šคํ† ํฌ์Šค ์ •๋ฆฌ, ๊ฐ€์šฐ์Šค ๋ฐœ์‚ฐ ์ •๋ฆฌ๋ฅผ ์„œ์ˆ ํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹์„ ์ ๋ถ„ ํ˜•ํƒœ์™€ ๋ฏธ๋ถ„ ํ˜•ํƒœ๋กœ ์ƒํ˜ธ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค
  • Python(SymPy, Matplotlib)์„ ์ด์šฉํ•˜์—ฌ ๋ฒกํ„ฐ์žฅ์„ ์‹œ๊ฐํ™”ํ•˜๊ณ , ์„ ์ ๋ถ„/๋ฉด์ ๋ถ„์„ ์ˆ˜์น˜์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค

1. ๋ฒกํ„ฐ ๋ฏธ๋ถ„ ์—ฐ์‚ฐ์ž

๋ฒกํ„ฐ ๋ฏธ๋ถ„ ์—ฐ์‚ฐ์ž๋Š” ์Šค์นผ๋ผ์žฅ(scalar field)๊ณผ ๋ฒกํ„ฐ์žฅ(vector field)์˜ ๊ณต๊ฐ„์  ๋ณ€ํ™”๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ด๋‹ค. 3์ฐจ์› ์ง๊ต ์ขŒํ‘œ๊ณ„์—์„œ ๋‚˜๋ธ”๋ผ(nabla) ์—ฐ์‚ฐ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค:

$$ \nabla = \hat{x}\frac{\partial}{\partial x} + \hat{y}\frac{\partial}{\partial y} + \hat{z}\frac{\partial}{\partial z} $$

1.1 ๊ธฐ์šธ๊ธฐ (Gradient, nabla f)

์Šค์นผ๋ผ์žฅ $f(x, y, z)$์˜ ๊ธฐ์šธ๊ธฐ(gradient)๋Š” $f$๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ๊ณผ ๊ทธ ๋ณ€ํ™”์œจ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฒกํ„ฐ์žฅ์ด๋‹ค.

$$ \nabla f = \frac{\partial f}{\partial x}\hat{x} + \frac{\partial f}{\partial y}\hat{y} + \frac{\partial f}{\partial z}\hat{z} $$

๋ฌผ๋ฆฌ์  ์˜๋ฏธ: - ๋ฐฉํ–ฅ: $f$๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ - ํฌ๊ธฐ: ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ณ€ํ™”์œจ (directional derivative์˜ ์ตœ๋Œ“๊ฐ’) - ๋“ฑ์œ„๋ฉด(level surface)์— ํ•ญ์ƒ ์ˆ˜์ง

์˜ˆ์‹œ: ์˜จ๋„ ๋ถ„ํฌ $T(x, y) = x^2 + y^2$ (2D ์—ด์›)

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
from sympy.vector import CoordSys3D

# === SymPy๋ฅผ ์ด์šฉํ•œ ํ•ด์„์  gradient ๊ณ„์‚ฐ ===
N = CoordSys3D('N')
x, y, z = sp.symbols('x y z')

# ์Šค์นผ๋ผ์žฅ ์ •์˜
f = x**2 + y**2

# gradient ๊ณ„์‚ฐ
grad_f = sp.diff(f, x)*N.i + sp.diff(f, y)*N.j
print(f"f = {f}")
print(f"โˆ‡f = {grad_f}")  # 2*x*N.i + 2*y*N.j

# === Matplotlib๋ฅผ ์ด์šฉํ•œ ์‹œ๊ฐํ™” ===
X, Y = np.meshgrid(np.linspace(-3, 3, 30), np.linspace(-3, 3, 30))
T = X**2 + Y**2  # ์˜จ๋„ ๋ถ„ํฌ

# gradient ์„ฑ๋ถ„
dTdx = 2 * X
dTdy = 2 * Y

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# ๋“ฑ๊ณ ์„  + gradient ๋ฒกํ„ฐ
ax = axes[0]
contour = ax.contourf(X, Y, T, levels=20, cmap='hot')
ax.quiver(X[::3, ::3], Y[::3, ::3], dTdx[::3, ::3], dTdy[::3, ::3],
          color='cyan', alpha=0.8)
plt.colorbar(contour, ax=ax, label='T(x,y)')
ax.set_title('์˜จ๋„ ๋ถ„ํฌ์™€ gradient ๋ฒกํ„ฐ')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')

# gradient ํฌ๊ธฐ
ax = axes[1]
grad_mag = np.sqrt(dTdx**2 + dTdy**2)
im = ax.pcolormesh(X, Y, grad_mag, cmap='viridis', shading='auto')
plt.colorbar(im, ax=ax, label='|โˆ‡T|')
ax.set_title('gradient ํฌ๊ธฐ (๋ณ€ํ™”์œจ)')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')

plt.tight_layout()
plt.savefig('gradient_visualization.png', dpi=150, bbox_inches='tight')
plt.show()

1.2 ๋ฐœ์‚ฐ (Divergence, nabla . F)

๋ฒกํ„ฐ์žฅ $\mathbf{F} = F_x\hat{x} + F_y\hat{y} + F_z\hat{z}$์˜ ๋ฐœ์‚ฐ(divergence)์€ ๊ฐ ์ ์—์„œ ๋ฒกํ„ฐ์žฅ์ด "ํผ์ ธ๋‚˜๊ฐ€๋Š” ์ •๋„"๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์Šค์นผ๋ผ๋Ÿ‰์ด๋‹ค.

$$ \nabla \cdot \mathbf{F} = \frac{\partial F_x}{\partial x} + \frac{\partial F_y}{\partial y} + \frac{\partial F_z}{\partial z} $$

๋ฌผ๋ฆฌ์  ์˜๋ฏธ: - $\nabla \cdot \mathbf{F} > 0$: ํ•ด๋‹น ์ ์€ ์›์ฒœ(source) โ€” ๋ฒกํ„ฐ์žฅ์ด ํผ์ ธ๋‚˜๊ฐ - $\nabla \cdot \mathbf{F} < 0$: ํ•ด๋‹น ์ ์€ ํก์ˆ˜์›(sink) โ€” ๋ฒกํ„ฐ์žฅ์ด ๋ชจ์—ฌ๋“ฆ - $\nabla \cdot \mathbf{F} = 0$: ๋น„์••์ถ•(solenoidal) โ€” ์ƒ์„ฑ๋„ ์†Œ๋ฉธ๋„ ์—†์Œ

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp

x, y = sp.symbols('x y')

# ์›์ฒœ์ด ์žˆ๋Š” ๋ฒกํ„ฐ์žฅ: F = (x, y) โ€” ์›์ ์—์„œ ํผ์ ธ๋‚˜๊ฐ
Fx_expr = x
Fy_expr = y
div_F = sp.diff(Fx_expr, x) + sp.diff(Fy_expr, y)
print(f"F = ({Fx_expr})xฬ‚ + ({Fy_expr})ลท")
print(f"โˆ‡ยทF = {div_F}")  # 2 (ํ•ญ์ƒ ์–‘์ˆ˜ โ†’ ๋ชจ๋“  ์ ์ด source)

# ๋น„์••์ถ• ๋ฒกํ„ฐ์žฅ: G = (-y, x) โ€” ํšŒ์ „๋งŒ ํ•˜๋Š” ์žฅ
Gx_expr = -y
Gy_expr = x
div_G = sp.diff(Gx_expr, x) + sp.diff(Gy_expr, y)
print(f"\nG = ({Gx_expr})xฬ‚ + ({Gy_expr})ลท")
print(f"โˆ‡ยทG = {div_G}")  # 0 (๋น„์••์ถ•)

# ์‹œ๊ฐํ™”
X, Y = np.meshgrid(np.linspace(-2, 2, 15), np.linspace(-2, 2, 15))

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# F = (x, y): divergence > 0 (source field)
ax = axes[0]
ax.quiver(X, Y, X, Y, color='red', alpha=0.7)
ax.set_title(f'F = (x, y),  โˆ‡ยทF = {div_F} (์›์ฒœ์žฅ)')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)

# G = (-y, x): divergence = 0 (solenoidal)
ax = axes[1]
ax.quiver(X, Y, -Y, X, color='blue', alpha=0.7)
ax.set_title(f'G = (-y, x),  โˆ‡ยทG = {div_G} (๋น„์••์ถ•์žฅ)')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('divergence_comparison.png', dpi=150, bbox_inches='tight')
plt.show()

1.3 ํšŒ์ „ (Curl, nabla x F)

๋ฒกํ„ฐ์žฅ $\mathbf{F}$์˜ ํšŒ์ „(curl)์€ ๊ฐ ์ ์—์„œ ๋ฒกํ„ฐ์žฅ์ด "ํšŒ์ „ํ•˜๋Š” ์ •๋„์™€ ํšŒ์ „์ถ•"์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฒกํ„ฐ์žฅ์ด๋‹ค.

$$ \nabla \times \mathbf{F} = \begin{vmatrix} \hat{x} & \hat{y} & \hat{z} \\ \frac{\partial}{\partial x} & \frac{\partial}{\partial y} & \frac{\partial}{\partial z} \\ F_x & F_y & F_z \end{vmatrix} $$

์ „๊ฐœํ•˜๋ฉด:

$$ \nabla \times \mathbf{F} = \left(\frac{\partial F_z}{\partial y} - \frac{\partial F_y}{\partial z}\right)\hat{x} + \left(\frac{\partial F_x}{\partial z} - \frac{\partial F_z}{\partial x}\right)\hat{y} + \left(\frac{\partial F_y}{\partial x} - \frac{\partial F_x}{\partial y}\right)\hat{z} $$

๋ฌผ๋ฆฌ์  ์˜๋ฏธ: - ๋ฐฉํ–ฅ: ์˜ค๋ฅธ์† ๋ฒ•์น™์— ๋”ฐ๋ฅธ ํšŒ์ „์ถ• - ํฌ๊ธฐ: ํšŒ์ „์˜ ์„ธ๊ธฐ (๋‹จ์œ„ ๋ฉด์ ๋‹น ์ˆœํ™˜) - $\nabla \times \mathbf{F} = \mathbf{0}$์ด๋ฉด ๋น„ํšŒ์ „์žฅ(irrotational field) โ€” ๋ณด์กด์žฅ์˜ ํ•„์š”์ถฉ๋ถ„์กฐ๊ฑด (๋‹จ์ˆœ์—ฐ๊ฒฐ ์˜์—ญ์—์„œ)

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp

x, y, z = sp.symbols('x y z')

# 3D ๋ฒกํ„ฐ์žฅ: F = (-y, x, 0) โ€” z์ถ• ๋‘˜๋ ˆ ํšŒ์ „
Fx, Fy, Fz = -y, x, sp.Integer(0)

# curl ๊ณ„์‚ฐ
curl_x = sp.diff(Fz, y) - sp.diff(Fy, z)
curl_y = sp.diff(Fx, z) - sp.diff(Fz, x)
curl_z = sp.diff(Fy, x) - sp.diff(Fx, y)

print(f"F = ({Fx})xฬ‚ + ({Fy})ลท + ({Fz})แบ‘")
print(f"โˆ‡ร—F = ({curl_x})xฬ‚ + ({curl_y})ลท + ({curl_z})แบ‘")
# ๊ฒฐ๊ณผ: (0)xฬ‚ + (0)ลท + (2)แบ‘ โ†’ z ๋ฐฉํ–ฅ์œผ๋กœ ๊ท ์ผํ•œ ํšŒ์ „

# 2D streamplot์œผ๋กœ ์‹œ๊ฐํ™”
X, Y = np.meshgrid(np.linspace(-3, 3, 30), np.linspace(-3, 3, 30))
U = -Y  # Fx = -y
V = X   # Fy = x
speed = np.sqrt(U**2 + V**2)

fig, ax = plt.subplots(figsize=(8, 8))
strm = ax.streamplot(X, Y, U, V, color=speed, cmap='coolwarm',
                      density=1.5, linewidth=1.5, arrowsize=1.5)
plt.colorbar(strm.lines, ax=ax, label='|F|')
ax.set_title('F = (-y, x): โˆ‡ร—F = 2แบ‘ (๊ท ์ผํ•œ ํšŒ์ „์žฅ)')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('curl_streamplot.png', dpi=150, bbox_inches='tight')
plt.show()

1.4 ๋ผํ”Œ๋ผ์‹œ์•ˆ (nabla^2)

์Šค์นผ๋ผ ๋ผํ”Œ๋ผ์‹œ์•ˆ์€ ๊ธฐ์šธ๊ธฐ์˜ ๋ฐœ์‚ฐ์œผ๋กœ ์ •์˜๋œ๋‹ค:

$$ \nabla^2 f = \nabla \cdot (\nabla f) = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2} + \frac{\partial^2 f}{\partial z^2} $$

๋ฒกํ„ฐ ๋ผํ”Œ๋ผ์‹œ์•ˆ์€ ๊ฐ ์„ฑ๋ถ„์— ์Šค์นผ๋ผ ๋ผํ”Œ๋ผ์‹œ์•ˆ์„ ์ ์šฉํ•œ๋‹ค:

$$ \nabla^2 \mathbf{F} = (\nabla^2 F_x)\hat{x} + (\nabla^2 F_y)\hat{y} + (\nabla^2 F_z)\hat{z} $$

๋ฌผ๋ฆฌ์  ์˜๋ฏธ: - ํ•œ ์ ์—์„œ์˜ ๊ฐ’๊ณผ ๊ทธ ์ฃผ๋ณ€ ํ‰๊ท ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ๋‚˜ํƒ€๋ƒ„ - $\nabla^2 f > 0$: ์ฃผ๋ณ€ ํ‰๊ท ์ด ํ˜„์žฌ ๊ฐ’๋ณด๋‹ค ํผ (๊ทน์†Œ ๊ฒฝํ–ฅ) - $\nabla^2 f = 0$: ์กฐํ™”ํ•จ์ˆ˜(harmonic function) โ€” ๋ผํ”Œ๋ผ์Šค ๋ฐฉ์ •์‹์˜ ํ•ด

import sympy as sp

x, y, z = sp.symbols('x y z')

# ์กฐํ™”ํ•จ์ˆ˜์ธ์ง€ ํ™•์ธ: f = 1/r (r = sqrt(x^2 + y^2 + z^2))
r = sp.sqrt(x**2 + y**2 + z**2)
f = 1 / r

laplacian_f = sp.diff(f, x, 2) + sp.diff(f, y, 2) + sp.diff(f, z, 2)
laplacian_f_simplified = sp.simplify(laplacian_f)
print(f"f = 1/r")
print(f"โˆ‡ยฒf = {laplacian_f_simplified}")  # 0 (r โ‰  0์—์„œ ์กฐํ™”ํ•จ์ˆ˜)

# ๋น„์กฐํ™”ํ•จ์ˆ˜ ์˜ˆ์‹œ: g = x^2 + y^2
g = x**2 + y**2
laplacian_g = sp.diff(g, x, 2) + sp.diff(g, y, 2)
print(f"\ng = {g}")
print(f"โˆ‡ยฒg = {laplacian_g}")  # 4 (๋น„์กฐํ™”)

1.5 ๋ฒกํ„ฐ ํ•ญ๋“ฑ์‹

๋ฒกํ„ฐ ํ•ด์„์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š”ํ•œ ํ•ญ๋“ฑ์‹๋“ค:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    ํ•ต์‹ฌ ๋ฒกํ„ฐ ํ•ญ๋“ฑ์‹                               โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                 โ”‚
โ”‚  1. โˆ‡ร—(โˆ‡f) = 0          gradient์˜ curl์€ ํ•ญ์ƒ 0               โ”‚
โ”‚     โ†’ ๋ณด์กด์žฅ์€ ํ•ญ์ƒ ๋น„ํšŒ์ „                                       โ”‚
โ”‚                                                                 โ”‚
โ”‚  2. โˆ‡ยท(โˆ‡ร—F) = 0         curl์˜ divergence๋Š” ํ•ญ์ƒ 0             โ”‚
โ”‚     โ†’ ์ž๊ธฐ์žฅ์€ ํ•ญ์ƒ ๋น„๋ฐœ์‚ฐ (โˆ‡ยทB = 0)                            โ”‚
โ”‚                                                                 โ”‚
โ”‚  3. โˆ‡ร—(โˆ‡ร—F) = โˆ‡(โˆ‡ยทF) - โˆ‡ยฒF                                   โ”‚
โ”‚     โ†’ curl of curl ๋ถ„ํ•ด (์ „์ž๊ธฐํŒŒ ๋ฐฉ์ •์‹ ์œ ๋„์— ์‚ฌ์šฉ)             โ”‚
โ”‚                                                                 โ”‚
โ”‚  4. โˆ‡ยท(fF) = f(โˆ‡ยทF) + Fยท(โˆ‡f)         ๊ณฑ์˜ ๋ฐœ์‚ฐ               โ”‚
โ”‚  5. โˆ‡ร—(fF) = f(โˆ‡ร—F) + (โˆ‡f)ร—F         ๊ณฑ์˜ ํšŒ์ „               โ”‚
โ”‚  6. โˆ‡(FยทG) = (Fยทโˆ‡)G + (Gยทโˆ‡)F + Fร—(โˆ‡ร—G) + Gร—(โˆ‡ร—F)           โ”‚
โ”‚                                                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
import sympy as sp
from sympy.vector import CoordSys3D, curl, divergence, gradient

N = CoordSys3D('N')
x, y, z = N.x, N.y, N.z

# ํ•ญ๋“ฑ์‹ 1 ๊ฒ€์ฆ: curl(grad(f)) = 0
f = x**2 * y + y**2 * z + z**2 * x
grad_f = gradient(f, N)
curl_grad_f = curl(grad_f, N)
print(f"f = {f}")
print(f"โˆ‡f = {grad_f}")
print(f"โˆ‡ร—(โˆ‡f) = {curl_grad_f}")  # 0

# ํ•ญ๋“ฑ์‹ 2 ๊ฒ€์ฆ: div(curl(F)) = 0
F = (x*y*z)*N.i + (x**2 - z)*N.j + (y*z**2)*N.k
curl_F = curl(F, N)
div_curl_F = divergence(curl_F, N)
print(f"\nF = {F}")
print(f"โˆ‡ร—F = {curl_F}")
print(f"โˆ‡ยท(โˆ‡ร—F) = {sp.simplify(div_curl_F)}")  # 0

2. ์„ ์ ๋ถ„ (Line Integrals)

์„ ์ ๋ถ„์€ ๊ณก์„ ์„ ๋”ฐ๋ผ ์Šค์นผ๋ผ์žฅ์ด๋‚˜ ๋ฒกํ„ฐ์žฅ์„ ์ ๋ถ„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ผ(work), ์ˆœํ™˜(circulation), ๊ฒฝ๋กœ ๊ธธ์ด ๋“ฑ์˜ ๋ฌผ๋ฆฌ๋Ÿ‰์„ ๊ณ„์‚ฐํ•œ๋‹ค.

2.1 ์Šค์นผ๋ผ์žฅ์˜ ์„ ์ ๋ถ„

์Šค์นผ๋ผ์žฅ $f$๋ฅผ ๊ณก์„  $C: \mathbf{r}(t) = (x(t), y(t), z(t))$, $a \leq t \leq b$ ๋ฅผ ๋”ฐ๋ผ ์ ๋ถ„:

$$ \int_C f \, ds = \int_a^b f(\mathbf{r}(t)) \left|\frac{d\mathbf{r}}{dt}\right| dt $$

์—ฌ๊ธฐ์„œ $ds = |\mathbf{r}'(t)| \, dt$๋Š” ํ˜ธ ๊ธธ์ด ์š”์†Œ(arc length element)์ด๋‹ค.

์‘์šฉ: ๋ฐ€๋„๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ณก์„  ์ฒ ์‚ฌ์˜ ์งˆ๋Ÿ‰, ๊ณก์„ ์˜ ๊ธธ์ด

import numpy as np
import sympy as sp

t = sp.Symbol('t')

# ์˜ˆ์ œ: ๋‚˜์„  ๊ฒฝ๋กœ r(t) = (cos t, sin t, t), 0 <= t <= 2pi ์œ„์—์„œ
# f = x^2 + y^2 + z^2 ์˜ ์„ ์ ๋ถ„
x_t = sp.cos(t)
y_t = sp.sin(t)
z_t = t

f = x_t**2 + y_t**2 + z_t**2  # cosยฒt + sinยฒt + tยฒ = 1 + tยฒ

# dr/dt ๊ณ„์‚ฐ
dx = sp.diff(x_t, t)
dy = sp.diff(y_t, t)
dz = sp.diff(z_t, t)
ds_dt = sp.sqrt(dx**2 + dy**2 + dz**2)
ds_dt_simplified = sp.simplify(ds_dt)
print(f"|dr/dt| = {ds_dt_simplified}")  # sqrt(2)

# ์„ ์ ๋ถ„ ๊ณ„์‚ฐ
integrand = f * ds_dt_simplified
result = sp.integrate(integrand, (t, 0, 2*sp.pi))
print(f"โˆซ_C f ds = {sp.simplify(result)}")
print(f"์ˆ˜์น˜๊ฐ’ = {float(result):.4f}")

2.2 ๋ฒกํ„ฐ์žฅ์˜ ์„ ์ ๋ถ„ (์ผ)

๋ฒกํ„ฐ์žฅ $\mathbf{F}$๋ฅผ ๊ณก์„  $C$๋ฅผ ๋”ฐ๋ผ ์ ๋ถ„ํ•˜๋ฉด ์ผ(work)์„ ์–ป๋Š”๋‹ค:

$$ W = \int_C \mathbf{F} \cdot d\mathbf{r} = \int_a^b \mathbf{F}(\mathbf{r}(t)) \cdot \mathbf{r}'(t) \, dt $$

์„ฑ๋ถ„์œผ๋กœ ์ „๊ฐœํ•˜๋ฉด:

$$ W = \int_C F_x \, dx + F_y \, dy + F_z \, dz $$

import numpy as np
import matplotlib.pyplot as plt
import sympy as sp

t = sp.Symbol('t')

# ๋ฒกํ„ฐ์žฅ F = (y, -x) ์—์„œ ์›ํ˜• ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅธ ์ผ(work) ๊ณ„์‚ฐ
# ๊ฒฝ๋กœ: r(t) = (cos t, sin t), 0 <= t <= 2pi

# ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”
x_t = sp.cos(t)
y_t = sp.sin(t)

# ๋ฒกํ„ฐ์žฅ ์„ฑ๋ถ„ (๊ฒฝ๋กœ ์œ„)
Fx = y_t    # F_x = y = sin t
Fy = -x_t   # F_y = -x = -cos t

# dr/dt
dx_dt = sp.diff(x_t, t)  # -sin t
dy_dt = sp.diff(y_t, t)  #  cos t

# F ยท dr/dt
integrand = Fx * dx_dt + Fy * dy_dt
integrand_simplified = sp.simplify(integrand)
print(f"Fยทdr/dt = {integrand_simplified}")  # -1

# ์ผ(work) ๊ณ„์‚ฐ
W = sp.integrate(integrand, (t, 0, 2*sp.pi))
print(f"W = โˆฎ Fยทdr = {W}")  # -2*pi (์Œ์ˆ˜: ์žฅ์ด ๊ฒฝ๋กœ์™€ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ)

# ์‹œ๊ฐํ™”: ๋ฒกํ„ฐ์žฅ๊ณผ ๊ฒฝ๋กœ
theta = np.linspace(0, 2*np.pi, 100)
X, Y = np.meshgrid(np.linspace(-1.5, 1.5, 12), np.linspace(-1.5, 1.5, 12))

fig, ax = plt.subplots(figsize=(8, 8))
ax.quiver(X, Y, Y, -X, color='steelblue', alpha=0.6, label='F = (y, -x)')
ax.plot(np.cos(theta), np.sin(theta), 'r-', linewidth=2, label='๊ฒฝ๋กœ C')
ax.annotate('', xy=(0.7, 0.7), xytext=(0.71, 0.69),
            arrowprops=dict(arrowstyle='->', color='red', lw=2))
ax.set_title(f'โˆฎ Fยทdr = {W} (์‹œ๊ณ„ ๋ฐฉํ–ฅ ์ˆœํ™˜)')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('line_integral_work.png', dpi=150, bbox_inches='tight')
plt.show()

2.3 ๋ณด์กด์žฅ๊ณผ ํผํ…์…œ ํ•จ์ˆ˜

๋ฒกํ„ฐ์žฅ $\mathbf{F}$๊ฐ€ ๋ณด์กด์žฅ(conservative field)์ด๋ฉด, ์„ ์ ๋ถ„์˜ ๊ฐ’์€ ๊ฒฝ๋กœ์— ๋ฌด๊ด€ํ•˜๊ณ  ์–‘ ๋์ ์—๋งŒ ์˜์กดํ•œ๋‹ค.

$$ \mathbf{F} = \nabla \phi \quad \Longleftrightarrow \quad \int_A^B \mathbf{F} \cdot d\mathbf{r} = \phi(B) - \phi(A) $$

๋ณด์กด์žฅ์˜ ๋™์น˜ ์กฐ๊ฑด (๋‹จ์ˆœ์—ฐ๊ฒฐ ์˜์—ญ):

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๋‹ค์Œ ์กฐ๊ฑด๋“ค์€ ๋ชจ๋‘ ๋™์น˜์ด๋‹ค (๋‹จ์ˆœ์—ฐ๊ฒฐ ์˜์—ญ์—์„œ):                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  (1) F = โˆ‡ฯ† ์ธ ํผํ…์…œ ํ•จ์ˆ˜ ฯ†๊ฐ€ ์กด์žฌ                            โ”‚
โ”‚  (2) โˆฎ_C Fยทdr = 0  (์ž„์˜์˜ ๋‹ซํžŒ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด)                    โ”‚
โ”‚  (3) โˆซ_A^B Fยทdr ์€ ๊ฒฝ๋กœ์— ๋ฌด๊ด€                                  โ”‚
โ”‚  (4) โˆ‡ร—F = 0                                                   โ”‚
โ”‚  (5) F_x dx + F_y dy + F_z dz ๊ฐ€ ์™„์ „๋ฏธ๋ถ„                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
import sympy as sp
from sympy.vector import CoordSys3D, curl

N = CoordSys3D('N')
x, y, z = N.x, N.y, N.z

# === ๋ณด์กด์žฅ ํŒ๋ณ„ ์˜ˆ์ œ ===
# F1 = (2xy + z)xฬ‚ + (xยฒ + 2yz)ลท + (x + yยฒ)แบ‘
F1 = (2*x*y + z)*N.i + (x**2 + 2*y*z)*N.j + (x + y**2)*N.k
curl_F1 = curl(F1, N)
print(f"F1 = {F1}")
print(f"โˆ‡ร—F1 = {curl_F1}")  # 0 โ†’ ๋ณด์กด์žฅ!

# ํผํ…์…œ ํ•จ์ˆ˜ ๊ตฌํ•˜๊ธฐ: โˆ‚ฯ†/โˆ‚x = 2xy + z
phi_x = sp.Symbol('phi')
phi = sp.integrate(2*x*y + z, x)  # xยฒy + xz + g(y,z)
print(f"\nโˆซ (2xy+z)dx = {phi} + g(y,z)")

# g(y,z) ๊ฒฐ์ •: โˆ‚ฯ†/โˆ‚y = xยฒ + โˆ‚g/โˆ‚y = xยฒ + 2yz โ†’ โˆ‚g/โˆ‚y = 2yz
g = sp.integrate(2*y*z, y)  # yยฒz + h(z)
print(f"โˆซ 2yz dy = {g} + h(z)")

# h(z) ๊ฒฐ์ •: โˆ‚ฯ†/โˆ‚z = x + yยฒ + h'(z) = x + yยฒ โ†’ h'(z) = 0 โ†’ h = C
phi_total = x**2 * y + x*z + y**2 * z
print(f"\nฯ†(x,y,z) = {phi_total}")

# ๊ฒ€์ฆ: โˆ‡ฯ† = F1?
from sympy.vector import gradient
grad_phi = gradient(phi_total, N)
print(f"โˆ‡ฯ† = {grad_phi}")
print(f"F1 = โˆ‡ฯ†? {sp.simplify(grad_phi - F1) == N.zero}")

# === ๋น„๋ณด์กด์žฅ ์˜ˆ์ œ ===
# F2 = (y)xฬ‚ + (x + z)ลท + (y + 1)แบ‘ โ€” curl โ‰  0 ํ™•์ธ
F2 = y*N.i + (x + z)*N.j + (y + 1)*N.k
curl_F2 = curl(F2, N)
print(f"\nF2 = {F2}")
print(f"โˆ‡ร—F2 = {curl_F2}")  # ๋น„๋ณด์กด์žฅ ์—ฌ๋ถ€ ํ™•์ธ

3. ๋ฉด์ ๋ถ„ (Surface Integrals)

3.1 ๋ฉด์  ์š”์†Œ์™€ ๋ฒ•์„  ๋ฒกํ„ฐ

๊ณก๋ฉด $S$๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜ $(u, v)$๋กœ ํ‘œํ˜„๋  ๋•Œ: $\mathbf{r}(u, v) = (x(u,v),\, y(u,v),\, z(u,v))$

๋ฉด์  ์š”์†Œ(surface element):

$$ d\mathbf{S} = \left(\frac{\partial \mathbf{r}}{\partial u} \times \frac{\partial \mathbf{r}}{\partial v}\right) du \, dv = \hat{n} \, dA $$

์—ฌ๊ธฐ์„œ $\hat{n}$์€ ๋‹จ์œ„ ๋ฒ•์„  ๋ฒกํ„ฐ, $dA = |d\mathbf{S}|$๋Š” ๋ฉด์  ์š”์†Œ์˜ ํฌ๊ธฐ์ด๋‹ค.

$z = g(x, y)$๋กœ ์ฃผ์–ด์ง„ ๊ณก๋ฉด์˜ ๊ฒฝ์šฐ:

$$ d\mathbf{S} = \left(-\frac{\partial g}{\partial x}\hat{x} - \frac{\partial g}{\partial y}\hat{y} + \hat{z}\right) dx \, dy $$

3.2 ์Šค์นผ๋ผ์žฅ์˜ ๋ฉด์ ๋ถ„

$$ \iint_S f \, dA = \iint_D f(\mathbf{r}(u,v)) \left|\frac{\partial \mathbf{r}}{\partial u} \times \frac{\partial \mathbf{r}}{\partial v}\right| du \, dv $$

์‘์šฉ: ๊ณก๋ฉด์˜ ๋„“์ด ($f = 1$), ๊ณก๋ฉด ์œ„ ๋ฌผ๋ฆฌ๋Ÿ‰์˜ ์ดํ•ฉ

import numpy as np
import sympy as sp
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

# ๊ตฌ๋ฉด r = 1 ์˜ ๋ฉด์  ๊ณ„์‚ฐ (๊ตฌ๋ฉด์ขŒํ‘œ)
theta, phi = sp.symbols('theta phi')

# ๊ตฌ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”: r(ฮธ, ฯ†) = (sinฮธ cosฯ†, sinฮธ sinฯ†, cosฮธ)
r_theta = sp.Matrix([sp.cos(phi)*sp.cos(theta),  # โˆ‚r/โˆ‚ฮธ
                      sp.sin(phi)*sp.cos(theta),
                      -sp.sin(theta)])
r_phi = sp.Matrix([-sp.sin(phi)*sp.sin(theta),    # โˆ‚r/โˆ‚ฯ†
                    sp.cos(phi)*sp.sin(theta),
                    0])

# ์™ธ์ : โˆ‚r/โˆ‚ฮธ ร— โˆ‚r/โˆ‚ฯ†
cross = r_theta.cross(r_phi)
dA = sp.simplify(cross.norm())
print(f"|โˆ‚r/โˆ‚ฮธ ร— โˆ‚r/โˆ‚ฯ†| = {dA}")  # sin(theta) (ฮธ โˆˆ [0, ฯ€]์—์„œ ์–‘์ˆ˜)

# ๋ฉด์  ์ ๋ถ„
area = sp.integrate(sp.sin(theta), (phi, 0, 2*sp.pi), (theta, 0, sp.pi))
print(f"๊ตฌ์˜ ๋ฉด์  = {area}")  # 4*pi

# 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)

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, alpha=0.6, cmap='viridis')

# ๋ฒ•์„  ๋ฒกํ„ฐ ํ‘œ์‹œ (์ผ๋ถ€ ์ ์—์„œ)
step = 8
for i in range(0, len(u), step):
    for j in range(0, len(v), step):
        px, py, pz = X[j, i], Y[j, i], Z[j, i]
        ax.quiver(px, py, pz, px*0.3, py*0.3, pz*0.3,
                  color='red', arrow_length_ratio=0.3)

ax.set_title('๋‹จ์œ„ ๊ตฌ๋ฉด๊ณผ ๋ฒ•์„  ๋ฒกํ„ฐ')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.tight_layout()
plt.savefig('sphere_normal_vectors.png', dpi=150, bbox_inches='tight')
plt.show()

3.3 ๋ฒกํ„ฐ์žฅ์˜ ๋ฉด์ ๋ถ„ (ํ”Œ๋Ÿญ์Šค)

๋ฒกํ„ฐ์žฅ $\mathbf{F}$๊ฐ€ ๊ณก๋ฉด $S$๋ฅผ ํ†ต๊ณผํ•˜๋Š” ํ”Œ๋Ÿญ์Šค(flux):

$$ \Phi = \iint_S \mathbf{F} \cdot d\mathbf{S} = \iint_S \mathbf{F} \cdot \hat{n} \, dA $$

๋ฌผ๋ฆฌ์  ์˜๋ฏธ: - ์ „๊ธฐ ํ”Œ๋Ÿญ์Šค: ์ „๊ธฐ์žฅ์ด ๊ณก๋ฉด์„ ๊ด€ํ†ตํ•˜๋Š” ์–‘ (๊ฐ€์šฐ์Šค ๋ฒ•์น™) - ์งˆ๋Ÿ‰ ํ”Œ๋Ÿญ์Šค: ์œ ์ฒด๊ฐ€ ๊ณก๋ฉด์„ ํ†ต๊ณผํ•˜๋Š” ์งˆ๋Ÿ‰ ์œ ๋Ÿ‰

import sympy as sp

x, y, z = sp.symbols('x y z')
u, v = sp.symbols('u v')

# ์˜ˆ์ œ: F = (x, y, z)๊ฐ€ ๊ตฌ๋ฉด r = R์„ ํ†ต๊ณผํ•˜๋Š” ํ”Œ๋Ÿญ์Šค
R = sp.Symbol('R', positive=True)
theta, phi = sp.symbols('theta phi')

# ๊ตฌ๋ฉด ์œ„์—์„œ rฬ‚ = (sinฮธ cosฯ†, sinฮธ sinฯ†, cosฮธ)
# ๊ตฌ๋ฉด ์œ„์—์„œ F = R*(sinฮธ cosฯ†, sinฮธ sinฯ†, cosฮธ) = R*rฬ‚
# Fยทnฬ‚ = Fยทrฬ‚ = R (๊ตฌ๋ฉด์—์„œ ๋ฒ•์„ ์€ rฬ‚ ๋ฐฉํ–ฅ)

# dA = Rยฒ sinฮธ dฮธ dฯ†
integrand = R * R**2 * sp.sin(theta)
flux = sp.integrate(integrand, (phi, 0, 2*sp.pi), (theta, 0, sp.pi))
print(f"F = (x, y, z) ๊ฐ€ ๊ตฌ๋ฉด r={R}์„ ๊ด€ํ†ตํ•˜๋Š” ํ”Œ๋Ÿญ์Šค:")
print(f"ฮฆ = โˆฌ FยทdS = {flux}")  # 4*pi*R^3

# ๋ฐœ์‚ฐ ์ •๋ฆฌ๋กœ ๊ฒ€์ฆ: โˆฌ FยทdS = โˆญ (โˆ‡ยทF) dV
div_F = 3  # โˆ‡ยท(x,y,z) = 1 + 1 + 1 = 3
volume = sp.Rational(4, 3) * sp.pi * R**3
flux_divergence = div_F * volume
print(f"\n๋ฐœ์‚ฐ ์ •๋ฆฌ ๊ฒ€์ฆ: โˆญ (โˆ‡ยทF)dV = 3 ร— (4/3)ฯ€Rยณ = {flux_divergence}")
print(f"์ผ์น˜ ์—ฌ๋ถ€: {sp.simplify(flux - flux_divergence) == 0}")  # True

4. ์ ๋ถ„ ์ •๋ฆฌ

๋ฒกํ„ฐ ํ•ด์„์˜ ์„ธ ๋Œ€์ ๋ถ„ ์ •๋ฆฌ๋Š” ๋ฏธ๋ถ„ ์—ฐ์‚ฐ(gradient, curl, divergence)๊ณผ ์ ๋ถ„(์„ ์ ๋ถ„, ๋ฉด์ ๋ถ„, ์ฒด์ ์ ๋ถ„)์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๊ฒฐ๊ณผ์ด๋‹ค.

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚          ๋ฒกํ„ฐ ํ•ด์„์˜ ์„ธ ๋Œ€์ ๋ถ„ ์ •๋ฆฌ โ€” ์ฐจ์›๋ณ„ ์ •๋ฆฌ                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                 โ”‚
โ”‚  ์ฐจ์›   ์ •๋ฆฌ          ๋ฏธ๋ถ„ ์—ฐ์‚ฐ     ์ ๋ถ„                         โ”‚
โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€            โ”‚
โ”‚  2D     ๊ทธ๋ฆฐ          โˆ‚/โˆ‚x, โˆ‚/โˆ‚y   ๋ฉด์ ๋ถ„ โ†” ์„ ์ ๋ถ„             โ”‚
โ”‚  3D-S   ์Šคํ† ํฌ์Šค      โˆ‡ร—            ๋ฉด์ ๋ถ„ โ†” ์„ ์ ๋ถ„             โ”‚
โ”‚  3D-V   ๊ฐ€์šฐ์Šค        โˆ‡ยท            ์ฒด์ ์ ๋ถ„ โ†” ๋ฉด์ ๋ถ„           โ”‚
โ”‚                                                                 โ”‚
โ”‚  ๊ณตํ†ต ํŒจํ„ด: โˆซโˆซ(๋ฏธ๋ถ„ ์—ฐ์‚ฐ) = โˆฎ(๊ฒฝ๊ณ„์—์„œ์˜ ์ ๋ถ„)                  โ”‚
โ”‚            "๋‚ด๋ถ€์˜ ๋ฏธ๋ถ„ = ๊ฒฝ๊ณ„์˜ ์ ๋ถ„"                           โ”‚
โ”‚                                                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

4.1 ๊ทธ๋ฆฐ ์ •๋ฆฌ (Green's Theorem)

2์ฐจ์› ํ‰๋ฉด์—์„œ, ๋‹จ์ˆœ ๋‹ซํžŒ ๊ณก์„  $C$์™€ ๊ทธ๊ฒƒ์ด ๋‘˜๋Ÿฌ์‹ธ๋Š” ์˜์—ญ $D$์— ๋Œ€ํ•ด:

$$ \oint_C (P \, dx + Q \, dy) = \iint_D \left(\frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y}\right) dA $$

๋ฌผ๋ฆฌ์  ์˜๋ฏธ: ๋ฒกํ„ฐ์žฅ์˜ ์ˆœํ™˜(circulation)์„ ์˜์—ญ ๋‚ด๋ถ€์˜ $z$-์„ฑ๋ถ„ ํšŒ์ „(curl)์˜ ํ•ฉ์œผ๋กœ ํ™˜์‚ฐ.

import numpy as np
import sympy as sp

x, y, t = sp.symbols('x y t')

# ์˜ˆ์ œ: P = -yยฒ, Q = xยฒ ์— ๋Œ€ํ•ด ๊ทธ๋ฆฐ ์ •๋ฆฌ ๊ฒ€์ฆ
# ์˜์—ญ: ๋‹จ์œ„ ์› xยฒ + yยฒ โ‰ค 1
P = -y**2
Q = x**2

# ์ขŒ๋ณ€: ์„ ์ ๋ถ„ (๋‹จ์œ„ ์› ๊ฒฝ๋กœ)
x_t = sp.cos(t)
y_t = sp.sin(t)
dx_dt = sp.diff(x_t, t)
dy_dt = sp.diff(y_t, t)

P_on_C = P.subs([(x, x_t), (y, y_t)])
Q_on_C = Q.subs([(x, x_t), (y, y_t)])

line_integral = sp.integrate(P_on_C * dx_dt + Q_on_C * dy_dt, (t, 0, 2*sp.pi))
print(f"์„ ์ ๋ถ„ โˆฎ(P dx + Q dy) = {line_integral}")

# ์šฐ๋ณ€: ๋ฉด์ ๋ถ„ (๊ทน์ขŒํ‘œ)
r, theta = sp.symbols('r theta')
dQ_dx = sp.diff(Q, x)  # 2x
dP_dy = sp.diff(P, y)  # -2y
integrand = dQ_dx - dP_dy  # 2x + 2y

# ๊ทน์ขŒํ‘œ ๋ณ€ํ™˜
integrand_polar = integrand.subs([(x, r*sp.cos(theta)), (y, r*sp.sin(theta))])
area_integral = sp.integrate(integrand_polar * r, (r, 0, 1), (theta, 0, 2*sp.pi))
print(f"๋ฉด์ ๋ถ„ โˆฌ(โˆ‚Q/โˆ‚x - โˆ‚P/โˆ‚y)dA = {area_integral}")

print(f"\n๊ทธ๋ฆฐ ์ •๋ฆฌ ์„ฑ๋ฆฝ: {sp.simplify(line_integral - area_integral) == 0}")

๊ทธ๋ฆฐ ์ •๋ฆฌ์˜ ํŠน์ˆ˜ ํ˜•ํƒœ โ€” ๋ฉด์  ๊ณต์‹:

$$ A = \frac{1}{2} \oint_C (x \, dy - y \, dx) $$

์ด ๊ณต์‹์€ ์ธก๋Ÿ‰, ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์Šค์—์„œ ๋‹ค๊ฐํ˜• ๋„“์ด๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

4.2 ์Šคํ† ํฌ์Šค ์ •๋ฆฌ (Stokes' Theorem)

3์ฐจ์›์—์„œ, ๊ณก๋ฉด $S$์™€ ๊ทธ ๊ฒฝ๊ณ„ ๊ณก์„  $C = \partial S$์— ๋Œ€ํ•ด:

$$ \oint_C \mathbf{F} \cdot d\mathbf{r} = \iint_S (\nabla \times \mathbf{F}) \cdot d\mathbf{S} $$

ํ•ด์„: ๋ฒกํ„ฐ์žฅ์˜ ๊ฒฝ๊ณ„ ์ˆœํ™˜(circulation) = ๊ณก๋ฉด ์œ„ curl์˜ ํ”Œ๋Ÿญ์Šค

import numpy as np
import sympy as sp

x, y, z, t = sp.symbols('x y z t')

# ์˜ˆ์ œ: F = (y, -x, zยฒ) ์— ๋Œ€ํ•ด ์Šคํ† ํฌ์Šค ์ •๋ฆฌ ๊ฒ€์ฆ
# ๊ณก๋ฉด S: z = 1 - xยฒ - yยฒ (z โ‰ฅ 0์ธ ํฌ๋ฌผ๋ฉด)
# ๊ฒฝ๊ณ„ C: z = 0์—์„œ xยฒ + yยฒ = 1 (๋‹จ์œ„ ์›)

# --- curl(F) ๊ณ„์‚ฐ ---
Fx, Fy, Fz = y, -x, z**2

curl_x = sp.diff(Fz, y) - sp.diff(Fy, z)  # 0 - 0 = 0
curl_y = sp.diff(Fx, z) - sp.diff(Fz, x)  # 0 - 0 = 0
curl_z = sp.diff(Fy, x) - sp.diff(Fx, y)  # -1 - 1 = -2
print(f"โˆ‡ร—F = ({curl_x}, {curl_y}, {curl_z})")

# --- ์ขŒ๋ณ€: ์„ ์ ๋ถ„ โˆฎ_C Fยทdr ---
# C: r(t) = (cos t, sin t, 0), 0 โ‰ค t โ‰ค 2ฯ€ (๋ฐ˜์‹œ๊ณ„)
x_t, y_t, z_t = sp.cos(t), sp.sin(t), sp.Integer(0)
dx_dt = sp.diff(x_t, t)
dy_dt = sp.diff(y_t, t)
dz_dt = sp.diff(z_t, t)

Fx_C = Fy_expr = y_t   # Fx = y = sin t
Fy_C = -x_t             # Fy = -x = -cos t
Fz_C = z_t**2           # Fz = zยฒ = 0

line_int = sp.integrate(
    Fx_C * dx_dt + Fy_C * dy_dt + Fz_C * dz_dt,
    (t, 0, 2*sp.pi)
)
print(f"\n์ขŒ๋ณ€ (์„ ์ ๋ถ„): โˆฎ Fยทdr = {line_int}")

# --- ์šฐ๋ณ€: ๋ฉด์ ๋ถ„ โˆฌ_S (โˆ‡ร—F)ยทdS ---
# ๊ณก๋ฉด z = 1 - xยฒ - yยฒ, dS = (-โˆ‚z/โˆ‚x, -โˆ‚z/โˆ‚y, 1) dx dy = (2x, 2y, 1) dx dy
# (โˆ‡ร—F)ยทdS = (0, 0, -2)ยท(2x, 2y, 1) dx dy = -2 dx dy

r_sym, theta_sym = sp.symbols('r_s theta_s')
surface_int = sp.integrate(
    -2 * r_sym,  # -2 ร— r (์•ผ์ฝ”๋น„์•ˆ)
    (r_sym, 0, 1),
    (theta_sym, 0, 2*sp.pi)
)
print(f"์šฐ๋ณ€ (๋ฉด์ ๋ถ„): โˆฌ (โˆ‡ร—F)ยทdS = {surface_int}")
print(f"์Šคํ† ํฌ์Šค ์ •๋ฆฌ ์„ฑ๋ฆฝ: {line_int == surface_int}")

4.3 ๊ฐ€์šฐ์Šค ๋ฐœ์‚ฐ ์ •๋ฆฌ (Divergence Theorem)

๋‹ซํžŒ ๊ณก๋ฉด $S$๊ฐ€ ๋‘˜๋Ÿฌ์‹ธ๋Š” ์ฒด์  $V$์— ๋Œ€ํ•ด:

$$ \oiint_S \mathbf{F} \cdot d\mathbf{S} = \iiint_V (\nabla \cdot \mathbf{F}) \, dV $$

ํ•ด์„: ๋ฒกํ„ฐ์žฅ์ด ๋‹ซํžŒ ๊ณก๋ฉด์„ ํ†ต๊ณผํ•˜๋Š” ์ด ํ”Œ๋Ÿญ์Šค = ์ฒด์  ๋‚ด๋ถ€์˜ ๋ฐœ์‚ฐ ์ดํ•ฉ

import numpy as np
import sympy as sp

x, y, z = sp.symbols('x y z')

# ์˜ˆ์ œ: F = (xยณ, yยณ, zยณ), ๋‹ซํžŒ ๊ณก๋ฉด = ๋‹จ์œ„ ๊ตฌ xยฒ+yยฒ+zยฒ = 1

# โˆ‡ยทF = 3xยฒ + 3yยฒ + 3zยฒ = 3rยฒ
div_F = sp.diff(x**3, x) + sp.diff(y**3, y) + sp.diff(z**3, z)
print(f"โˆ‡ยทF = {div_F}")  # 3xยฒ + 3yยฒ + 3zยฒ

# ์ฒด์  ์ ๋ถ„ (๊ตฌ๋ฉด์ขŒํ‘œ)
r, theta, phi = sp.symbols('r theta phi')
div_F_spherical = 3 * r**2  # 3(xยฒ + yยฒ + zยฒ) = 3rยฒ
jacobian = r**2 * sp.sin(theta)

volume_int = sp.integrate(
    div_F_spherical * jacobian,
    (r, 0, 1),
    (theta, 0, sp.pi),
    (phi, 0, 2*sp.pi)
)
print(f"โˆญ (โˆ‡ยทF) dV = {volume_int}")  # 12ฯ€/5

# ์ง์ ‘ ๋ฉด์ ๋ถ„์œผ๋กœ ๊ฒ€์ฆ
# ๊ตฌ๋ฉด ์œ„์—์„œ rฬ‚ = (x, y, z) (๋‹จ์œ„๊ตฌ์ด๋ฏ€๋กœ |r| = 1)
# Fยทrฬ‚ = xโด + yโด + zโด (๊ตฌ๋ฉด ์œ„์—์„œ xยฒ + yยฒ + zยฒ = 1)
# ๊ตฌ๋ฉด์ขŒํ‘œ: x = sinฮธ cosฯ†, y = sinฮธ sinฯ†, z = cosฮธ

F_dot_n = (sp.sin(theta)*sp.cos(phi))**4 + \
          (sp.sin(theta)*sp.sin(phi))**4 + \
          sp.cos(theta)**4

surface_int = sp.integrate(
    F_dot_n * sp.sin(theta),  # dA = sinฮธ dฮธ dฯ†
    (theta, 0, sp.pi),
    (phi, 0, 2*sp.pi)
)
surface_int_simplified = sp.simplify(surface_int)
print(f"โˆฌ FยทdS = {surface_int_simplified}")
print(f"์ผ์น˜: {sp.simplify(volume_int - surface_int_simplified) == 0}")

4.4 ์„ธ ์ •๋ฆฌ์˜ ๊ด€๊ณ„

์„ธ ์ ๋ถ„ ์ •๋ฆฌ๋Š” ๋ชจ๋‘ ์ผ๋ฐ˜ํ™”๋œ ์Šคํ† ํฌ์Šค ์ •๋ฆฌ(generalized Stokes' theorem)์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ด๋‹ค:

$$ \int_{\partial \Omega} \omega = \int_{\Omega} d\omega $$

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚          ์„ธ ์ •๋ฆฌ์˜ ํ†ต์ผ์  ๊ด€์                                     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                 โ”‚
โ”‚  ๋ฏธ์ ๋ถ„ํ•™์˜ ๊ธฐ๋ณธ์ •๋ฆฌ (1D):                                       โ”‚
โ”‚    โˆซ_a^b f'(x) dx = f(b) - f(a)                                โ”‚
โ”‚    "๋ฏธ๋ถ„์˜ ์ ๋ถ„ = ๊ฒฝ๊ณ„๊ฐ’์˜ ์ฐจ์ด"                                 โ”‚
โ”‚                                                                 โ”‚
โ”‚  ๊ทธ๋ฆฐ ์ •๋ฆฌ (2D):                                                โ”‚
โ”‚    โˆฌ_D (โˆ‚Q/โˆ‚x - โˆ‚P/โˆ‚y) dA = โˆฎ_{โˆ‚D} (P dx + Q dy)             โ”‚
โ”‚    "curl์˜ ๋ฉด์ ๋ถ„ = ๊ฒฝ๊ณ„์˜ ์„ ์ ๋ถ„"                               โ”‚
โ”‚                                                                 โ”‚
โ”‚  ์Šคํ† ํฌ์Šค ์ •๋ฆฌ (3D, ๊ณก๋ฉดโ†”๊ฒฝ๊ณ„์„ ):                                โ”‚
โ”‚    โˆฌ_S (โˆ‡ร—F)ยทdS = โˆฎ_{โˆ‚S} Fยทdr                                 โ”‚
โ”‚    "curl์˜ ๋ฉด์ ๋ถ„ = ๊ฒฝ๊ณ„์˜ ์„ ์ ๋ถ„"                               โ”‚
โ”‚                                                                 โ”‚
โ”‚  ๊ฐ€์šฐ์Šค ์ •๋ฆฌ (3D, ์ฒด์ โ†”๊ฒฝ๊ณ„๋ฉด):                                  โ”‚
โ”‚    โˆญ_V (โˆ‡ยทF) dV = โˆฌ_{โˆ‚V} FยทdS                                 โ”‚
โ”‚    "divergence์˜ ์ฒด์ ์ ๋ถ„ = ๊ฒฝ๊ณ„์˜ ๋ฉด์ ๋ถ„"                       โ”‚
โ”‚                                                                 โ”‚
โ”‚  ํŒจํ„ด: "๋‚ด๋ถ€์˜ ๋ฏธ๋ถ„ = ๊ฒฝ๊ณ„์—์„œ์˜ ๊ฐ’"                             โ”‚
โ”‚        ์ฐจ์› n์˜ ์ ๋ถ„ โ†” ์ฐจ์› (n-1)์˜ ๊ฒฝ๊ณ„ ์ ๋ถ„                   โ”‚
โ”‚                                                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

5. ๋ฌผ๋ฆฌํ•™ ์‘์šฉ

5.1 ์ „๊ธฐ์žฅ๊ณผ ๊ฐ€์šฐ์Šค ๋ฒ•์น™

๊ฐ€์šฐ์Šค ๋ฒ•์น™ (์ ๋ถ„ ํ˜•ํƒœ):

$$ \oiint_S \mathbf{E} \cdot d\mathbf{S} = \frac{Q_{\text{enc}}}{\epsilon_0} $$

๊ฐ€์šฐ์Šค ๋ฒ•์น™ (๋ฏธ๋ถ„ ํ˜•ํƒœ): ๊ฐ€์šฐ์Šค ๋ฐœ์‚ฐ ์ •๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด:

$$ \nabla \cdot \mathbf{E} = \frac{\rho}{\epsilon_0} $$

์ „ํ•˜๋ฐ€๋„ $\rho$๊ฐ€ ์žˆ๋Š” ๊ณณ์—์„œ ์ „๊ธฐ์žฅ์˜ ๋ฐœ์‚ฐ์ด 0์ด ์•„๋‹ˆ๋‹ค.

import numpy as np
import matplotlib.pyplot as plt

# ์ ์ „ํ•˜์˜ ์ „๊ธฐ์žฅ ์‹œ๊ฐํ™” (2D ๋‹จ๋ฉด)
# E = q/(4ฯ€ฮตโ‚€) ร— rฬ‚/rยฒ (์ฟจ๋กฑ ๋ฒ•์น™)

q = 1.0  # ์ „ํ•˜๋Ÿ‰ (์ž„์˜ ๋‹จ์œ„)
eps0 = 1.0  # ฮตโ‚€ (๋‹จ์œ„๊ณ„ ํŽธ์˜์ƒ)

X, Y = np.meshgrid(np.linspace(-3, 3, 20), np.linspace(-3, 3, 20))
R = np.sqrt(X**2 + Y**2)
R = np.where(R < 0.3, 0.3, R)  # ํŠน์ด์  ๋ฐฉ์ง€

# ์ „๊ธฐ์žฅ ์„ฑ๋ถ„
k = q / (4 * np.pi * eps0)
Ex = k * X / R**3
Ey = k * Y / R**3
E_mag = np.sqrt(Ex**2 + Ey**2)

fig, axes = plt.subplots(1, 2, figsize=(16, 7))

# ์–‘์ „ํ•˜ (+q)
ax = axes[0]
ax.streamplot(X, Y, Ex, Ey, color=np.log(E_mag + 1), cmap='Reds',
              density=2, linewidth=1.2)
ax.plot(0, 0, 'ro', markersize=15, label='+q')
circle1 = plt.Circle((0, 0), 1.0, fill=False, color='gray', linestyle='--', label='๊ฐ€์šฐ์Šค ๋ฉด r=1')
circle2 = plt.Circle((0, 0), 2.0, fill=False, color='gray', linestyle=':', label='๊ฐ€์šฐ์Šค ๋ฉด r=2')
ax.add_patch(circle1)
ax.add_patch(circle2)
ax.set_title('์–‘์ „ํ•˜์˜ ์ „๊ธฐ์žฅ (๋ฐœ์‚ฐ > 0)')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')
ax.legend(loc='upper left', fontsize=9)
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)

# ์Œ๊ทน์ž (dipole): +q at (1,0), -q at (-1,0)
ax = axes[1]
d = 1.0
R1 = np.sqrt((X - d)**2 + Y**2)
R2 = np.sqrt((X + d)**2 + Y**2)
R1 = np.where(R1 < 0.3, 0.3, R1)
R2 = np.where(R2 < 0.3, 0.3, R2)

Ex_dip = k * (X - d) / R1**3 - k * (X + d) / R2**3
Ey_dip = k * Y / R1**3 - k * Y / R2**3
E_dip_mag = np.sqrt(Ex_dip**2 + Ey_dip**2)

ax.streamplot(X, Y, Ex_dip, Ey_dip, color=np.log(E_dip_mag + 1),
              cmap='coolwarm', density=2, linewidth=1.2)
ax.plot(d, 0, 'ro', markersize=12, label='+q')
ax.plot(-d, 0, 'bo', markersize=12, label='-q')
ax.set_title('์ „๊ธฐ ์Œ๊ทน์ž (dipole)')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')
ax.legend(fontsize=9)
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)

plt.tight_layout()
plt.savefig('electric_field_gauss.png', dpi=150, bbox_inches='tight')
plt.show()

5.2 ์ž๊ธฐ์žฅ๊ณผ ์•™ํŽ˜๋ฅด ๋ฒ•์น™

์•™ํŽ˜๋ฅด ๋ฒ•์น™ (์ ๋ถ„ ํ˜•ํƒœ):

$$ \oint_C \mathbf{B} \cdot d\mathbf{r} = \mu_0 I_{\text{enc}} $$

์•™ํŽ˜๋ฅด ๋ฒ•์น™ (๋ฏธ๋ถ„ ํ˜•ํƒœ): ์Šคํ† ํฌ์Šค ์ •๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด:

$$ \nabla \times \mathbf{B} = \mu_0 \mathbf{J} $$

์—ฌ๊ธฐ์„œ $\mathbf{J}$๋Š” ์ „๋ฅ˜ ๋ฐ€๋„(current density)์ด๋‹ค.

๋ฌผ๋ฆฌ์  ์˜๋ฏธ: - ์ž๊ธฐ์žฅ์˜ curl์€ ์ „๋ฅ˜ ๋ฐ€๋„์— ๋น„๋ก€ - ์ž๊ธฐ์žฅ์„ ์€ ์ „๋ฅ˜ ์ฃผ์œ„๋ฅผ ๊ฐ์‹ธ๋Š” ๋‹ซํžŒ ๋ฃจํ”„ (์˜ค๋ฅธ์† ๋ฒ•์น™) - $\nabla \cdot \mathbf{B} = 0$ โ€” ์ž๊ธฐ ๋‹จ๊ทน์ž(magnetic monopole)๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ

import numpy as np
import matplotlib.pyplot as plt

# ๋ฌดํ•œ ์ง์„  ์ „๋ฅ˜์— ์˜ํ•œ ์ž๊ธฐ์žฅ
# B = ฮผโ‚€I/(2ฯ€r) ร— ฯ†ฬ‚ (์›ํ†ต์ขŒํ‘œ)

mu0 = 1.0  # ฮผโ‚€ (์ž„์˜ ๋‹จ์œ„)
I = 1.0    # ์ „๋ฅ˜ (z ๋ฐฉํ–ฅ)

X, Y = np.meshgrid(np.linspace(-3, 3, 20), np.linspace(-3, 3, 20))
R = np.sqrt(X**2 + Y**2)
R = np.where(R < 0.3, 0.3, R)

# B = ฮผโ‚€I/(2ฯ€r) ร— ฯ†ฬ‚, ์—ฌ๊ธฐ์„œ ฯ†ฬ‚ = (-y/r, x/r, 0)
B_coeff = mu0 * I / (2 * np.pi * R)
Bx = B_coeff * (-Y / R)
By = B_coeff * (X / R)

fig, ax = plt.subplots(figsize=(8, 8))
B_mag = np.sqrt(Bx**2 + By**2)
strm = ax.streamplot(X, Y, Bx, By, color=np.log(B_mag + 0.01),
                      cmap='plasma', density=2, linewidth=1.5)
plt.colorbar(strm.lines, ax=ax, label='log|B|')

# ์ „๋ฅ˜ ์œ„์น˜ (์›์ , z ๋ฐฉํ–ฅ)
ax.plot(0, 0, 'g^', markersize=15, label='I (z ๋ฐฉํ–ฅ, ์ง€๋ฉด์—์„œ ๋‚˜์˜ด)')

# ์•™ํŽ˜๋ฅด ๋ฃจํ”„ ํ‘œ์‹œ
for r in [1.0, 2.0]:
    circle = plt.Circle((0, 0), r, fill=False, color='lime',
                         linestyle='--', linewidth=2)
    ax.add_patch(circle)

ax.set_title('์ง์„  ์ „๋ฅ˜ ์ฃผ์œ„์˜ ์ž๊ธฐ์žฅ (์•™ํŽ˜๋ฅด ๋ฒ•์น™)')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')
ax.legend(loc='upper left')
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
plt.tight_layout()
plt.savefig('magnetic_field_ampere.png', dpi=150, bbox_inches='tight')
plt.show()

5.3 ์œ ์ฒด์—ญํ•™์˜ ์—ฐ์† ๋ฐฉ์ •์‹

์งˆ๋Ÿ‰ ๋ณด์กด์„ ํ‘œํ˜„ํ•˜๋Š” ์—ฐ์† ๋ฐฉ์ •์‹(continuity equation):

$$ \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{v}) = 0 $$

์—ฌ๊ธฐ์„œ $\rho$๋Š” ์œ ์ฒด ๋ฐ€๋„, $\mathbf{v}$๋Š” ์œ ์†(velocity field)์ด๋‹ค.

์œ ๋„ ๊ณผ์ •: 1. ๊ฐ€์šฐ์Šค ๋ฐœ์‚ฐ ์ •๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋‹ซํžŒ ๋ฉด์„ ํ†ตํ•œ ์งˆ๋Ÿ‰ ์œ ์ถœ์œจ = $\oiint_S \rho \mathbf{v} \cdot d\mathbf{S}$ 2. ์ฒด์  ๋‚ด ์งˆ๋Ÿ‰ ๋ณ€ํ™”์œจ = $-\frac{\partial}{\partial t}\iiint_V \rho \, dV$ 3. ๋ฐœ์‚ฐ ์ •๋ฆฌ ์ ์šฉ: $\iiint_V \left[\frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{v})\right] dV = 0$ 4. ์ž„์˜์˜ ์ฒด์ ์— ๋Œ€ํ•ด ์„ฑ๋ฆฝํ•˜๋ฏ€๋กœ ํ”ผ์ ๋ถ„ํ•จ์ˆ˜ = 0

๋น„์••์ถ• ์œ ์ฒด ($\rho$ = ์ƒ์ˆ˜)์˜ ๊ฒฝ์šฐ:

$$ \nabla \cdot \mathbf{v} = 0 $$

import numpy as np
import matplotlib.pyplot as plt

# 2D ๋น„์••์ถ• ์œ ์ฒด ํ๋ฆ„ ์˜ˆ์‹œ
# ํ๋ฆ„ ํ•จ์ˆ˜(stream function) ฯˆ๋ฅผ ์ด์šฉ: vx = โˆ‚ฯˆ/โˆ‚y, vy = -โˆ‚ฯˆ/โˆ‚x
# โ†’ ์ž๋™์œผ๋กœ โˆ‡ยทv = 0 ๋งŒ์กฑ

X, Y = np.meshgrid(np.linspace(-3, 3, 25), np.linspace(-3, 3, 25))

# ์˜ˆ์ œ 1: ๊ท ์ผ ํ๋ฆ„ + ์›ํ†ต ์ฃผ์œ„ ํ๋ฆ„ (ํผํ…์…œ ํ๋ฆ„)
# ฯˆ = U*y*(1 - aยฒ/rยฒ), U = ์ž์œ ๋ฅ˜ ์†๋„, a = ์›ํ†ต ๋ฐ˜์ง€๋ฆ„
U_inf = 1.0
a = 1.0
R_sq = X**2 + Y**2
R_sq = np.where(R_sq < a**2, a**2, R_sq)  # ์›ํ†ต ๋‚ด๋ถ€ ๋งˆ์Šคํ‚น

Vx = U_inf * (1 - a**2 * (X**2 - Y**2) / R_sq**2)
Vy = -U_inf * 2 * a**2 * X * Y / R_sq**2

# ์›ํ†ต ๋‚ด๋ถ€ ์†๋„ = 0
mask = (X**2 + Y**2) < a**2
Vx[mask] = 0
Vy[mask] = 0

fig, ax = plt.subplots(figsize=(10, 8))
speed = np.sqrt(Vx**2 + Vy**2)
strm = ax.streamplot(X, Y, Vx, Vy, color=speed, cmap='RdYlBu_r',
                      density=2, linewidth=1.2)
plt.colorbar(strm.lines, ax=ax, label='|v| (์†๋ ฅ)')

# ์›ํ†ต ํ‘œ์‹œ
circle = plt.Circle((0, 0), a, color='gray', alpha=0.5)
ax.add_patch(circle)

# ๋ฐœ์‚ฐ ๊ณ„์‚ฐ (์ˆ˜์น˜์ )
dVx_dx = np.gradient(Vx, X[0], axis=1)
dVy_dy = np.gradient(Vy, Y[:, 0], axis=0)
div_v = dVx_dx + dVy_dy
max_div = np.max(np.abs(div_v[~mask]))
ax.set_title(f'์›ํ†ต ์ฃผ์œ„ ๋น„์••์ถ• ์œ ์ฒด ํ๋ฆ„  (max|โˆ‡ยทv| โ‰ˆ {max_div:.2e})')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')
plt.tight_layout()
plt.savefig('fluid_flow_cylinder.png', dpi=150, bbox_inches='tight')
plt.show()

5.4 ๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹์˜ ์ ๋ถ„ ํ˜•ํƒœ์™€ ๋ฏธ๋ถ„ ํ˜•ํƒœ

๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹์€ ์ „์ž๊ธฐ ํ˜„์ƒ์„ ์™„์ „ํžˆ ๊ธฐ์ˆ ํ•˜๋Š” 4๊ฐœ์˜ ๋ฐฉ์ •์‹์ด๋‹ค. ๋ฒกํ„ฐ ํ•ด์„์˜ ์ ๋ถ„ ์ •๋ฆฌ(๊ฐ€์šฐ์Šค, ์Šคํ† ํฌ์Šค)๋ฅผ ํ†ตํ•ด ์ ๋ถ„ ํ˜•ํƒœ์™€ ๋ฏธ๋ถ„ ํ˜•ํƒœ๋ฅผ ์ƒํ˜ธ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    ๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹ (Maxwell's Equations)                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                          โ”‚
โ”‚  ๋ฒ•์น™             ๋ฏธ๋ถ„ ํ˜•ํƒœ              ์ ๋ถ„ ํ˜•ํƒœ              ๋ณ€ํ™˜ ์ •๋ฆฌ โ”‚
โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚
โ”‚                                                                          โ”‚
โ”‚  ๊ฐ€์šฐ์Šค (์ „๊ธฐ)    โˆ‡ยทE = ฯ/ฮตโ‚€            โˆฎ EยทdS = Q/ฮตโ‚€         ๊ฐ€์šฐ์Šค   โ”‚
โ”‚                                                                          โ”‚
โ”‚  ๊ฐ€์šฐ์Šค (์ž๊ธฐ)    โˆ‡ยทB = 0               โˆฎ BยทdS = 0             ๊ฐ€์šฐ์Šค   โ”‚
โ”‚                                                                          โ”‚
โ”‚  ํŒจ๋Ÿฌ๋ฐ์ด         โˆ‡ร—E = -โˆ‚B/โˆ‚t          โˆฎ Eยทdr = -dฮฆ_B/dt     ์Šคํ† ํฌ์Šค โ”‚
โ”‚                                                                          โ”‚
โ”‚  ์•™ํŽ˜๋ฅด-๋งฅ์Šค์›ฐ    โˆ‡ร—B = ฮผโ‚€J + ฮผโ‚€ฮตโ‚€โˆ‚E/โˆ‚t                      ์Šคํ† ํฌ์Šค โ”‚
โ”‚                                   โˆฎ Bยทdr = ฮผโ‚€I + ฮผโ‚€ฮตโ‚€ dฮฆ_E/dt          โ”‚
โ”‚                                                                          โ”‚
โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚
โ”‚                                                                          โ”‚
โ”‚  ๋ฌผ๋ฆฌ์  ์˜๋ฏธ:                                                             โ”‚
โ”‚  โ€ข ๊ฐ€์šฐ์Šค(์ „๊ธฐ): ์ „ํ•˜๊ฐ€ ์ „๊ธฐ์žฅ์˜ ์›์ฒœ                                      โ”‚
โ”‚  โ€ข ๊ฐ€์šฐ์Šค(์ž๊ธฐ): ์ž๊ธฐ ๋‹จ๊ทน์ž๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ                               โ”‚
โ”‚  โ€ข ํŒจ๋Ÿฌ๋ฐ์ด: ๋ณ€ํ•˜๋Š” ์ž๊ธฐ์žฅ์ด ์ „๊ธฐ์žฅ์„ ์œ ๋„                                 โ”‚
โ”‚  โ€ข ์•™ํŽ˜๋ฅด-๋งฅ์Šค์›ฐ: ์ „๋ฅ˜์™€ ๋ณ€ํ•˜๋Š” ์ „๊ธฐ์žฅ์ด ์ž๊ธฐ์žฅ์„ ์œ ๋„                     โ”‚
โ”‚                                                                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ ๋ถ„ ํ˜•ํƒœ์—์„œ ๋ฏธ๋ถ„ ํ˜•ํƒœ๋กœ์˜ ๋ณ€ํ™˜ (๊ฐ€์šฐ์Šค ๋ฒ•์น™ ์˜ˆ์‹œ):

$$ \oiint_S \mathbf{E} \cdot d\mathbf{S} = \frac{Q_{\text{enc}}}{\epsilon_0} = \frac{1}{\epsilon_0}\iiint_V \rho \, dV $$

๊ฐ€์šฐ์Šค ๋ฐœ์‚ฐ ์ •๋ฆฌ๋ฅผ ์ขŒ๋ณ€์— ์ ์šฉ:

$$ \iiint_V (\nabla \cdot \mathbf{E}) \, dV = \frac{1}{\epsilon_0}\iiint_V \rho \, dV $$

์ž„์˜์˜ ์ฒด์  $V$์— ๋Œ€ํ•ด ์„ฑ๋ฆฝํ•˜๋ฏ€๋กœ:

$$ \nabla \cdot \mathbf{E} = \frac{\rho}{\epsilon_0} $$

import numpy as np
import matplotlib.pyplot as plt

# ๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹์˜ ์‹œ๊ฐ์  ์ •๋ฆฌ: ์ „๊ธฐ์žฅ๊ณผ ์ž๊ธฐ์žฅ์˜ ๊ด€๊ณ„
fig, axes = plt.subplots(2, 2, figsize=(14, 12))

# === (1) ๊ฐ€์šฐ์Šค ๋ฒ•์น™ (์ „๊ธฐ): โˆ‡ยทE = ฯ/ฮตโ‚€ ===
ax = axes[0, 0]
X, Y = np.meshgrid(np.linspace(-2, 2, 15), np.linspace(-2, 2, 15))
R = np.sqrt(X**2 + Y**2)
R = np.where(R < 0.3, 0.3, R)
Ex = X / R**3
Ey = Y / R**3
ax.quiver(X, Y, Ex, Ey, color='red', alpha=0.6)
circle = plt.Circle((0, 0), 0.2, color='red', alpha=0.8)
ax.add_patch(circle)
ax.set_title('(1) ๊ฐ€์šฐ์Šค ๋ฒ•์น™: โˆ‡ยทE = ฯ/ฮตโ‚€\n์ „ํ•˜ โ†’ ๋ฐœ์‚ฐํ•˜๋Š” E')
ax.set_aspect('equal')
ax.set_xlim(-2.5, 2.5)
ax.set_ylim(-2.5, 2.5)
ax.grid(True, alpha=0.2)

# === (2) ๊ฐ€์šฐ์Šค ๋ฒ•์น™ (์ž๊ธฐ): โˆ‡ยทB = 0 ===
ax = axes[0, 1]
# ์ž๊ธฐ ์Œ๊ทน์ž (๋‹จ๊ทน์ž ์—†์Œ)
d = 0.5
R1 = np.sqrt((X - 0)**2 + (Y - d)**2)
R2 = np.sqrt((X - 0)**2 + (Y + d)**2)
R1 = np.where(R1 < 0.3, 0.3, R1)
R2 = np.where(R2 < 0.3, 0.3, R2)
Bx = X / R1**3 - X / R2**3
By = (Y - d) / R1**3 - (Y + d) / R2**3
speed = np.sqrt(Bx**2 + By**2)
ax.streamplot(X, Y, Bx, By, color=np.log(speed + 0.1), cmap='Blues',
              density=2, linewidth=1)
ax.set_title('(2) ๊ฐ€์šฐ์Šค ๋ฒ•์น™: โˆ‡ยทB = 0\n์ž๊ธฐ์žฅ์„ ์€ ๋‹ซํžŒ ๋ฃจํ”„')
ax.set_aspect('equal')
ax.set_xlim(-2.5, 2.5)
ax.set_ylim(-2.5, 2.5)
ax.grid(True, alpha=0.2)

# === (3) ํŒจ๋Ÿฌ๋ฐ์ด ๋ฒ•์น™: โˆ‡ร—E = -โˆ‚B/โˆ‚t ===
ax = axes[1, 0]
# ๋ณ€ํ•˜๋Š” ์ž๊ธฐ์žฅ โ†’ ์œ ๋„ ์ „๊ธฐ์žฅ (์›ํ˜•)
R_circ = np.sqrt(X**2 + Y**2)
R_circ = np.where(R_circ < 0.2, 0.2, R_circ)
Ex_ind = -Y / R_circ**2
Ey_ind = X / R_circ**2
ax.streamplot(X, Y, Ex_ind, Ey_ind, color='orange', density=1.5, linewidth=1.5)
ax.annotate('dB/dt\n(z ๋ฐฉํ–ฅ)', xy=(0, 0), fontsize=12, ha='center',
            bbox=dict(boxstyle='round', facecolor='yellow', alpha=0.8))
ax.set_title('(3) ํŒจ๋Ÿฌ๋ฐ์ด: โˆ‡ร—E = -โˆ‚B/โˆ‚t\n๋ณ€ํ•˜๋Š” B โ†’ ์œ ๋„ E')
ax.set_aspect('equal')
ax.set_xlim(-2.5, 2.5)
ax.set_ylim(-2.5, 2.5)
ax.grid(True, alpha=0.2)

# === (4) ์•™ํŽ˜๋ฅด-๋งฅ์Šค์›ฐ: โˆ‡ร—B = ฮผโ‚€J + ฮผโ‚€ฮตโ‚€ โˆ‚E/โˆ‚t ===
ax = axes[1, 1]
R_wire = np.sqrt(X**2 + Y**2)
R_wire = np.where(R_wire < 0.2, 0.2, R_wire)
Bx_wire = -Y / R_wire**2
By_wire = X / R_wire**2
ax.streamplot(X, Y, Bx_wire, By_wire, color='purple', density=1.5, linewidth=1.5)
ax.annotate('I or โˆ‚E/โˆ‚t\n(z ๋ฐฉํ–ฅ)', xy=(0, 0), fontsize=12, ha='center',
            bbox=dict(boxstyle='round', facecolor='lightyellow', alpha=0.8))
ax.set_title('(4) ์•™ํŽ˜๋ฅด-๋งฅ์Šค์›ฐ: โˆ‡ร—B = ฮผโ‚€J + ฮผโ‚€ฮตโ‚€โˆ‚E/โˆ‚t\n์ „๋ฅ˜/๋ณ€ํ•˜๋Š” E โ†’ B')
ax.set_aspect('equal')
ax.set_xlim(-2.5, 2.5)
ax.set_ylim(-2.5, 2.5)
ax.grid(True, alpha=0.2)

plt.suptitle('๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹์˜ 4๊ฐ€์ง€ ๋ฒ•์น™', fontsize=16, fontweight='bold', y=1.02)
plt.tight_layout()
plt.savefig('maxwell_equations.png', dpi=150, bbox_inches='tight')
plt.show()

์—ฐ์Šต ๋ฌธ์ œ

๋ฌธ์ œ 1: ๊ธฐ์šธ๊ธฐ์™€ ๋ฐฉํ–ฅ๋„ํ•จ์ˆ˜

์Šค์นผ๋ผ์žฅ $f(x, y, z) = x^2 y + y^2 z + z^2 x$ ์— ๋Œ€ํ•ด: 1. $\nabla f$๋ฅผ ๊ตฌํ•˜๋ผ. 2. ์  $(1, 1, 1)$์—์„œ $\hat{u} = \frac{1}{\sqrt{3}}(1, 1, 1)$ ๋ฐฉํ–ฅ์˜ ๋ฐฉํ–ฅ๋„ํ•จ์ˆ˜(directional derivative)๋ฅผ ๊ตฌํ•˜๋ผ. 3. ์  $(1, 1, 1)$์—์„œ $f$๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉํ–ฅ๊ณผ ๊ทธ ๋ณ€ํ™”์œจ์„ ๊ตฌํ•˜๋ผ.

๋ฌธ์ œ 2: ๋ฐœ์‚ฐ๊ณผ ํšŒ์ „ ํŒ๋ณ„

๋‹ค์Œ ๋ฒกํ„ฐ์žฅ์— ๋Œ€ํ•ด ๋ฐœ์‚ฐ๊ณผ ํšŒ์ „์„ ๊ณ„์‚ฐํ•˜๊ณ , ๋ณด์กด์žฅ์ธ์ง€ ํŒ๋ณ„ํ•˜๋ผ:

(a) $\mathbf{F} = (yz, xz, xy)$

(b) $\mathbf{G} = (x^2 - y, y^2 + x, z)$

๋ณด์กด์žฅ์ด๋ฉด ํผํ…์…œ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ.

๋ฌธ์ œ 3: ์„ ์ ๋ถ„

๋ฒกํ„ฐ์žฅ $\mathbf{F} = (2xy + z^2)\hat{x} + x^2\hat{y} + 2xz\hat{z}$ ์— ๋Œ€ํ•ด: 1. $\mathbf{F}$๊ฐ€ ๋ณด์กด์žฅ์ž„์„ ๋ณด์ด๊ณ  ํผํ…์…œ ํ•จ์ˆ˜ $\phi$๋ฅผ ๊ตฌํ•˜๋ผ. 2. $(0, 0, 0)$์—์„œ $(1, 2, 3)$๊นŒ์ง€์˜ ์„ ์ ๋ถ„์„ (a) ํผํ…์…œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ, (b) ์ง์„  ๊ฒฝ๋กœ $\mathbf{r}(t) = (t, 2t, 3t)$๋ฅผ ๋”ฐ๋ผ ์ง์ ‘ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์Œ์„ ํ™•์ธํ•˜๋ผ.

๋ฌธ์ œ 4: ๊ฐ€์šฐ์Šค ๋ฐœ์‚ฐ ์ •๋ฆฌ ๊ฒ€์ฆ

$\mathbf{F} = (x^2, y^2, z^2)$์— ๋Œ€ํ•ด, ๋‹จ์œ„ ์ •์œก๋ฉด์ฒด $[0,1]^3$์—์„œ ๊ฐ€์šฐ์Šค ๋ฐœ์‚ฐ ์ •๋ฆฌ๋ฅผ ๊ฒ€์ฆํ•˜๋ผ. 1. $\nabla \cdot \mathbf{F}$๋ฅผ ๊ตฌํ•˜๊ณ  ์ฒด์ ์ ๋ถ„์„ ๊ณ„์‚ฐํ•˜๋ผ. 2. 6๊ฐœ ๋ฉด์—์„œ์˜ ๋ฉด์ ๋ถ„์„ ๊ฐ๊ฐ ๊ณ„์‚ฐํ•˜์—ฌ ํ•ฉ์‚ฐํ•˜๋ผ. 3. ๋‘ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•จ์„ ํ™•์ธํ•˜๋ผ.

๋ฌธ์ œ 5: ์Šคํ† ํฌ์Šค ์ •๋ฆฌ์™€ ๋ฌผ๋ฆฌ ์‘์šฉ

์ „๋ฅ˜ ๋ฐ€๋„ $\mathbf{J} = J_0 \hat{z}$ (๊ท ์ผ)๊ฐ€ ๋ฐ˜์ง€๋ฆ„ $a$์ธ ์›ํ†ต ๋„์„ ์— ํ๋ฅผ ๋•Œ: 1. ์•™ํŽ˜๋ฅด ๋ฒ•์น™(์ ๋ถ„ ํ˜•ํƒœ)์„ ์ด์šฉํ•˜์—ฌ $r < a$์™€ $r > a$ ์˜์—ญ์—์„œ์˜ ์ž๊ธฐ์žฅ $\mathbf{B}$๋ฅผ ๊ตฌํ•˜๋ผ. 2. $r < a$์—์„œ $\nabla \times \mathbf{B} = \mu_0 \mathbf{J}$๊ฐ€ ์„ฑ๋ฆฝํ•จ์„ ์ง์ ‘ ํ™•์ธํ•˜๋ผ (์›ํ†ต์ขŒํ‘œ curl ๊ณต์‹ ์‚ฌ์šฉ).

๋ฌธ์ œ 6: ๋งฅ์Šค์›ฐ ๋ฐฉ์ •์‹ ๋ณ€ํ™˜

ํŒจ๋Ÿฌ๋ฐ์ด ๋ฒ•์น™์˜ ์ ๋ถ„ ํ˜•ํƒœ:

$$ \oint_C \mathbf{E} \cdot d\mathbf{r} = -\frac{d}{dt}\iint_S \mathbf{B} \cdot d\mathbf{S} $$

์—์„œ ์Šคํ† ํฌ์Šค ์ •๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฏธ๋ถ„ ํ˜•ํƒœ $\nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t}$๋ฅผ ์œ ๋„ํ•˜๋ผ. ์œ ๋„ ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„œ์ˆ ํ•˜๋ผ.


์ฐธ๊ณ  ์ž๋ฃŒ

๊ต์žฌ

  1. Boas, M. L. (2005). Mathematical Methods in the Physical Sciences, 3rd ed., Chapter 6. Wiley.
  2. Griffiths, D. J. (2017). Introduction to Electrodynamics, 4th ed. Cambridge University Press.
  3. ๋ฒกํ„ฐ ํ•ด์„์˜ ์ „์ž๊ธฐํ•™ ์‘์šฉ์— ๋Œ€ํ•œ ์ตœ๊ณ ์˜ ์ฐธ๊ณ ์„œ
  4. Arfken, G. B., Weber, H. J., & Harris, F. E. (2012). Mathematical Methods for Physicists, 7th ed., Chapters 1-3. Academic Press.
  5. Schey, H. M. (2005). Div, Grad, Curl, and All That, 4th ed. W.W. Norton.
  6. ๋ฒกํ„ฐ ํ•ด์„์˜ ์ง๊ด€์  ์ž…๋ฌธ์„œ

์˜จ๋ผ์ธ ์ž๋ฃŒ

  1. 3Blue1Brown โ€” Divergence and Curl: ๋ฐœ์‚ฐ๊ณผ ํšŒ์ „์˜ ์‹œ๊ฐ์  ์ดํ•ด
  2. MIT OCW 18.02 โ€” Multivariable Calculus: ๋ฒกํ„ฐ ํ•ด์„ ๊ฐ•์˜
  3. Paul's Online Math Notes โ€” Calculus III: ์—ฐ์Šต ๋ฌธ์ œ ํ’๋ถ€

Python ๋„๊ตฌ

  • sympy.vector: ๊ธฐํ˜ธ์  ๋ฒกํ„ฐ ๋ฏธ์ ๋ถ„ (gradient, divergence, curl)
  • matplotlib.pyplot.quiver: 2D ๋ฒกํ„ฐ์žฅ ํ™”์‚ดํ‘œ ์‹œ๊ฐํ™”
  • matplotlib.pyplot.streamplot: ์œ ์„ (streamline) ์‹œ๊ฐํ™”
  • mpl_toolkits.mplot3d: 3D ๊ณก๋ฉด ๋ฐ ๋ฒกํ„ฐ ์‹œ๊ฐํ™”

๋‹ค์Œ ๋ ˆ์Šจ

to navigate between lessons