02. λ³΅μ†Œμˆ˜ (Complex Numbers)

02. λ³΅μ†Œμˆ˜ (Complex Numbers)

Boas Chapter 2 β€” λ¬Όλ¦¬κ³Όν•™μ—μ„œ λ³΅μ†Œμˆ˜λŠ” λ‹¨μˆœν•œ μˆ˜ν•™μ  도ꡬλ₯Ό λ„˜μ–΄, νŒŒλ™ ν˜„μƒ, ꡐλ₯˜ 회둜, μ–‘μžμ—­ν•™ λ“± 핡심 λ¬Όλ¦¬ν•™μ˜ μ–Έμ–΄μž…λ‹ˆλ‹€.


ν•™μŠ΅ λͺ©ν‘œ

이 λ ˆμŠ¨μ„ μ™„λ£Œν•˜λ©΄ λ‹€μŒμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • λ³΅μ†Œμˆ˜μ˜ λŒ€μˆ˜μ , κΈ°ν•˜ν•™μ  ν‘œν˜„μ„ 자유자재둜 λ³€ν™˜ν•  수 μžˆλ‹€ (μ§κ΅μ’Œν‘œ, κ·Ήμ’Œν‘œ, μ§€μˆ˜ ν˜•μ‹)
  • 였일러 곡식과 λ“œλͺ¨μ•„λΈŒλ₯΄ 정리λ₯Ό μ΄μš©ν•˜μ—¬ μ‚Όκ°ν•¨μˆ˜ 항등식을 μœ λ„ν•˜κ³  κ±°λ“­μ œκ³±κ·Όμ„ ꡬ할 수 μžˆλ‹€
  • λ³΅μ†Œ ν•¨μˆ˜(μ§€μˆ˜, 삼각, 쌍곑, 둜그)의 μ„±μ§ˆμ„ μ΄ν•΄ν•˜κ³  계산할 수 μžˆλ‹€
  • 물리학 μ‘μš©: ꡐλ₯˜ 회둜의 μž„ν”Όλ˜μŠ€ 계산, νŒŒλ™μ˜ λ³΅μ†Œ ν‘œν˜„, μ–‘μžμ—­ν•™μ  νŒŒλ™ν•¨μˆ˜λ₯Ό λ‹€λ£° 수 μžˆλ‹€
  • λ³΅μ†Œμˆ˜λ₯Ό μ΄μš©ν•œ 2D λ³€ν™˜μ˜ κΈ°ν•˜ν•™μ  의미λ₯Ό νŒŒμ•…ν•˜κ³ , 등각사상(conformal mapping)의 κΈ°λ³Έ 원리λ₯Ό μ΄ν•΄ν•œλ‹€

1. λ³΅μ†Œμˆ˜μ˜ κΈ°λ³Έ

1.1 ν—ˆμˆ˜ λ‹¨μœ„μ™€ λ³΅μ†Œμˆ˜ μ •μ˜

μ‹€μˆ˜(real number)λ§ŒμœΌλ‘œλŠ” $x^2 + 1 = 0$κ³Ό 같은 방정식을 ν’€ 수 μ—†μŠ΅λ‹ˆλ‹€. ν—ˆμˆ˜ λ‹¨μœ„(imaginary unit) $i$λ₯Ό λ‹€μŒκ³Ό 같이 μ •μ˜ν•©λ‹ˆλ‹€:

$$ i^2 = -1, \quad i = \sqrt{-1} $$

λ³΅μ†Œμˆ˜(complex number) $z$λŠ” 두 μ‹€μˆ˜ $a$, $b$둜 κ΅¬μ„±λ©λ‹ˆλ‹€:

$$ z = a + bi $$

  • $a = \text{Re}(z)$: μ‹€μˆ˜λΆ€(real part)
  • $b = \text{Im}(z)$: ν—ˆμˆ˜λΆ€(imaginary part)

μ°Έκ³ : κ³΅ν•™μ—μ„œλŠ” μ „λ₯˜ $i$μ™€μ˜ ν˜Όλ™μ„ ν”Όν•˜κΈ° μœ„ν•΄ ν—ˆμˆ˜ λ‹¨μœ„λ₯Ό $j$둜 ν‘œκΈ°ν•©λ‹ˆλ‹€. Python도 jλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ³΅μ†Œ 케레(complex conjugate):

$$ \bar{z} = z^* = a - bi $$

μ ˆλŒ“κ°’(modulus, absolute value):

$$ |z| = \sqrt{a^2 + b^2} = \sqrt{z \cdot \bar{z}} $$

import numpy as np

# λ³΅μ†Œμˆ˜ κΈ°λ³Έ μ—°μ‚°
z1 = 3 + 4j
z2 = 1 - 2j

print(f"z1 = {z1}")
print(f"μ‹€μˆ˜λΆ€: {z1.real}, ν—ˆμˆ˜λΆ€: {z1.imag}")
print(f"케레: {z1.conjugate()}")
print(f"|z1| = {abs(z1):.4f}")  # sqrt(9 + 16) = 5.0

# μœ μš©ν•œ μ„±μ§ˆ
print(f"\nz1 * conj(z1) = {z1 * z1.conjugate()}")  # |z1|^2 = 25
print(f"|z1|^2 = {abs(z1)**2}")

1.2 λ³΅μ†Œ 평면 (μ•„λ₯΄κ°• λ‹€μ΄μ–΄κ·Έλž¨)

λ³΅μ†Œμˆ˜ $z = a + bi$λŠ” 2차원 평면 μœ„μ˜ 점 $(a, b)$둜 ν‘œν˜„λ©λ‹ˆλ‹€. 이 평면을 λ³΅μ†Œ 평면(complex plane) λ˜λŠ” μ•„λ₯΄κ°• λ‹€μ΄μ–΄κ·Έλž¨(Argand diagram)이라 ν•©λ‹ˆλ‹€.

  • κ°€λ‘œμΆ•: μ‹€μˆ˜μΆ• (real axis)
  • μ„Έλ‘œμΆ•: ν—ˆμˆ˜μΆ• (imaginary axis)
  • 점 $z$κΉŒμ§€μ˜ 거리: $|z|$ (μ›μ μœΌλ‘œλΆ€ν„°μ˜ 거리)
  • μ‹€μˆ˜μΆ•κ³Όμ˜ 각도: $\theta = \arg(z)$ (편각, argument)
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 1, figsize=(8, 8))

# λ³΅μ†Œμˆ˜ λ°°μ—΄
points = {
    r'$3+4i$': 3+4j,
    r'$-2+3i$': -2+3j,
    r'$-1-2i$': -1-2j,
    r'$4-i$': 4-1j,
    r'$2i$': 2j,
    r'$-3$': -3+0j,
}

colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6', '#1abc9c']

for (label, z), color in zip(points.items(), colors):
    # 점 ν‘œμ‹œ
    ax.plot(z.real, z.imag, 'o', color=color, markersize=10, zorder=5)
    ax.annotate(label, (z.real, z.imag), textcoords="offset points",
                xytext=(10, 10), fontsize=12, color=color)
    # μ›μ μ—μ„œ ν™”μ‚΄ν‘œ
    ax.annotate('', xy=(z.real, z.imag), xytext=(0, 0),
                arrowprops=dict(arrowstyle='->', color=color, lw=1.5))

# μΆ• μ„€μ •
ax.axhline(y=0, color='k', linewidth=0.8)
ax.axvline(x=0, color='k', linewidth=0.8)
ax.set_xlim(-5, 6)
ax.set_ylim(-4, 6)
ax.set_xlabel('Re(z)', fontsize=13)
ax.set_ylabel('Im(z)', fontsize=13)
ax.set_title('λ³΅μ†Œ 평면 (Argand Diagram)', fontsize=15)
ax.set_aspect('equal')
ax.grid(True, alpha=0.3)

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

1.3 λ³΅μ†Œμˆ˜μ˜ 사칙연산

두 λ³΅μ†Œμˆ˜ $z_1 = a + bi$, $z_2 = c + di$에 λŒ€ν•΄:

λ§μ…ˆ/λΊ„μ…ˆ: μ‹€μˆ˜λΆ€μ™€ ν—ˆμˆ˜λΆ€λ₯Ό 각각 μ—°μ‚°

$$ z_1 \pm z_2 = (a \pm c) + (b \pm d)i $$

κ³±μ…ˆ: $i^2 = -1$을 μ΄μš©ν•˜μ—¬ μ „κ°œ

$$ z_1 \cdot z_2 = (ac - bd) + (ad + bc)i $$

λ‚˜λˆ—μ…ˆ: λΆ„λͺ¨λ₯Ό 케레둜 μœ λ¦¬ν™”(rationalization)

$$ \frac{z_1}{z_2} = \frac{z_1 \cdot \bar{z_2}}{|z_2|^2} = \frac{(ac + bd) + (bc - ad)i}{c^2 + d^2} $$

import numpy as np

z1 = 3 + 4j
z2 = 1 - 2j

print("=== λ³΅μ†Œμˆ˜ 사칙연산 ===")
print(f"z1 + z2 = {z1 + z2}")          # (4+2j)
print(f"z1 - z2 = {z1 - z2}")          # (2+6j)
print(f"z1 * z2 = {z1 * z2}")          # (11-2j) = (3+8)+(4-6)i
print(f"z1 / z2 = {z1 / z2}")          # (-1+2j)

# λ‚˜λˆ—μ…ˆ 검증: μˆ˜λ™ 계산
numerator = z1 * z2.conjugate()
denominator = abs(z2)**2
print(f"\nλ‚˜λˆ—μ…ˆ μˆ˜λ™ 검증:")
print(f"  z1 * conj(z2) = {numerator}")
print(f"  |z2|^2 = {denominator}")
print(f"  κ²°κ³Ό = {numerator / denominator}")

2. κ·Ήμ’Œν‘œ ν‘œν˜„κ³Ό μ§€μˆ˜ ν‘œν˜„

2.1 κ·Ήμ’Œν‘œ ν˜•μ‹ (r, $\theta$)

λ³΅μ†Œμˆ˜ $z = a + bi$λ₯Ό κ·Ήμ’Œν‘œλ‘œ ν‘œν˜„ν•˜λ©΄:

$$ z = r(\cos\theta + i\sin\theta) $$

μ—¬κΈ°μ„œ: - $r = |z| = \sqrt{a^2 + b^2}$ : μ ˆλŒ“κ°’ (modulus) - $\theta = \arg(z) = \arctan\left(\frac{b}{a}\right)$ : 편각 (argument)

μ—­λ³€ν™˜:

$$ a = r\cos\theta, \quad b = r\sin\theta $$

주의: $\arctan(b/a)$λ§ŒμœΌλ‘œλŠ” 사뢄면을 ꡬ별할 수 μ—†μœΌλ―€λ‘œ, ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” np.arctan2(b, a) λ˜λŠ” np.angle(z)λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

2.2 였일러 곡식 (Euler's Formula)

μˆ˜ν•™μ—μ„œ κ°€μž₯ μ•„λ¦„λ‹€μš΄ 곡식 쀑 ν•˜λ‚˜μΈ 였일러 곡식:

$$ e^{i\theta} = \cos\theta + i\sin\theta $$

이λ₯Ό μ΄μš©ν•˜λ©΄ λ³΅μ†Œμˆ˜λ₯Ό μ§€μˆ˜ ν˜•μ‹(exponential form)으둜 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

$$ z = re^{i\theta} $$

였일러 등식 ($\theta = \pi$ λŒ€μž…):

$$ e^{i\pi} + 1 = 0 $$

이 등식은 μˆ˜ν•™μ˜ λ‹€μ„― κ°€μ§€ κΈ°λ³Έ μƒμˆ˜($e$, $i$, $\pi$, $1$, $0$)λ₯Ό ν•˜λ‚˜μ˜ μ‹μœΌλ‘œ μ—°κ²°ν•©λ‹ˆλ‹€.

증λͺ… (ν…ŒμΌλŸ¬ κΈ‰μˆ˜ 이용):

$$ e^{i\theta} = \sum_{n=0}^{\infty} \frac{(i\theta)^n}{n!} = \underbrace{\left(1 - \frac{\theta^2}{2!} + \frac{\theta^4}{4!} - \cdots\right)}_{\cos\theta} + i\underbrace{\left(\theta - \frac{\theta^3}{3!} + \frac{\theta^5}{5!} - \cdots\right)}_{\sin\theta} $$

import numpy as np
import matplotlib.pyplot as plt

# 였일러 곡식 μ‹œκ°ν™”: e^{i*theta}λŠ” λ‹¨μœ„μ› μœ„μ˜ 점
theta = np.linspace(0, 2*np.pi, 300)
z = np.exp(1j * theta)

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

# (a) λ‹¨μœ„μ› μœ„μ˜ e^{i*theta}
ax = axes[0]
ax.plot(z.real, z.imag, 'b-', linewidth=2)

# νŠΉλ³„ν•œ 각도 ν‘œμ‹œ
special_angles = [0, np.pi/6, np.pi/4, np.pi/3, np.pi/2, np.pi,
                  3*np.pi/2]
labels = [r'$1$', r'$e^{i\pi/6}$', r'$e^{i\pi/4}$', r'$e^{i\pi/3}$',
          r'$e^{i\pi/2}=i$', r'$e^{i\pi}=-1$', r'$e^{i3\pi/2}=-i$']

for angle, label in zip(special_angles, labels):
    w = np.exp(1j * angle)
    ax.plot(w.real, w.imag, 'ro', markersize=8, zorder=5)
    offset = (15 * np.cos(angle), 15 * np.sin(angle))
    ax.annotate(label, (w.real, w.imag), textcoords="offset points",
                xytext=offset, fontsize=10, ha='center')

ax.axhline(y=0, color='k', linewidth=0.5)
ax.axvline(x=0, color='k', linewidth=0.5)
ax.set_xlim(-1.6, 1.6)
ax.set_ylim(-1.6, 1.6)
ax.set_aspect('equal')
ax.set_title(r'$e^{i\theta}$: λ‹¨μœ„μ› μœ„μ˜ λ³΅μ†Œμˆ˜', fontsize=14)
ax.set_xlabel('Re', fontsize=12)
ax.set_ylabel('Im', fontsize=12)
ax.grid(True, alpha=0.3)

# (b) 였일러 κ³΅μ‹μ˜ ν…ŒμΌλŸ¬ κΈ‰μˆ˜ 수렴
ax2 = axes[1]
theta_val = np.pi / 3  # 60도

n_terms_list = range(1, 12)
partial_real = []
partial_imag = []
cumsum = 0 + 0j

for n in range(20):
    cumsum += (1j * theta_val)**n / np.math.factorial(n)
    if n + 1 <= 11:
        partial_real.append(cumsum.real)
        partial_imag.append(cumsum.imag)

exact = np.exp(1j * theta_val)
ax2.axhline(y=exact.real, color='blue', linestyle='--', alpha=0.5,
            label=f'cos(pi/3) = {exact.real:.4f}')
ax2.axhline(y=exact.imag, color='red', linestyle='--', alpha=0.5,
            label=f'sin(pi/3) = {exact.imag:.4f}')
ax2.plot(range(1, 12), partial_real, 'bo-', label='λΆ€λΆ„ν•© μ‹€μˆ˜λΆ€')
ax2.plot(range(1, 12), partial_imag, 'rs-', label='λΆ€λΆ„ν•© ν—ˆμˆ˜λΆ€')
ax2.set_xlabel('ν•­μ˜ 수', fontsize=12)
ax2.set_ylabel('κ°’', fontsize=12)
ax2.set_title(r'$e^{i\pi/3}$ ν…ŒμΌλŸ¬ κΈ‰μˆ˜μ˜ 수렴', fontsize=14)
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3)

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

2.3 μ§€μˆ˜ ν˜•μ‹κ³Ό κ³±μ…ˆ/λ‚˜λˆ—μ…ˆ

μ§€μˆ˜ ν˜•μ‹μ€ κ³±μ…ˆκ³Ό λ‚˜λˆ—μ…ˆμ„ κ·Ήλ„λ‘œ κ°„λ‹¨ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

$z_1 = r_1 e^{i\theta_1}$, $z_2 = r_2 e^{i\theta_2}$ 일 λ•Œ:

κ³±μ…ˆ: μ ˆλŒ“κ°’μ€ κ³±ν•˜κ³ , νŽΈκ°μ€ λ”ν•œλ‹€

$$ z_1 \cdot z_2 = r_1 r_2 \, e^{i(\theta_1 + \theta_2)} $$

λ‚˜λˆ—μ…ˆ: μ ˆλŒ“κ°’μ€ λ‚˜λˆ„κ³ , νŽΈκ°μ€ λΊ€λ‹€

$$ \frac{z_1}{z_2} = \frac{r_1}{r_2} \, e^{i(\theta_1 - \theta_2)} $$

κ±°λ“­μ œκ³±: μ ˆλŒ“κ°’μ€ κ±°λ“­μ œκ³±, νŽΈκ°μ€ 배수

$$ z^n = r^n e^{in\theta} $$

import numpy as np

# κ·Ήμ’Œν‘œ/μ§€μˆ˜ ν˜•μ‹ λ³€ν™˜
z = 1 + 1j * np.sqrt(3)  # = 2 * e^{i*pi/3}

r = abs(z)
theta = np.angle(z)  # λΌλ””μ•ˆ

print(f"z = {z}")
print(f"|z| = {r:.4f}")
print(f"arg(z) = {theta:.4f} rad = {np.degrees(theta):.1f}Β°")
print(f"μ§€μˆ˜ ν˜•μ‹: {r:.4f} * exp(i * {theta:.4f})")

# κ³±μ…ˆ μ˜ˆμ‹œ
z1 = 2 * np.exp(1j * np.pi/4)   # r=2, theta=45Β°
z2 = 3 * np.exp(1j * np.pi/6)   # r=3, theta=30Β°
z_product = z1 * z2

print(f"\n=== κ³±μ…ˆ ===")
print(f"z1 = 2*exp(i*pi/4), z2 = 3*exp(i*pi/6)")
print(f"z1*z2 = {z_product:.4f}")
print(f"|z1*z2| = {abs(z_product):.4f} (= 2*3 = 6)")
print(f"arg(z1*z2) = {np.degrees(np.angle(z_product)):.1f}Β° (= 45+30 = 75Β°)")

3. λ“œλͺ¨μ•„λΈŒλ₯΄ 정리와 κ±°λ“­μ œκ³±κ·Ό

3.1 λ“œλͺ¨μ•„λΈŒλ₯΄ 정리 (De Moivre's Theorem)

였일러 κ³΅μ‹μ—μ„œ 직접 μœ λ„λ˜λŠ” μ€‘μš”ν•œ μ •λ¦¬μž…λ‹ˆλ‹€:

$$ (\cos\theta + i\sin\theta)^n = \cos(n\theta) + i\sin(n\theta) $$

이 μ •λ¦¬λŠ” λ‹€μŒκ³Ό 같은 κ°•λ ₯ν•œ μ‘μš©μ„ κ°€μ§‘λ‹ˆλ‹€: - 닀쀑각 곡식(multiple angle formulas) μœ λ„ - μ‚Όκ°ν•¨μˆ˜ 항등식 증λͺ… - κ±°λ“­μ œκ³±κ·Ό 계산

μ˜ˆμ‹œ: $\cos(3\theta)$λ₯Ό $\cos\theta$둜 ν‘œν˜„

λ“œλͺ¨μ•„λΈŒλ₯΄ μ •λ¦¬μ—μ„œ $n = 3$:

$$ \cos(3\theta) + i\sin(3\theta) = (\cos\theta + i\sin\theta)^3 $$

μš°λ³€μ„ μ΄ν•­μ •λ¦¬λ‘œ μ „κ°œν•˜κ³  μ‹€μˆ˜λΆ€λ₯Ό λΉ„κ΅ν•˜λ©΄:

$$ \cos(3\theta) = \cos^3\theta - 3\cos\theta\sin^2\theta = 4\cos^3\theta - 3\cos\theta $$

import sympy as sp

# SymPy둜 λ“œλͺ¨μ•„λΈŒλ₯΄ 정리λ₯Ό μ΄μš©ν•œ 닀쀑각 곡식 μœ λ„
theta = sp.Symbol('theta', real=True)

# (cos(theta) + i*sin(theta))^n 을 μ „κ°œν•˜μ—¬ cos(n*theta), sin(n*theta) μœ λ„
for n in [2, 3, 4]:
    expr = sp.expand((sp.cos(theta) + sp.I * sp.sin(theta))**n)
    real_part = sp.re(expr)
    imag_part = sp.im(expr)

    # sin^2 = 1 - cos^2 으둜 μΉ˜ν™˜ν•˜μ—¬ cos만으둜 ν‘œν˜„
    real_simplified = sp.simplify(
        real_part.rewrite(sp.cos).expand(trig=True)
    )
    imag_simplified = sp.simplify(
        imag_part.rewrite(sp.sin).expand(trig=True)
    )

    print(f"=== n = {n} ===")
    print(f"  cos({n}*theta) = {sp.trigsimp(real_part)}")
    print(f"  sin({n}*theta) = {sp.trigsimp(imag_part)}")
    print()

# 수치 검증
import numpy as np
t = np.pi / 7
for n in [2, 3, 4]:
    lhs = np.cos(n * t)
    rhs = (np.exp(1j * t)**n).real
    print(f"cos({n}*pi/7): 직접 계산={lhs:.10f}, λ“œλͺ¨μ•„λΈŒλ₯΄={rhs:.10f}, 차이={abs(lhs-rhs):.2e}")

3.2 n제곱근

λ³΅μ†Œμˆ˜ $w$의 $n$제곱근, 즉 $z^n = w$λ₯Ό λ§Œμ‘±ν•˜λŠ” $z$λ₯Ό κ΅¬ν•©λ‹ˆλ‹€.

$w = Re^{i\Phi}$둜 λ†“μœΌλ©΄ ($R = |w|$, $\Phi = \arg(w)$):

$$ z_k = R^{1/n} \exp\left(i\frac{\Phi + 2\pi k}{n}\right), \quad k = 0, 1, 2, \ldots, n-1 $$

핡심: $n$개의 μ„œλ‘œ λ‹€λ₯Έ 근이 μ‘΄μž¬ν•˜λ©°, 이듀은 λ°˜μ§€λ¦„ $R^{1/n}$인 원 μœ„μ— κ· λ“± λ°°μΉ˜λ©λ‹ˆλ‹€.

import numpy as np
import matplotlib.pyplot as plt

def nth_roots(w, n):
    """λ³΅μ†Œμˆ˜ w의 nμ œκ³±κ·Όμ„ λͺ¨λ‘ κ΅¬ν•œλ‹€."""
    R = abs(w)
    Phi = np.angle(w)
    roots = []
    for k in range(n):
        z_k = R**(1/n) * np.exp(1j * (Phi + 2*np.pi*k) / n)
        roots.append(z_k)
    return np.array(roots)

# μ˜ˆμ‹œ: (1+i)의 μ„Έμ œκ³±κ·Ό
w = 1 + 1j
n = 3
roots = nth_roots(w, n)

print(f"w = {w} 의 {n}제곱근:")
for k, root in enumerate(roots):
    print(f"  z_{k} = {root:.6f}")
    print(f"       = {abs(root):.4f} * exp(i * {np.degrees(np.angle(root)):.2f}Β°)")
    # 검증
    print(f"       검증: z_{k}^{n} = {root**n:.6f}")
    print()

# μ‹œκ°ν™”
fig, axes = plt.subplots(1, 3, figsize=(18, 6))
test_cases = [
    (8+0j, 3, r'$\sqrt[3]{8}$'),
    (1+1j, 4, r'$\sqrt[4]{1+i}$'),
    (-1+0j, 5, r'$\sqrt[5]{-1}$'),
]

for ax, (w, n, title) in zip(axes, test_cases):
    roots = nth_roots(w, n)
    R = abs(w)**(1/n)

    # 원 그리기
    circle_theta = np.linspace(0, 2*np.pi, 200)
    ax.plot(R*np.cos(circle_theta), R*np.sin(circle_theta),
            'b--', alpha=0.3, linewidth=1)

    # κ·Ό ν‘œμ‹œ
    for k, z_k in enumerate(roots):
        ax.plot(z_k.real, z_k.imag, 'ro', markersize=10, zorder=5)
        ax.annotate(f'$z_{k}$', (z_k.real, z_k.imag),
                    textcoords="offset points", xytext=(8, 8), fontsize=11)

    # μ •λ‹€κ°ν˜• μ—°κ²°μ„ 
    polygon = np.append(roots, roots[0])
    ax.plot(polygon.real, polygon.imag, 'r-', alpha=0.4, linewidth=1)

    ax.axhline(y=0, color='k', linewidth=0.5)
    ax.axvline(x=0, color='k', linewidth=0.5)
    ax.set_aspect('equal')
    ax.set_title(title, fontsize=14)
    ax.grid(True, alpha=0.3)

plt.suptitle('λ³΅μ†Œμˆ˜μ˜ n제곱근: 원 μœ„μ— κ· λ“± 배치', fontsize=16, y=1.02)
plt.tight_layout()
plt.savefig('nth_roots.png', dpi=150, bbox_inches='tight')
plt.show()

3.3 1의 n제곱근 (Roots of Unity)

$w = 1$인 νŠΉμˆ˜ν•œ 경우: $z^n = 1$의 근을 1의 n제곱근(n-th roots of unity)이라 ν•©λ‹ˆλ‹€.

$$ \omega_k = e^{2\pi i k / n}, \quad k = 0, 1, \ldots, n-1 $$

μ›μ‹œ n제곱근(primitive root): $\omega = e^{2\pi i / n}$으둜 λ†“μœΌλ©΄

$$ \omega_k = \omega^k, \quad k = 0, 1, \ldots, n-1 $$

핡심 μ„±μ§ˆ:

  1. $\omega^n = 1$
  2. $1 + \omega + \omega^2 + \cdots + \omega^{n-1} = 0$ (근의 합은 0)
  3. $\omega_j \cdot \omega_k = \omega_{(j+k) \bmod n}$ (ꡰ ꡬ쑰)

μ‘μš©: 1의 nμ œκ³±κ·Όμ€ 이산 푸리에 λ³€ν™˜(DFT)의 핡심이며, μ‹ ν˜Έ μ²˜λ¦¬μ—μ„œ ν•„μˆ˜μ μž…λ‹ˆλ‹€.

import numpy as np

# 1의 n제곱근의 μ„±μ§ˆ 검증
for n in [3, 4, 6, 8]:
    omega = np.exp(2j * np.pi / n)
    roots = np.array([omega**k for k in range(n)])

    print(f"=== 1의 {n}제곱근 ===")
    print(f"  μ›μ‹œκ·Ό omega = exp(2*pi*i/{n}) = {omega:.6f}")
    print(f"  omega^{n} = {omega**n:.6f} (= 1 검증)")
    print(f"  근의 ν•© = {roots.sum():.6f} (= 0 검증)")
    print(f"  근의 곱 = {np.prod(roots):.6f}")
    print()

4. λ³΅μ†Œ ν•¨μˆ˜

4.1 λ³΅μ†Œ μ§€μˆ˜ν•¨μˆ˜

λ³΅μ†Œμˆ˜ $z = x + iy$에 λŒ€ν•΄ λ³΅μ†Œ μ§€μˆ˜ν•¨μˆ˜λŠ”:

$$ e^z = e^{x+iy} = e^x(\cos y + i\sin y) $$

μ£Όμš” μ„±μ§ˆ: - $|e^z| = e^x = e^{\text{Re}(z)}$ (μ ˆλŒ“κ°’μ€ μ‹€μˆ˜λΆ€μ—λ§Œ 의쑴) - $\arg(e^z) = y = \text{Im}(z)$ - $e^z$λŠ” μ£ΌκΈ° $2\pi i$: $e^{z + 2\pi i} = e^z$

import numpy as np
import matplotlib.pyplot as plt

# λ³΅μ†Œ μ§€μˆ˜ν•¨μˆ˜ μ‹œκ°ν™”: e^z의 상 (image)
fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# (a) 직선 x = const 의 상: 원점 쀑심 원
ax = axes[0]
y = np.linspace(0, 2*np.pi, 200)
for x_val in [-1, -0.5, 0, 0.5, 1]:
    w = np.exp(x_val + 1j*y)
    ax.plot(w.real, w.imag, label=f'x={x_val}')

ax.set_aspect('equal')
ax.set_title(r'$e^{x+iy}$: μˆ˜μ§μ„  $x=\mathrm{const}$ 의 상', fontsize=13)
ax.set_xlabel('Re', fontsize=12)
ax.set_ylabel('Im', fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

# (b) 직선 y = const 의 상: μ›μ μ—μ„œ λ»—μ–΄λ‚˜κ°€λŠ” λ°˜μ§μ„ 
ax2 = axes[1]
x = np.linspace(-2, 2, 200)
for y_val in np.linspace(0, 2*np.pi, 9)[:-1]:
    w = np.exp(x + 1j*y_val)
    ax2.plot(w.real, w.imag, label=f'y={y_val:.2f}')

ax2.set_xlim(-8, 8)
ax2.set_ylim(-8, 8)
ax2.set_aspect('equal')
ax2.set_title(r'$e^{x+iy}$: μˆ˜ν‰μ„  $y=\mathrm{const}$ 의 상', fontsize=13)
ax2.set_xlabel('Re', fontsize=12)
ax2.set_ylabel('Im', fontsize=12)
ax2.legend(fontsize=9, ncol=2)
ax2.grid(True, alpha=0.3)

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

4.2 λ³΅μ†Œ μ‚Όκ°ν•¨μˆ˜μ™€ μŒκ³‘ν•¨μˆ˜

였일러 곡식을 μ΄μš©ν•˜λ©΄ μ‚Όκ°ν•¨μˆ˜μ™€ μŒκ³‘ν•¨μˆ˜λ₯Ό μ§€μˆ˜ν•¨μˆ˜λ‘œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ³΅μ†Œ μ‚Όκ°ν•¨μˆ˜:

$$ \cos z = \frac{e^{iz} + e^{-iz}}{2}, \quad \sin z = \frac{e^{iz} - e^{-iz}}{2i} $$

λ³΅μ†Œ μŒκ³‘ν•¨μˆ˜ (hyperbolic functions):

$$ \cosh z = \frac{e^z + e^{-z}}{2}, \quad \sinh z = \frac{e^z - e^{-z}}{2} $$

μ‚Όκ°ν•¨μˆ˜μ™€ μŒκ³‘ν•¨μˆ˜μ˜ 관계:

$$ \cos(iz) = \cosh z, \quad \sin(iz) = i\sinh z $$

$$ \cosh(iz) = \cos z, \quad \sinh(iz) = i\sin z $$

μ€‘μš”: μ‹€μˆ˜μ—μ„œλŠ” $|\sin x| \leq 1$, $|\cos x| \leq 1$μ΄μ§€λ§Œ, λ³΅μ†Œμˆ˜μ—μ„œλŠ” 이 μ œν•œμ΄ μ‚¬λΌμ§‘λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ $\cos(i) = \cosh(1) \approx 1.543$μž…λ‹ˆλ‹€.

import numpy as np

# λ³΅μ†Œ μ‚Όκ°ν•¨μˆ˜/μŒκ³‘ν•¨μˆ˜μ˜ 관계 검증
z_values = [1+1j, 2-0.5j, 0+2j, np.pi/4+0j]

print("=== λ³΅μ†Œ μ‚Όκ°ν•¨μˆ˜ ===")
for z in z_values:
    # cos(z)λ₯Ό μ§€μˆ˜ μ •μ˜λ‘œ 직접 계산
    cos_euler = (np.exp(1j*z) + np.exp(-1j*z)) / 2
    cos_numpy = np.cos(z)
    print(f"z = {z:.4f}")
    print(f"  cos(z) [였일러] = {cos_euler:.6f}")
    print(f"  cos(z) [NumPy]  = {cos_numpy:.6f}")
    print(f"  차이 = {abs(cos_euler - cos_numpy):.2e}")
    print()

# cos(iz) = cosh(z) 검증
z = 1.5 + 0.7j
print("=== 관계식 검증 ===")
print(f"cos(iz) = {np.cos(1j*z):.8f}")
print(f"cosh(z) = {np.cosh(z):.8f}")
print(f"sin(iz) = {np.sin(1j*z):.8f}")
print(f"i*sinh(z) = {1j*np.sinh(z):.8f}")

4.3 λ³΅μ†Œ λ‘œκ·Έν•¨μˆ˜

λ³΅μ†Œμˆ˜ $z = re^{i\theta}$의 둜그:

$$ \ln z = \ln r + i\theta = \ln|z| + i\arg(z) $$

λ‹€κ°€ν•¨μˆ˜ (multi-valued function): 편각 $\theta$λŠ” $2\pi$의 μ •μˆ˜λ°°λ§ŒνΌ μžμœ λ„κ°€ μžˆμœΌλ―€λ‘œ:

$$ \text{Ln}(z) = \ln|z| + i(\theta + 2n\pi), \quad n \in \mathbb{Z} $$

  • μ£Όκ°’(principal value): $-\pi < \theta \leq \pi$둜 μ œν•œν•œ 값을 $\text{Log}(z)$둜 ν‘œκΈ°ν•©λ‹ˆλ‹€.
  • λΆ„μ§€(branch): λ‹€κ°€ν•¨μˆ˜λ₯Ό λ‹¨κ°€ν•¨μˆ˜λ‘œ λ§Œλ“€κΈ° μœ„ν•΄ 편각의 λ²”μœ„λ₯Ό μ œν•œν•˜λŠ” 것
  • 뢄지점(branch point): $z = 0$ (λ‘œκ·Έκ°€ μ •μ˜λ˜μ§€ μ•ŠλŠ” 점)
  • λΆ„μ§€ μ ˆλ‹¨(branch cut): ν†΅μƒμ μœΌλ‘œ 음의 μ‹€μˆ˜μΆ•
import numpy as np

# λ³΅μ†Œ 둜그의 λ‹€κ°€μ„±
z = -1 + 0j

print("=== ln(-1)의 λ‹€κ°€μ„± ===")
print(f"μ£Όκ°’: Log(-1) = {np.log(-1+0j)}")  # i*pi

for n in range(-2, 3):
    val = np.log(abs(z)) + 1j * (np.pi + 2*np.pi*n)
    # 검증: e^val = z?
    check = np.exp(val)
    print(f"  n={n:+d}: ln(-1) = {val:.6f}, exp(ln(-1)) = {check:.6f}")

# λ³΅μ†Œ 둜그의 μ„±μ§ˆ 검증
z1 = 2 + 3j
z2 = 1 - 1j
print(f"\n=== 둜그 μ„±μ§ˆ (μ£Όκ°’ κΈ°μ€€) ===")
print(f"Log(z1*z2) = {np.log(z1*z2):.6f}")
print(f"Log(z1) + Log(z2) = {np.log(z1) + np.log(z2):.6f}")
print("주의: μ£Όκ°’μ—μ„œλŠ” Log(z1*z2) != Log(z1) + Log(z2)일 수 있음")
print(f"차이 = {abs(np.log(z1*z2) - np.log(z1) - np.log(z2)):.6e}")

5. λ¬Όλ¦¬ν•™μ—μ„œμ˜ μ‘μš©

5.1 ꡐλ₯˜ 회둜 (μž„ν”Όλ˜μŠ€)

ꡐλ₯˜(AC) 회둜 ν•΄μ„μ—μ„œ λ³΅μ†Œμˆ˜λŠ” ν•„μˆ˜μ μž…λ‹ˆλ‹€. μ „μ••/μ „λ₯˜λ₯Ό λ³΅μ†Œ μ§€μˆ˜λ‘œ ν‘œν˜„ν•˜λ©΄ 미뢄방정식이 λŒ€μˆ˜ λ°©μ •μ‹μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

λ³΅μ†Œ μž„ν”Όλ˜μŠ€(impedance) $Z$:

μ†Œμž μž„ν”Όλ˜μŠ€ μœ„μƒ
μ €ν•­ $R$ $Z_R = R$ $0$
인덕터 $L$ $Z_L = i\omega L$ $+90Β°$
μ»€νŒ¨μ‹œν„° $C$ $Z_C = \frac{1}{i\omega C} = -\frac{i}{\omega C}$ $-90Β°$

RLC 직렬 회둜의 총 μž„ν”Όλ˜μŠ€:

$$ Z = R + i\left(\omega L - \frac{1}{\omega C}\right) $$

  • $|Z|$: μž„ν”Όλ˜μŠ€μ˜ 크기 (μ „μ•• 진폭 / μ „λ₯˜ 진폭)
  • $\arg(Z)$: μ „μ••κ³Ό μ „λ₯˜ μ‚¬μ΄μ˜ μœ„μƒμ°¨
  • 곡진 (resonance): $\omega L = 1/(\omega C)$일 λ•Œ, $Z = R$ (순수 μ €ν•­)

$$ \omega_0 = \frac{1}{\sqrt{LC}} \quad \text{(곡진 주파수)} $$

import numpy as np
import matplotlib.pyplot as plt

# RLC 직렬 회둜의 μž„ν”Όλ˜μŠ€ 뢄석
R = 100      # Ohm
L = 0.1      # Henry
C = 1e-6     # Farad

omega_0 = 1 / np.sqrt(L * C)  # 곡진 각주파수
f_0 = omega_0 / (2 * np.pi)   # 곡진 주파수

print(f"곡진 주파수: f_0 = {f_0:.1f} Hz")
print(f"곡진 각주파수: omega_0 = {omega_0:.1f} rad/s")

# 주파수 λ²”μœ„
omega = np.linspace(100, 20000, 2000)
Z = R + 1j * (omega * L - 1/(omega * C))

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

# (a) |Z| vs omega
ax = axes[0, 0]
ax.semilogy(omega, np.abs(Z), 'b-', linewidth=2)
ax.axvline(x=omega_0, color='r', linestyle='--', alpha=0.7,
           label=f'$\\omega_0$ = {omega_0:.0f} rad/s')
ax.set_xlabel(r'$\omega$ (rad/s)', fontsize=12)
ax.set_ylabel(r'$|Z|$ ($\Omega$)', fontsize=12)
ax.set_title('μž„ν”Όλ˜μŠ€ 크기', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)

# (b) arg(Z) vs omega
ax = axes[0, 1]
ax.plot(omega, np.degrees(np.angle(Z)), 'g-', linewidth=2)
ax.axvline(x=omega_0, color='r', linestyle='--', alpha=0.7)
ax.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax.set_xlabel(r'$\omega$ (rad/s)', fontsize=12)
ax.set_ylabel(r'$\arg(Z)$ (degrees)', fontsize=12)
ax.set_title('μœ„μƒκ°', fontsize=13)
ax.grid(True, alpha=0.3)

# (c) μ „λ₯˜ 응닡 (V_0 = 1V)
V0 = 1.0  # μ „μ•• 진폭
I = V0 / Z

ax = axes[1, 0]
ax.plot(omega, np.abs(I) * 1000, 'm-', linewidth=2)
ax.axvline(x=omega_0, color='r', linestyle='--', alpha=0.7,
           label=f'곡진: I_max = {1000*V0/R:.1f} mA')
ax.set_xlabel(r'$\omega$ (rad/s)', fontsize=12)
ax.set_ylabel(r'$|I|$ (mA)', fontsize=12)
ax.set_title('μ „λ₯˜ 응닡 (곡진 곑선)', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)

# (d) μž„ν”Όλ˜μŠ€μ˜ λ³΅μ†Œ 평면 ꢀ적
ax = axes[1, 1]
ax.plot(Z.real, Z.imag, 'b-', linewidth=2)
ax.plot(R, 0, 'ro', markersize=10, zorder=5, label=f'곡진점 ($\\omega_0$)')
ax.set_xlabel(r'Re$(Z)$ ($\Omega$)', fontsize=12)
ax.set_ylabel(r'Im$(Z)$ ($\Omega$)', fontsize=12)
ax.set_title('μž„ν”Όλ˜μŠ€ ꢀ적 (Nyquist plot)', fontsize=13)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')

plt.suptitle(f'RLC 직렬 회둜 (R={R}Ω, L={L*1000}mH, C={C*1e6}μF)',
             fontsize=15, y=1.01)
plt.tight_layout()
plt.savefig('rlc_circuit.png', dpi=150, bbox_inches='tight')
plt.show()

5.2 νŒŒλ™μ˜ λ³΅μ†Œ ν‘œν˜„

일차원 μ§„ν–‰νŒŒ(traveling wave)λŠ” λ³΅μ†Œμˆ˜λ‘œ κ°„κ²°ν•˜κ²Œ ν‘œν˜„λ©λ‹ˆλ‹€:

$$ \psi(x, t) = A e^{i(kx - \omega t)} $$

μ—¬κΈ°μ„œ: - $A$: λ³΅μ†Œ 진폭 (크기와 초기 μœ„μƒμ„ 포함) - $k$: 파수 (wave number), $k = 2\pi/\lambda$ - $\omega$: κ°μ§„λ™μˆ˜, $\omega = 2\pi f$

μ‹€μ œ λ¬Όλ¦¬λŸ‰μ€ μ‹€μˆ˜λΆ€μž…λ‹ˆλ‹€:

$$ \text{Re}[\psi] = |A| \cos(kx - \omega t + \phi) $$

μ—¬κΈ°μ„œ $\phi = \arg(A)$.

λ³΅μ†Œ ν‘œν˜„μ˜ μž₯점: 1. 미뢄이 간단: $\frac{\partial \psi}{\partial t} = -i\omega\psi$ 2. 쀑첩(superposition)κ³Ό κ°„μ„­(interference) 계산이 용이 3. μœ„μƒ 관계가 λͺ…ν™•

import numpy as np
import matplotlib.pyplot as plt

# 두 νŒŒλ™μ˜ 쀑첩 (κ°„μ„­)
x = np.linspace(0, 10, 500)
t = 0

# νŒŒλ™ 1: A1 = 1, k1 = 2, omega1 = 3
A1, k1, omega1 = 1.0, 2.0, 3.0
psi1 = A1 * np.exp(1j * (k1*x - omega1*t))

# νŒŒλ™ 2: A2 = 0.8, k2 = 2.2, omega2 = 3.1 (μ•½κ°„ λ‹€λ₯Έ 파수/μ§„λ™μˆ˜)
A2, k2, omega2 = 0.8, 2.2, 3.1
psi2 = A2 * np.exp(1j * (k2*x - omega2*t))

# 쀑첩
psi_total = psi1 + psi2

fig, axes = plt.subplots(3, 1, figsize=(12, 8), sharex=True)

axes[0].plot(x, psi1.real, 'b-', linewidth=1.5, label='νŒŒλ™ 1')
axes[0].plot(x, np.abs(psi1)*np.ones_like(x), 'b--', alpha=0.3)
axes[0].set_ylabel('Re(Οˆβ‚)', fontsize=12)
axes[0].legend(fontsize=11)
axes[0].grid(True, alpha=0.3)

axes[1].plot(x, psi2.real, 'r-', linewidth=1.5, label='νŒŒλ™ 2')
axes[1].plot(x, np.abs(psi2)*np.ones_like(x), 'r--', alpha=0.3)
axes[1].set_ylabel('Re(Οˆβ‚‚)', fontsize=12)
axes[1].legend(fontsize=11)
axes[1].grid(True, alpha=0.3)

axes[2].plot(x, psi_total.real, 'purple', linewidth=1.5, label='쀑첩 (Οˆβ‚ + Οˆβ‚‚)')
axes[2].plot(x, np.abs(psi_total), 'k--', alpha=0.5, label='포락선 |ψ|')
axes[2].plot(x, -np.abs(psi_total), 'k--', alpha=0.5)
axes[2].set_ylabel('Re(Οˆβ‚ + Οˆβ‚‚)', fontsize=12)
axes[2].set_xlabel('x', fontsize=12)
axes[2].legend(fontsize=11)
axes[2].grid(True, alpha=0.3)

plt.suptitle('νŒŒλ™μ˜ λ³΅μ†Œ ν‘œν˜„κ³Ό λ§₯놀이(Beat) ν˜„μƒ', fontsize=14)
plt.tight_layout()
plt.savefig('wave_superposition.png', dpi=150, bbox_inches='tight')
plt.show()

5.3 μ–‘μžμ—­ν•™μ˜ νŒŒλ™ν•¨μˆ˜

μ–‘μžμ—­ν•™μ—μ„œ μž…μžμ˜ μƒνƒœλŠ” λ³΅μ†Œ νŒŒλ™ν•¨μˆ˜ $\Psi(x, t)$둜 κΈ°μˆ λ©λ‹ˆλ‹€.

자유 μž…μžμ˜ νŒŒλ™ν•¨μˆ˜:

$$ \Psi(x, t) = A \exp\left[i\left(kx - \frac{\hbar k^2}{2m}t\right)\right] $$

ν™•λ₯  밀도: $|\Psi(x,t)|^2 = \Psi^* \Psi$ (κ΄€μΈ‘ κ°€λŠ₯ν•œ λ¬Όλ¦¬λŸ‰μ€ 항상 μ‹€μˆ˜)

μŠˆλ’°λ”©κ±° 방정식:

$$ i\hbar \frac{\partial \Psi}{\partial t} = -\frac{\hbar^2}{2m}\frac{\partial^2 \Psi}{\partial x^2} + V(x)\Psi $$

본질적 λ³΅μ†Œμ„±: μŠˆλ’°λ”©κ±° λ°©μ •μ‹μ—λŠ” $i$κ°€ λͺ…μ‹œμ μœΌλ‘œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. μ–‘μžμ—­ν•™μ—μ„œ λ³΅μ†Œμˆ˜λŠ” λ‹¨μˆœν•œ νŽΈμ˜κ°€ μ•„λ‹ˆλΌ 물리의 λ³Έμ§ˆμž…λ‹ˆλ‹€.

import numpy as np
import matplotlib.pyplot as plt

# κ°€μš°μ‹œμ•ˆ νŒŒλ™ νŒ¨ν‚·μ˜ μ‹œκ°„ μ§„ν™”
hbar = 1.0  # μžμ—° λ‹¨μœ„κ³„
m = 1.0
sigma_0 = 1.0   # 초기 νŒŒλ™ νŒ¨ν‚· 폭
k_0 = 5.0       # 평균 파수 (μš΄λ™λŸ‰)

x = np.linspace(-10, 20, 1000)

def gaussian_wavepacket(x, t, sigma_0, k_0, m, hbar):
    """κ°€μš°μ‹œμ•ˆ νŒŒλ™ νŒ¨ν‚·μ˜ 해석적 ν•΄."""
    sigma_t = sigma_0 * np.sqrt(1 + (hbar*t/(2*m*sigma_0**2))**2)
    phase_factor = hbar * t / (2 * m * sigma_0**2)

    psi = (2*np.pi*sigma_0**2)**(-0.25) * (sigma_0 / sigma_t) * np.exp(
        -(x - hbar*k_0*t/m)**2 / (4*sigma_0*sigma_t) *
        (sigma_0/sigma_t) *
        np.exp(-1j * np.arctan(phase_factor)/2)
    ) * np.exp(1j * (k_0*x - hbar*k_0**2*t/(2*m)))

    # μ •κ·œν™”
    norm = np.sqrt(np.trapz(np.abs(psi)**2, x))
    return psi / norm if norm > 0 else psi

fig, axes = plt.subplots(2, 1, figsize=(12, 8), sharex=True)

times = [0, 1, 2, 3, 4]
colors = plt.cm.viridis(np.linspace(0, 0.9, len(times)))

for t, color in zip(times, colors):
    psi = gaussian_wavepacket(x, t, sigma_0, k_0, m, hbar)
    prob = np.abs(psi)**2

    axes[0].plot(x, psi.real, color=color, linewidth=1.5,
                 label=f't = {t}', alpha=0.8)
    axes[1].plot(x, prob, color=color, linewidth=1.5,
                 label=f't = {t}', alpha=0.8)

axes[0].set_ylabel(r'Re($\Psi$)', fontsize=13)
axes[0].set_title('κ°€μš°μ‹œμ•ˆ νŒŒλ™ νŒ¨ν‚·μ˜ μ‹œκ°„ μ§„ν™”', fontsize=14)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)

axes[1].set_xlabel('x', fontsize=13)
axes[1].set_ylabel(r'$|\Psi|^2$', fontsize=13)
axes[1].set_title('ν™•λ₯  밀도 (νŒŒλ™ νŒ¨ν‚· 퍼짐)', fontsize=14)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)

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

5.4 μ‚Όκ°ν•¨μˆ˜ ν•­λ“±μ‹μ˜ μœ λ„

였일러 곡식을 μ΄μš©ν•˜λ©΄ λ³΅μž‘ν•œ μ‚Όκ°ν•¨μˆ˜ 항등식을 μ²΄κ³„μ μœΌλ‘œ μœ λ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

방법: $e^{i\theta} = \cos\theta + i\sin\theta$λ₯Ό μ΄μš©ν•˜μ—¬ μ§€μˆ˜λ²•μΉ™μœΌλ‘œ μ „κ°œν•œ λ’€, μ‹€μˆ˜λΆ€μ™€ ν—ˆμˆ˜λΆ€λ₯Ό λΉ„κ΅ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ 1: λ§μ…ˆμ •λ¦¬

$$ e^{i(\alpha + \beta)} = e^{i\alpha} \cdot e^{i\beta} $$

μ’Œλ³€: $\cos(\alpha+\beta) + i\sin(\alpha+\beta)$

μš°λ³€: $(\cos\alpha + i\sin\alpha)(\cos\beta + i\sin\beta)$

μ‹€μˆ˜λΆ€ 비ꡐ: $\cos(\alpha+\beta) = \cos\alpha\cos\beta - \sin\alpha\sin\beta$

ν—ˆμˆ˜λΆ€ 비ꡐ: $\sin(\alpha+\beta) = \sin\alpha\cos\beta + \cos\alpha\sin\beta$

μ˜ˆμ‹œ 2: $\cos^n\theta$λ₯Ό λ‹€μ€‘κ°μ˜ μ½”μ‚¬μΈμœΌλ‘œ ν‘œν˜„

$$ \cos\theta = \frac{e^{i\theta} + e^{-i\theta}}{2} $$

μ΄λ―€λ‘œ:

$$ \cos^n\theta = \frac{1}{2^n}(e^{i\theta} + e^{-i\theta})^n $$

μ΄ν•­μ •λ¦¬λ‘œ μ „κ°œν•˜λ©΄ 닀쀑각 곡식을 μ–»μŠ΅λ‹ˆλ‹€.

import sympy as sp

theta, alpha, beta = sp.symbols('theta alpha beta', real=True)

# 였일러 곡식을 μ΄μš©ν•œ μ‚Όκ°ν•¨μˆ˜ 항등식 μœ λ„
print("=== λ§μ…ˆμ •λ¦¬ μœ λ„ ===")
lhs = sp.exp(sp.I * (alpha + beta))
rhs = sp.exp(sp.I * alpha) * sp.exp(sp.I * beta)

# rhsλ₯Ό μ „κ°œ
rhs_expanded = sp.expand(rhs, complex=True)
rhs_trig = sp.expand((sp.cos(alpha) + sp.I*sp.sin(alpha)) *
                      (sp.cos(beta) + sp.I*sp.sin(beta)))

print(f"μ‹€μˆ˜λΆ€: cos(a+b) = {sp.re(rhs_trig)}")
print(f"ν—ˆμˆ˜λΆ€: sin(a+b) = {sp.im(rhs_trig)}")

# cos^n(theta)λ₯Ό λ‹€μ€‘κ°μœΌλ‘œ ν‘œν˜„
print("\n=== cos^n(theta) μ „κ°œ ===")
for n in [2, 3, 4]:
    # cos(theta) = (e^{it} + e^{-it}) / 2
    t = sp.Symbol('t')
    expr = ((sp.exp(sp.I*t) + sp.exp(-sp.I*t)) / 2)**n
    expanded = sp.expand(expr)
    # e^{ikt} + e^{-ikt} = 2*cos(kt) 이용
    result = sp.simplify(sp.trigsimp(expanded.rewrite(sp.cos)))
    print(f"  cos^{n}(theta) = {result.subs(t, theta)}")

# 수치 검증
import numpy as np
theta_val = np.pi / 5
print(f"\n=== 수치 검증 (theta = pi/5) ===")
print(f"cos^3(theta) = {np.cos(theta_val)**3:.8f}")
print(f"(3*cos(theta) + cos(3*theta))/4 = "
      f"{(3*np.cos(theta_val) + np.cos(3*theta_val))/4:.8f}")

6. λ³΅μ†Œμˆ˜μ™€ 2D λ³€ν™˜

6.1 νšŒμ „κ³Ό μŠ€μΌ€μΌλ§

λ³΅μ†Œμˆ˜μ˜ κ³±μ…ˆμ€ κΈ°ν•˜ν•™μ μœΌλ‘œ νšŒμ „(rotation)κ³Ό μŠ€μΌ€μΌλ§(scaling)에 λŒ€μ‘ν•©λ‹ˆλ‹€.

$w = e^{i\phi}$λ₯Ό κ³±ν•˜λ©΄ 각도 $\phi$만큼 λ°˜μ‹œκ³„ λ°©ν–₯ νšŒμ „:

$$ z' = e^{i\phi} z $$

일반적으둜 $w = re^{i\phi}$λ₯Ό κ³±ν•˜λ©΄: - $r$λ°° μŠ€μΌ€μΌλ§ - $\phi$만큼 νšŒμ „

등각사상(conformal mapping): λ³΅μ†Œ ν•΄μ„ν•¨μˆ˜μ— μ˜ν•œ λ³€ν™˜μ€ 각도λ₯Ό λ³΄μ‘΄ν•©λ‹ˆλ‹€. 이 μ„±μ§ˆμ΄ μœ μ²΄μ—­ν•™, μ „μžκΈ°ν•™μ—μ„œ ν•΅μ‹¬μ μž…λ‹ˆλ‹€.

import numpy as np
import matplotlib.pyplot as plt

# λ³΅μ†Œμˆ˜ κ³±μ…ˆμ— μ˜ν•œ νšŒμ „κ³Ό μŠ€μΌ€μΌλ§
fig, axes = plt.subplots(1, 3, figsize=(18, 6))

# μ›λž˜ λ„ν˜•: μ‚Όκ°ν˜•
triangle = np.array([1+0j, 0+1j, -0.5-0.5j, 1+0j])

# (a) 순수 νšŒμ „: e^{i*pi/4} κ³±
angle = np.pi / 4
w_rotate = np.exp(1j * angle)

ax = axes[0]
ax.plot(triangle.real, triangle.imag, 'b-o', linewidth=2,
        markersize=8, label='원본')
rotated = w_rotate * triangle
ax.plot(rotated.real, rotated.imag, 'r-o', linewidth=2,
        markersize=8, label=f'νšŒμ „ ({np.degrees(angle):.0f}Β°)')
ax.set_title(r'νšŒμ „: $z \mapsto e^{i\pi/4} z$', fontsize=13)
ax.set_aspect('equal')
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
ax.set_xlim(-2, 2)
ax.set_ylim(-1.5, 2)

# (b) μŠ€μΌ€μΌλ§ + νšŒμ „: (1+i)*z = sqrt(2)*e^{i*pi/4}*z
w_scale_rotate = 1 + 1j

ax = axes[1]
ax.plot(triangle.real, triangle.imag, 'b-o', linewidth=2,
        markersize=8, label='원본')
transformed = w_scale_rotate * triangle
ax.plot(transformed.real, transformed.imag, 'r-o', linewidth=2,
        markersize=8, label=r'$(1+i) \cdot z$')
ax.set_title(r'μŠ€μΌ€μΌλ§+νšŒμ „: $z \mapsto (1+i)z$', fontsize=13)
ax.set_aspect('equal')
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
ax.set_xlim(-3, 3)
ax.set_ylim(-2, 3)

# (c) z^2 λ³€ν™˜ (λΉ„μ„ ν˜•, 등각)
theta = np.linspace(0, 2*np.pi, 200)
r_vals = [0.5, 0.75, 1.0]

ax = axes[2]
for r in r_vals:
    z_circle = r * np.exp(1j * theta)
    w_mapped = z_circle**2
    ax.plot(z_circle.real, z_circle.imag, 'b-', alpha=0.5, linewidth=1)
    ax.plot(w_mapped.real, w_mapped.imag, 'r-', alpha=0.7, linewidth=1.5)

ax.plot([], [], 'b-', label='원본 (원)', linewidth=2)
ax.plot([], [], 'r-', label=r'$z^2$ λ³€ν™˜', linewidth=2)
ax.set_title(r'λΉ„μ„ ν˜• 등각사상: $z \mapsto z^2$', fontsize=13)
ax.set_aspect('equal')
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)

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

6.2 μ£Όμ½”ν”„μŠ€ν‚€ λ³€ν™˜ (항곡역학)

μ£Όμ½”ν”„μŠ€ν‚€ λ³€ν™˜(Joukowski/Zhukovsky transform)은 ν•­κ³΅μ—­ν•™μ—μ„œ λ‚ κ°œ 단면(airfoil)의 μœ λ™μ„ λΆ„μ„ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” λŒ€ν‘œμ μΈ λ“±κ°μ‚¬μƒμž…λ‹ˆλ‹€:

$$ w = z + \frac{c^2}{z} $$

  • 원( $z$-평면)을 λ‚ κ°œν˜• 단면($w$-평면)으둜 λ³€ν™˜
  • μ›μ˜ 쀑심을 μ•½κ°„ μ΄λ™μ‹œν‚€λ©΄ λ‹€μ–‘ν•œ λ‚ κ°œ ν˜•μƒμ„ 생성
  • 유체의 속도μž₯κ³Ό μ••λ ₯ 뢄포λ₯Ό ν•΄μ„μ μœΌλ‘œ 계산 κ°€λŠ₯
import numpy as np
import matplotlib.pyplot as plt

def joukowski(z, c=1.0):
    """μ£Όμ½”ν”„μŠ€ν‚€ λ³€ν™˜: w = z + c^2/z"""
    return z + c**2 / z

fig, axes = plt.subplots(1, 3, figsize=(18, 6))

theta = np.linspace(0, 2*np.pi, 500)
c = 1.0

# λ‹€μ–‘ν•œ μ›μ˜ 쀑심 이동에 λ”°λ₯Έ λ‚ κ°œν˜• λ³€ν™”
offsets = [
    (0.0, 0.0, '원 (쀑심 원점)'),      # μ™„λ²½ν•œ 원 -> 직선
    (-0.1, 0.1, 'μ•½κ°„ μ΄λ™ν•œ 원'),       # λΉ„λŒ€μΉ­ λ‚ κ°œν˜•
    (-0.15, 0.15, '더 μ΄λ™ν•œ 원'),       # λ‘κΊΌμš΄ λ‚ κ°œν˜•
]

for ax, (dx, dy, title) in zip(axes, offsets):
    # z-평면: μ΄λ™λœ 원
    R = np.sqrt((c - dx)**2 + dy**2) + 0.02  # cλ₯Ό ν¬ν•¨ν•˜λŠ” 원
    z = (dx + dy*1j) + R * np.exp(1j * theta)

    # w-평면: μ£Όμ½”ν”„μŠ€ν‚€ λ³€ν™˜
    w = joukowski(z, c)

    # z-평면과 w-평면을 ν•¨κ»˜ ν‘œμ‹œ
    ax.plot(z.real, z.imag, 'b-', linewidth=1.5, alpha=0.5,
            label=r'$z$-평면 (원)')
    ax.plot(w.real, w.imag, 'r-', linewidth=2.5,
            label=r'$w$-평면 (λ‚ κ°œν˜•)')

    # 특이점 ν‘œμ‹œ
    ax.plot(c, 0, 'ko', markersize=6)
    ax.plot(-c, 0, 'ko', markersize=6)

    ax.set_title(title, fontsize=13)
    ax.set_aspect('equal')
    ax.legend(fontsize=10, loc='upper left')
    ax.grid(True, alpha=0.3)
    ax.set_xlim(-3.5, 3.5)
    ax.set_ylim(-2.5, 2.5)

plt.suptitle(r'μ£Όμ½”ν”„μŠ€ν‚€ λ³€ν™˜: $w = z + c^2/z$ (항곡역학 μ‘μš©)',
             fontsize=15, y=1.02)
plt.tight_layout()
plt.savefig('joukowski.png', dpi=150, bbox_inches='tight')
plt.show()

μœ λ™μž₯ μ‹œκ°ν™” (streamlines):

import numpy as np
import matplotlib.pyplot as plt

# μ£Όμ½”ν”„μŠ€ν‚€ λ‚ κ°œ μ£Όμœ„μ˜ μœ λ™μž₯
c = 1.0
dx, dy = -0.1, 0.08
R = np.sqrt((c - dx)**2 + dy**2) + 0.01
center = dx + dy*1j

# λ³΅μ†Œ ν¬ν…μ…œ: 일양λ₯˜ + 원기λ‘₯ μ£Όμœ„ μœ λ™ + μˆœν™˜
U_inf = 1.0  # 자유λ₯˜ 속도
Gamma = 4 * np.pi * U_inf * R * np.sin(
    np.arctan2(dy, c - dx) + np.arcsin(Gamma_approx := 0.1)
) if False else 2.5  # 쿠타 쑰건에 μ˜ν•œ μˆœν™˜

# 격자 생성 (z-평면)
x_grid = np.linspace(-3, 4, 400)
y_grid = np.linspace(-3, 3, 400)
X, Y = np.meshgrid(x_grid, y_grid)
z_grid = X + 1j*Y

# 원 λ‚΄λΆ€ λ§ˆμŠ€ν‚Ή
mask = np.abs(z_grid - center) < R

# λ³΅μ†Œ 속도 (z-ν‰λ©΄μ—μ„œ)
# w(z) = U*(z - center) + U*R^2/(z - center) + i*Gamma/(2*pi)*log(z - center)
zeta = z_grid - center
F = U_inf * zeta + U_inf * R**2 / zeta - 1j*Gamma/(2*np.pi)*np.log(zeta)

# μœ μ„  = Im(F) = const
psi = F.imag
psi[mask] = np.nan

# w-ν‰λ©΄μœΌλ‘œ λ³€ν™˜
w_grid = joukowski(z_grid, c)
w_grid[mask] = np.nan

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

# z-평면 μœ λ™
ax = axes[0]
levels = np.linspace(-4, 4, 40)
ax.contour(X, Y, psi, levels=levels, colors='steelblue', linewidths=0.7)
circle_plot = center + R * np.exp(1j * np.linspace(0, 2*np.pi, 200))
ax.fill(circle_plot.real, circle_plot.imag, color='lightgray', zorder=3)
ax.plot(circle_plot.real, circle_plot.imag, 'k-', linewidth=2, zorder=4)
ax.set_title('z-평면: 원기λ‘₯ μ£Όμœ„ μœ λ™', fontsize=13)
ax.set_aspect('equal')
ax.set_xlim(-3, 4)
ax.set_ylim(-3, 3)

# w-평면 μœ λ™ (λ‚ κ°œ μ£Όμœ„)
ax = axes[1]
# λ‚ κ°œν˜• 경계
theta_wing = np.linspace(0, 2*np.pi, 500)
z_wing = center + R * np.exp(1j * theta_wing)
w_wing = joukowski(z_wing, c)

ax.contour(w_grid.real, w_grid.imag, psi, levels=levels,
           colors='steelblue', linewidths=0.7)
ax.fill(w_wing.real, w_wing.imag, color='lightgray', zorder=3)
ax.plot(w_wing.real, w_wing.imag, 'k-', linewidth=2, zorder=4)
ax.set_title('w-평면: λ‚ κ°œν˜• μ£Όμœ„ μœ λ™ (μ£Όμ½”ν”„μŠ€ν‚€ λ³€ν™˜)', fontsize=13)
ax.set_aspect('equal')
ax.set_xlim(-3.5, 4.5)
ax.set_ylim(-3, 3)

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

μ—°μŠ΅ 문제

문제 1: κ·Ήμ’Œν‘œ λ³€ν™˜

λ‹€μŒ λ³΅μ†Œμˆ˜λ₯Ό κ·Ήμ’Œν‘œ ν˜•μ‹ $re^{i\theta}$둜 ν‘œν˜„ν•˜μ‹œμ˜€ ($-\pi < \theta \leq \pi$):

(a) $z = -1 + i$ (b) $z = -3 - 3\sqrt{3}\,i$ (c) $z = 5i$

문제 2: λ“œλͺ¨μ•„λΈŒλ₯΄ 정리 μ‘μš©

λ“œλͺ¨μ•„λΈŒλ₯΄ 정리λ₯Ό μ΄μš©ν•˜μ—¬ $\sin(4\theta)$λ₯Ό $\sin\theta$와 $\cos\theta$둜 ν‘œν˜„ν•˜μ‹œμ˜€.

문제 3: κ±°λ“­μ œκ³±κ·Ό

$z^4 = -16$의 λͺ¨λ“  근을 κ΅¬ν•˜μ‹œμ˜€. λ³΅μ†Œ 평면에 λ„μ‹œν•˜κ³ , κ²°κ³Όλ₯Ό $a + bi$ ν˜•νƒœλ‘œ ν‘œν˜„ν•˜μ‹œμ˜€.

문제 4: λ³΅μ†Œ 둜그

λ‹€μŒμ„ κ³„μ‚°ν•˜μ‹œμ˜€ (μ£Όκ°’):

(a) $\ln(-e)$ (b) $\ln(1 + i)$ (c) $i^i = e^{i \ln i}$

문제 5: ꡐλ₯˜ 회둜 뢄석

$R = 50\,\Omega$, $L = 20\,\text{mH}$, $C = 10\,\mu\text{F}$인 RLC 직렬 νšŒλ‘œμ— $V(t) = 10\cos(\omega t)$ (V)κ°€ 인가될 λ•Œ:

(a) 곡진 주파수 $f_0$λ₯Ό κ΅¬ν•˜μ‹œμ˜€. (b) $f = 500\,\text{Hz}$μ—μ„œμ˜ μž„ν”Όλ˜μŠ€ $Z$의 크기와 μœ„μƒμ„ κ΅¬ν•˜μ‹œμ˜€. (c) 곡진 μ‹œ μ „λ₯˜μ˜ μ΅œλŒ€κ°’μ„ κ΅¬ν•˜μ‹œμ˜€.

문제 6: 등각사상

μ£Όμ½”ν”„μŠ€ν‚€ λ³€ν™˜ $w = z + 1/z$μ—μ„œ:

(a) $|z| = 2$인 원이 $w$-ν‰λ©΄μ—μ„œ μ–΄λ–€ κ³‘μ„ μœΌλ‘œ λ³€ν™˜λ˜λŠ”μ§€ λ§€κ°œλ³€μˆ˜ ν‘œν˜„μ„ κ΅¬ν•˜μ‹œμ˜€. (b) 이 곑선이 νƒ€μ›μž„μ„ 보이고, μž₯μΆ•κ³Ό λ‹¨μΆ•μ˜ 길이λ₯Ό κ΅¬ν•˜μ‹œμ˜€.


μ—°μŠ΅ 문제 풀이 (ν΄λ¦­ν•˜μ—¬ 펼치기)
import numpy as np

# === 문제 1 풀이 ===
print("=== 문제 1: κ·Ήμ’Œν‘œ λ³€ν™˜ ===\n")

problems_1 = {
    '(a) -1 + i': -1 + 1j,
    '(b) -3 - 3*sqrt(3)*i': -3 - 3*np.sqrt(3)*1j,
    '(c) 5i': 5j,
}

for label, z in problems_1.items():
    r = abs(z)
    theta = np.angle(z)
    print(f"{label}")
    print(f"  z = {z}")
    print(f"  r = {r:.6f}, theta = {theta:.6f} rad = {np.degrees(theta):.2f}Β°")
    print(f"  κ·Ήμ’Œν‘œ: {r:.4f} * exp(i * {theta:.4f})")
    print()

# === 문제 3 풀이 ===
print("=== 문제 3: z^4 = -16 ===\n")
w = -16 + 0j
n = 4
R = abs(w)**(1/n)   # 16^(1/4) = 2
Phi = np.angle(w)    # pi

for k in range(n):
    z_k = R * np.exp(1j * (Phi + 2*np.pi*k) / n)
    print(f"z_{k} = {z_k.real:+.6f} {z_k.imag:+.6f}i")
    print(f"     = {R:.4f} * exp(i * {np.degrees((Phi + 2*np.pi*k)/n):.1f}Β°)")
    print(f"     검증: z^4 = {z_k**4:.6f}")
    print()

# === 문제 4 풀이 ===
print("=== 문제 4: λ³΅μ†Œ 둜그 ===\n")

# (a) ln(-e)
z_a = -np.e + 0j
print(f"(a) ln(-e) = {np.log(z_a):.6f}")
print(f"    = ln(e) + i*pi = 1 + i*pi = {1 + 1j*np.pi:.6f}\n")

# (b) ln(1+i)
z_b = 1 + 1j
print(f"(b) ln(1+i) = {np.log(z_b):.6f}")
print(f"    = ln(sqrt(2)) + i*pi/4 = {np.log(np.sqrt(2)) + 1j*np.pi/4:.6f}\n")

# (c) i^i
z_c = 1j ** 1j
print(f"(c) i^i = {z_c:.10f}")
print(f"    = exp(i * ln(i)) = exp(i * i*pi/2) = exp(-pi/2)")
print(f"    = {np.exp(-np.pi/2):.10f}")

# === 문제 5 풀이 ===
print("\n=== 문제 5: RLC 회둜 ===\n")
R = 50
L = 20e-3
C = 10e-6

# (a)
f_0 = 1 / (2*np.pi*np.sqrt(L*C))
print(f"(a) 곡진 주파수: f_0 = {f_0:.2f} Hz")

# (b)
f = 500
omega = 2 * np.pi * f
Z = R + 1j*(omega*L - 1/(omega*C))
print(f"(b) f = {f} Hzμ—μ„œ:")
print(f"    Z = {Z:.4f}")
print(f"    |Z| = {abs(Z):.4f} Ohm")
print(f"    arg(Z) = {np.degrees(np.angle(Z)):.2f}Β°")

# (c)
V0 = 10
I_max = V0 / R
print(f"(c) 곡진 μ‹œ I_max = V0/R = {I_max:.4f} A = {I_max*1000:.1f} mA")

참고 자료

ꡐ재

  1. Boas, M. L. (2005). Mathematical Methods in the Physical Sciences, 3rd ed., Chapter 2. Wiley.
  2. Arfken, G. B., Weber, H. J., & Harris, F. E. (2012). Mathematical Methods for Physicists, 7th ed., Chapter 6. Academic Press.
  3. Needham, T. (1997). Visual Complex Analysis. Oxford University Press. β€” λ³΅μ†Œμˆ˜μ˜ κΈ°ν•˜ν•™μ  이해에 νƒμ›”ν•œ ꡐ재

온라인 자료

  1. MIT OCW 18.04: Complex Variables with Applications
  2. 3Blue1Brown: "What is Euler's Formula?" (YouTube) β€” 였일러 κ³΅μ‹μ˜ 직관적 이해
  3. Better Explained: An Intuitive Guide to Imaginary Numbers

μ—°κ΄€ 레슨


λ‹€μŒ 레슨

03. 벑터 해석 (Vector Analysis)μ—μ„œλŠ” 슀칼라μž₯κ³Ό 벑터μž₯의 λ―ΈλΆ„κ³Ό 적뢄을 λ‹€λ£Ήλ‹ˆλ‹€. 기울기(gradient), λ°œμ‚°(divergence), νšŒμ „(curl) μ—°μ‚°μžμ™€ μŠ€ν† ν¬μŠ€/κ°€μš°μŠ€ 정리λ₯Ό ν•™μŠ΅ν•©λ‹ˆλ‹€.

to navigate between lessons