17. ๋ณ๋ถ๋ฒ (Calculus of Variations)
17. ๋ณ๋ถ๋ฒ (Calculus of Variations)¶
ํ์ต ๋ชฉํ¶
- ๋ฒํจ์(functional)์ ๊ฐ๋ ๊ณผ ์ผ๋ฐ ํจ์์์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ค
- ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ ์ ๋ํ๊ณ ๋ค์ํ ํน์ ํํ์ ์ ์ฉํ๋ค
- ์ต์ ๊ฐํ์ , ์ธก์ง์ , ํ์์ ๋ฑ ๊ณ ์ ์ ๋ณ๋ถ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค
- ๊ตฌ์ ์กฐ๊ฑด์ด ์๋ ๋ณ๋ถ ๋ฌธ์ ์ ๋ผ๊ทธ๋์ฃผ ์น์๋ฒ์ ์ ์ฉํ๋ค
- ๋ผ๊ทธ๋์ฃผ ์ญํ๊ณผ ํด๋ฐํด ์ญํ์ ๋ณ๋ถ๋ฒ์ ๊ธฐ์ด๋ฅผ ์ดํดํ๋ค
- ๋ณ๋ถ๋ฒ์ ํ๋์ ์์ฉ(์ ํ์์๋ฒ, ์ต์ ์ ์ด, ๋ ์ผ๋ฆฌ-๋ฆฌ์ธ ๋ฒ)์ ํ์ ํ๋ค
๋ฌผ๋ฆฌํ์์์ ์ค์์ฑ: ๋ณ๋ถ๋ฒ์ "์์ฐ์ ์์ฉ์ ์ต์ํํ๋ค"๋ ์ต์์์ฉ ์๋ฆฌ์ ์ํ์ ํ ๋์ด๋ค. ๋ดํด ์ญํ์ ๋ผ๊ทธ๋์ฃผยทํด๋ฐํด ํ์์ผ๋ก ์ฌ๊ตฌ์ฑํ๊ณ , ํ๋ฅด๋ง ์๋ฆฌ(๊ดํ), ์ต์ ๊ณก๋ฉด(๋น๋๋ง), ์ต์ ๊ฒฝ๋ก ๋ฌธ์ ๋ฑ ๋ฌผ๋ฆฌํ๊ณผ ๊ณตํ ์ ๋ฐ์์ ํต์ฌ์ ์ญํ ์ ํ๋ค. ์์์ญํ์ ๊ฒฝ๋ก์ ๋ถ, ์ผ๋ฐ์๋๋ก ์ ์์ธ์ํ์ธ ๋ฐฉ์ ์, ๊ณ ์ ์ฅ๋ก ์ ๋ผ๊ทธ๋์ง์ ๋ฐ๋ ๋ชจ๋ ๋ณ๋ถ๋ฒ์ ๊ธฐ์ดํ๋ค.
1. ๋ณ๋ถ๋ฒ์ ๊ธฐ๋ณธ ๊ฐ๋ ¶
1.1 ๋ฒํจ์์ ํจ์์ ๊ตฌ๋ถ¶
์ผ๋ฐ ํจ์ $f: \mathbb{R} \to \mathbb{R}$๋ ์๋ฅผ ์ ๋ ฅ๋ฐ์ ์๋ฅผ ๋ฐํํ๋ค. ๋ฐ๋ฉด ๋ฒํจ์(functional) $J: \mathcal{F} \to \mathbb{R}$๋ ํจ์๋ฅผ ์ ๋ ฅ๋ฐ์ ์๋ฅผ ๋ฐํํ๋ค.
$$J[y] = \int_a^b F(x, y(x), y'(x))\, dx$$
์ฌ๊ธฐ์ $F$๋ ํผ์ ๋ถํจ์(integrand)์ด๊ณ , $y(x)$๋ ํ์ฉ ํจ์(admissible function)์ ๊ณต๊ฐ $\mathcal{F}$์ ์ํ๋ค. ํ์ฉ ํจ์๋ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค:
- $y(x) \in C^2[a, b]$ (๋ ๋ฒ ์ฐ์ ๋ฏธ๋ถ ๊ฐ๋ฅ)
- ๊ฒฝ๊ณ์กฐ๊ฑด: $y(a) = y_a$, $y(b) = y_b$ (๊ณ ์ ๋์ )
1.2 ๋ณ๋ถ $\delta y$์ ์ 1๋ณ๋ถ¶
ํ์ฉ ํจ์ $y(x)$์ ๋ํ ๋ณ๋ถ(variation)์ ๊ฒฝ๊ณ์์ ์ฌ๋ผ์ง๋ ์์์ ํจ์ $\eta(x)$์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค:
$$\delta y(x) = \epsilon \eta(x), \quad \eta(a) = \eta(b) = 0$$
์ 1๋ณ๋ถ(first variation)์ ๋ฒํจ์์ ๋ฏธ๋ถ์ ํด๋นํ๋ค:
$$\delta J = \left.\frac{d}{d\epsilon}J[y + \epsilon\eta]\right|_{\epsilon=0} = \int_a^b \left(\frac{\partial F}{\partial y}\eta + \frac{\partial F}{\partial y'}\eta'\right) dx$$
๋ฒํจ์๊ฐ ๊ทน๊ฐ์ ๊ฐ์ง๋ ค๋ฉด, ๋ชจ๋ ํ์ฉ ๋ณ๋ถ $\eta$์ ๋ํด $\delta J = 0$์ด์ด์ผ ํ๋ค.
import numpy as np
import matplotlib.pyplot as plt
def evaluate_functional(F, y_func, x_range, N=1000):
"""๋ฒํจ์ J[y] = โซF(x, y, y')dx๋ฅผ ์์น์ ์ผ๋ก ๊ณ์ฐ"""
a, b = x_range
x = np.linspace(a, b, N)
h = (b - a) / (N - 1)
y = y_func(x)
# ์ค์ฌ ์ฐจ๋ถ์ผ๋ก y' ๊ณ์ฐ
yp = np.gradient(y, x)
# ์ฌ๋ค๋ฆฌ๊ผด ์ ๋ถ
integrand = F(x, y, yp)
return np.trapz(integrand, x)
# ์: ํธ์ ๊ธธ์ด ๋ฒํจ์ J[y] = โซโ(1 + y'ยฒ)dx
F_arclength = lambda x, y, yp: np.sqrt(1 + yp**2)
# ์ง์ y = x vs ํฌ๋ฌผ์ y = xยฒ (๊ตฌ๊ฐ [0, 1])
y_line = lambda x: x
y_parabola = lambda x: x**2
J_line = evaluate_functional(F_arclength, y_line, (0, 1))
J_parab = evaluate_functional(F_arclength, y_parabola, (0, 1))
print(f"์ง์ ์ ํธ์ ๊ธธ์ด: J[y=x] = {J_line:.6f}")
print(f"ํฌ๋ฌผ์ ์ ํธ์ ๊ธธ์ด: J[y=xยฒ] = {J_parab:.6f}")
print(f"์ง์ ์ด ๋ ์งง์ (์ต๋จ ๊ฒฝ๋ก): {J_line < J_parab}")
2. ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์¶
2.1 ์ ๋¶
$\delta J = 0$ ์กฐ๊ฑด์ ๋ถ๋ถ์ ๋ถ์ ์ ์ฉํ๋ค:
$$\delta J = \int_a^b \left(\frac{\partial F}{\partial y}\eta + \frac{\partial F}{\partial y'}\eta'\right) dx$$
๋ ๋ฒ์งธ ํญ์ ๋ถ๋ถ์ ๋ถํ๋ฉด:
$$\int_a^b \frac{\partial F}{\partial y'}\eta'\, dx = \left[\frac{\partial F}{\partial y'}\eta\right]_a^b - \int_a^b \frac{d}{dx}\frac{\partial F}{\partial y'}\eta\, dx$$
๊ฒฝ๊ณ ํญ์ $\eta(a) = \eta(b) = 0$์ด๋ฏ๋ก ์ฌ๋ผ์ง๋ค. ๋ฐ๋ผ์:
$$\delta J = \int_a^b \left(\frac{\partial F}{\partial y} - \frac{d}{dx}\frac{\partial F}{\partial y'}\right)\eta\, dx = 0$$
๋ณ๋ถ๋ฒ์ ๊ธฐ๋ณธ ๋ณด์กฐ์ ๋ฆฌ: ๋ชจ๋ $\eta$์ ๋ํด ์ ์ ๋ถ์ด 0์ด๋ฉด ํผ์ ๋ถํจ์๊ฐ 0์ด์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ด ๋์ถ๋๋ค:
$$\boxed{\frac{\partial F}{\partial y} - \frac{d}{dx}\frac{\partial F}{\partial y'} = 0}$$
2.2 ํน์ํ ๊ฒฝ์ฐ¶
๊ฒฝ์ฐ 1: $F$๊ฐ $y$์ ์์กดํ์ง ์์ ๋ ($F = F(x, y')$):
$$\frac{\partial F}{\partial y'} = C \quad \text{(์์)}$$
๊ฒฝ์ฐ 2: $F$๊ฐ $x$์ ๋ช ์์ ์ผ๋ก ์์กดํ์ง ์์ ๋ ($F = F(y, y')$) -- ๋ฒจํธ๋ผ๋ฏธ ํญ๋ฑ์:
$$\boxed{F - y'\frac{\partial F}{\partial y'} = C}$$
์ด๋ $\frac{d}{dx}\left(F - y'F_{y'}\right) = -xF_x = 0$์ผ๋ก๋ถํฐ ๋์ถ๋๋ค.
import sympy as sp
x = sp.Symbol('x')
y = sp.Function('y')(x)
yp = y.diff(x)
def euler_lagrange(F, y_func, x_var):
"""์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ ์ฌ๋ณผ๋ฆญ์ผ๋ก ๋์ถ"""
yp = y_func.diff(x_var)
# โF/โy
dF_dy = sp.diff(F, y_func)
# d/dx(โF/โy')
dF_dyp = sp.diff(F, yp)
d_dx_dF_dyp = sp.diff(dF_dyp, x_var)
el_eq = sp.simplify(dF_dy - d_dx_dF_dyp)
return sp.Eq(el_eq, 0)
# ์ 1: ์ต๋จ ๊ฑฐ๋ฆฌ โ F = โ(1 + y'ยฒ)
F1 = sp.sqrt(1 + yp**2)
el1 = euler_lagrange(F1, y, x)
print("=== ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฌธ์ ===")
print(f"์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ: {el1}")
print("ํด: y'' = 0 โ y = ax + b (์ง์ )")
# ์ 2: ์ต์ ๊ณก๋ฉด (ํ์ ๋ฉด) โ F = yโ(1 + y'ยฒ)
F2 = y * sp.sqrt(1 + yp**2)
el2 = euler_lagrange(F2, y, x)
print(f"\n=== ์ต์ ํ์ ๋ฉด ===")
print(f"์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ: {el2}")
print("ํด: y = cโ cosh((x - cโ)/cโ) (ํ์์ )")
3. ๊ณ ์ ์ ๋ณ๋ถ ๋ฌธ์ ๋ค¶
3.1 ์ต์ ๊ฐํ์ (Brachistochrone Problem)¶
์ค๋ ฅ์ฅ์์ ์ $A(0,0)$์์ ์ $B(x_1, y_1)$๊น์ง ๋ง์ฐฐ ์์ด ๋ฏธ๋๋ฌ์ง๋ ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ผ. ($y$์ถ์ด ์๋๋ก ํฅํ๋ค.)
์๋์ง ๋ณด์กด์ ์ํด ์๋ ฅ์ $v = \sqrt{2gy}$์ด๊ณ , ์ด๋ ์๊ฐ์:
$$T[y] = \int_0^{x_1} \frac{\sqrt{1 + y'^2}}{\sqrt{2gy}}\, dx$$
$F = \sqrt{(1 + y'^2)/(2gy)}$๋ $x$์ ๋ช ์์ ์ผ๋ก ์์กดํ์ง ์์ผ๋ฏ๋ก ๋ฒจํธ๋ผ๋ฏธ ํญ๋ฑ์์ ์ ์ฉํ๋ค:
$$F - y'F_{y'} = C \implies \frac{1}{\sqrt{2gy(1 + y'^2)}} = C$$
์ ๋ฆฌํ๋ฉด $y(1 + y'^2) = \frac{1}{2gC^2} = 2R$ (์์). ์ด๋ฅผ ๋งค๊ฐ๋ณ์ $\theta$๋ก ํ๋ฉด ์ฌ์ดํด๋ก์ด๋ ํด๊ฐ ๋๋ค:
$$\boxed{x = R(\theta - \sin\theta), \quad y = R(1 - \cos\theta)}$$
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve
def brachistochrone(x1, y1, N=500):
"""์ต์ ๊ฐํ์ (์ฌ์ดํด๋ก์ด๋) ๊ณ์ฐ"""
def equations(params):
R, theta1 = params
eq1 = R * (theta1 - np.sin(theta1)) - x1
eq2 = R * (1 - np.cos(theta1)) - y1
return [eq1, eq2]
R, theta1 = fsolve(equations, [1.0, np.pi])
theta = np.linspace(0, theta1, N)
x_cyc = R * (theta - np.sin(theta))
y_cyc = R * (1 - np.cos(theta))
return x_cyc, y_cyc, R, theta1
# ์ฌ์ดํด๋ก์ด๋ vs ์ง์ vs ํฌ๋ฌผ์ ๋น๊ต
x1, y1 = 1.0, 0.6
x_cyc, y_cyc, R, th1 = brachistochrone(x1, y1)
fig, ax = plt.subplots(1, 1, figsize=(8, 5))
# ์ง์
ax.plot([0, x1], [0, y1], 'b--', label='์ง์ ', linewidth=2)
# ํฌ๋ฌผ์ (y = axยฒ)
x_par = np.linspace(0, x1, 200)
a_par = y1 / x1**2
y_par = a_par * x_par**2
ax.plot(x_par, y_par, 'g-.', label='ํฌ๋ฌผ์ ', linewidth=2)
# ์ฌ์ดํด๋ก์ด๋
ax.plot(x_cyc, y_cyc, 'r-', label='์ฌ์ดํด๋ก์ด๋ (์ต์)', linewidth=2.5)
ax.set_xlabel('x')
ax.set_ylabel('y (์๋ ๋ฐฉํฅ)')
ax.set_title('์ต์ ๊ฐํ์ ๋ฌธ์ (Brachistochrone)')
ax.legend()
ax.invert_yaxis()
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')
plt.tight_layout()
plt.savefig('brachistochrone.png', dpi=150)
plt.show()
# ๊ฐ ๊ฒฝ๋ก์ ์ด๋ ์๊ฐ ๋น๊ต
g = 9.81
def travel_time(x_path, y_path):
"""๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ด๋ํ๋ ์๊ฐ ๊ณ์ฐ"""
ds = np.sqrt(np.diff(x_path)**2 + np.diff(y_path)**2)
v = np.sqrt(2 * g * (y_path[:-1] + y_path[1:]) / 2)
v = np.where(v < 1e-10, 1e-10, v) # 0 ๋๋์
๋ฐฉ์ง
return np.sum(ds / v)
t_line = travel_time(np.linspace(0, x1, 500), np.linspace(0, y1, 500))
t_par = travel_time(x_par, y_par)
t_cyc = travel_time(x_cyc, y_cyc)
print(f"์ง์ ์ด๋ ์๊ฐ: {t_line:.4f}์ด")
print(f"ํฌ๋ฌผ์ ์ด๋ ์๊ฐ: {t_par:.4f}์ด")
print(f"์ฌ์ดํด๋ก์ด๋ ์ด๋ ์๊ฐ: {t_cyc:.4f}์ด (์ต์)")
3.2 ์ธก์ง์ (Geodesics)¶
ํ๋ฉด์์์ ์ธก์ง์ : ๋ ์ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ. $F = \sqrt{1 + y'^2}$๋ก๋ถํฐ $y'' = 0$, ์ฆ ์ง์ ์ด ํด์ด๋ค.
๊ตฌ๋ฉด์์์ ์ธก์ง์ : ๊ตฌ๋ฉด ์ขํ $(\theta, \phi)$์์ ํธ์ ๊ธธ์ด๋:
$$L = R\int \sqrt{d\theta^2 + \sin^2\theta\, d\phi^2} = R\int_{\phi_1}^{\phi_2} \sqrt{\theta'^2 + \sin^2\theta}\, d\phi$$
์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ ํ๋ฉด ๋์(great circle)์ด ๋๋ค.
3.3 ํ์์ (Catenary)¶
๋ฐ๋๊ฐ ๊ท ์ผํ ์ฒด์ธ์ด ์ ๋์ด ๊ณ ์ ๋ ์ํ๋ก ๋งค๋ฌ๋ ค ์์ ๋, ์์น์๋์ง๋ฅผ ์ต์ํํ๋ ํํ๋ฅผ ๊ตฌํ๋ผ:
$$U[y] = \rho g \int_{-a}^{a} y\sqrt{1 + y'^2}\, dx$$
์ฒด์ธ์ ๊ธธ์ด $L = \int \sqrt{1 + y'^2}\, dx$๊ฐ ์ผ์ ํ๋ค๋ ๊ตฌ์ ์กฐ๊ฑด ํ์์, $F = y\sqrt{1 + y'^2}$์ ๋ฒจํธ๋ผ๋ฏธ ํญ๋ฑ์์ ์ ์ฉํ๋ฉด:
$$y = c_1 \cosh\left(\frac{x - c_2}{c_1}\right)$$
์ด๊ฒ์ด ํ์์ (catenary)์ด๋ค.
import numpy as np
import matplotlib.pyplot as plt
# ํ์์ ๊ทธ๋ฆฌ๊ธฐ
def catenary(x, c1, c2=0):
"""ํ์์ : y = cโ cosh((x - cโ)/cโ)"""
return c1 * np.cosh((x - c2) / c1)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# (a) ๋ค์ํ ๋งค๊ฐ๋ณ์์ ํ์์
x = np.linspace(-2, 2, 300)
for c in [0.5, 1.0, 1.5, 2.0]:
axes[0].plot(x, catenary(x, c), label=f'$c_1 = {c}$')
axes[0].set_title('๋ค์ํ ๋งค๊ฐ๋ณ์์ ํ์์ ')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# (b) ํ์์ vs ํฌ๋ฌผ์ ๋น๊ต
c1 = 1.0
y_cat = catenary(x, c1) - c1 # ์ต์ ์ ์ 0์ผ๋ก ์ด๋
y_par = 0.5 * x**2 # ๋น์ทํ ๋ชจ์์ ํฌ๋ฌผ์
axes[1].plot(x, y_cat, 'r-', linewidth=2, label='ํ์์ ')
axes[1].plot(x, y_par, 'b--', linewidth=2, label='ํฌ๋ฌผ์ ')
axes[1].set_title('ํ์์ vs ํฌ๋ฌผ์ ')
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('catenary.png', dpi=150)
plt.show()
3.4 ๋ฑ์ฃผ ๋ฌธ์ (Isoperimetric Problem)¶
์ฃผ์ด์ง ๋๋ $L$์ ๊ฐ์ง ํ๊ณก์ ์ค ๋ฉด์ ์ ์ต๋ํํ๋ ํํ๋ฅผ ๊ตฌํ๋ผ. ํด๋ ์์ด๋ค.
๋ฉด์ : $A = \frac{1}{2}\oint (x\, dy - y\, dx)$, ๋๋ ๊ตฌ์: $L = \oint \sqrt{dx^2 + dy^2}$
3.5 ์ต์ ๊ณก๋ฉด (๋น๋๋ง ๋ฌธ์ )¶
๋ ๋์ถ ์ํ ๊ณ ๋ฆฌ ์ฌ์ด์ ํ์ฑ๋๋ ๋น๋๋ง์ ์ต์ ํ์ ๋ฉด. ๋ฒํจ์:
$$A[y] = 2\pi\int_a^b y\sqrt{1 + y'^2}\, dx$$
๋ฒจํธ๋ผ๋ฏธ ํญ๋ฑ์์ผ๋ก ํ๋ฉด ํ์๋ฉด(catenoid): $y = c\cosh\left(\frac{x - x_0}{c}\right)$
4. ๋ค๋ณ์์ ๊ณ ์ฐจ ๋ํจ์¶
4.1 ๋ค๋ณ์ ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์¶
์ฌ๋ฌ ์ข ์๋ณ์ $y_1(x), y_2(x), \ldots, y_n(x)$์ ๋ํ ๋ฒํจ์:
$$J[y_1, \ldots, y_n] = \int_a^b F(x, y_1, \ldots, y_n, y_1', \ldots, y_n')\, dx$$
๊ฐ $y_i$์ ๋ํด ๋ ๋ฆฝ์ ์ธ ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ด ์ฑ๋ฆฝํ๋ค:
$$\frac{\partial F}{\partial y_i} - \frac{d}{dx}\frac{\partial F}{\partial y_i'} = 0, \quad i = 1, 2, \ldots, n$$
4.2 ๊ณ ์ฐจ ๋ํจ์: ์ค์ผ๋ฌ-ํธ์์ก ๋ฐฉ์ ์¶
$F$๊ฐ $y''$๊น์ง ํฌํจํ ๋:
$$J[y] = \int_a^b F(x, y, y', y'')\, dx$$
์ค์ผ๋ฌ-ํธ์์ก ๋ฐฉ์ ์:
$$\frac{\partial F}{\partial y} - \frac{d}{dx}\frac{\partial F}{\partial y'} + \frac{d^2}{dx^2}\frac{\partial F}{\partial y''} = 0$$
๊ฒฝ๊ณ์กฐ๊ฑด์ผ๋ก $y$์ $y'$์ด ์ ๋์์ ๊ณ ์ ๋์ด์ผ ํ๋ค (4๊ฐ์ ๊ฒฝ๊ณ์กฐ๊ฑด).
์: ํ์ฑ ๋น์ ๊ตฝํ ์๋์ง $J[y] = \int_0^L \frac{EI}{2}(y'')^2\, dx$์์ $y'''' = 0$, ์ฆ 3์ฐจ ๋คํญ์์ด ํด์ด๋ค.
4.3 ๋ค์ค ๋ ๋ฆฝ๋ณ์¶
$u(x, y)$์ ๋ํ ๋ฒํจ์:
$$J[u] = \iint_D F(x, y, u, u_x, u_y)\, dx\, dy$$
์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์:
$$\frac{\partial F}{\partial u} - \frac{\partial}{\partial x}\frac{\partial F}{\partial u_x} - \frac{\partial}{\partial y}\frac{\partial F}{\partial u_y} = 0$$
์: ๋๋ฆฌํด๋ ๋ฒํจ์ $J[u] = \iint (u_x^2 + u_y^2)\, dx\, dy$๋ฅผ ์ต์ํํ๋ฉด $\nabla^2 u = 0$ (๋ผํ๋ผ์ค ๋ฐฉ์ ์)์ด ๋๋ค.
import sympy as sp
x = sp.Symbol('x')
y1 = sp.Function('y1')(x)
y2 = sp.Function('y2')(x)
# 2๋ณ์ ๋ผ๊ทธ๋์ง์ ์: ๊ฒฐํฉ ์ง๋์
# L = ยฝm(แบโยฒ + แบโยฒ) - ยฝk(yโยฒ + yโยฒ) - ยฝk'(yโ - yโ)ยฒ
m, k, kp = sp.symbols('m k k_prime', positive=True)
y1p, y2p = y1.diff(x), y2.diff(x)
T = sp.Rational(1, 2) * m * (y1p**2 + y2p**2)
V = sp.Rational(1, 2) * k * (y1**2 + y2**2) + sp.Rational(1, 2) * kp * (y1 - y2)**2
L = T - V
# ๊ฐ ๋ณ์์ ๋ํ ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ
for yi, name in [(y1, 'yโ'), (y2, 'yโ')]:
yip = yi.diff(x)
dL_dyi = sp.diff(L, yi)
dL_dyip = sp.diff(L, yip)
d_dx = sp.diff(dL_dyip, x)
eq = sp.simplify(dL_dyi - d_dx)
print(f"E-L for {name}: {eq} = 0")
5. ๊ตฌ์ ์กฐ๊ฑด์ด ์๋ ๋ณ๋ถ ๋ฌธ์ ¶
5.1 ๋ฑ์ฃผ ๊ตฌ์ (Isoperimetric Constraints)¶
๋ฒํจ์ $J[y] = \int_a^b F(x, y, y')\, dx$๋ฅผ ๋ค์ ๊ตฌ์ ์กฐ๊ฑด ํ์์ ๊ทน๊ฐํํ๋ผ:
$$K[y] = \int_a^b G(x, y, y')\, dx = \ell \quad \text{(์ฃผ์ด์ง ์์)}$$
๋ผ๊ทธ๋์ฃผ ์น์๋ฒ: ๋ณด์กฐ ๋ฒํจ์ $\bar{J} = J + \lambda K$๋ฅผ ์ ์ํ๊ณ , $\bar{F} = F + \lambda G$์ ๋ํด ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ ์ ์ฉํ๋ค:
$$\frac{\partial \bar{F}}{\partial y} - \frac{d}{dx}\frac{\partial \bar{F}}{\partial y'} = 0$$
๋ฏธ์ง์ $\lambda$๋ ๊ตฌ์ ์กฐ๊ฑด $K = \ell$๋ก ๊ฒฐ์ ๋๋ค.
5.2 ํ๋ก๋ ธ๋ฏน ๊ตฌ์ (Holonomic Constraints)¶
$g(x, y_1, y_2) = 0$ ํํ์ ๋์์ ๊ตฌ์:
$$\frac{\partial F}{\partial y_i} - \frac{d}{dx}\frac{\partial F}{\partial y_i'} + \lambda(x)\frac{\partial g}{\partial y_i} = 0$$
์ฌ๊ธฐ์ $\lambda(x)$๋ ์ ๋ง๋ค ๋ค๋ฅผ ์ ์๋ ์น์ ํจ์์ด๋ค.
5.3 ๊ตฌ์ ๋ณ๋ถ ๋ฌธ์ ์: ์ต๋ ๋ฉด์ ๊ณก์ ¶
๊ธธ์ด $L$์ด ์ฃผ์ด์ง ๊ณก์ ์๋์ ๋ฉด์ ์ ์ต๋ํํ๋ผ:
$$J[y] = \int_0^a y\, dx, \quad K[y] = \int_0^a \sqrt{1 + y'^2}\, dx = L$$
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve
def isoperimetric_circle(a, L):
"""๋ฑ์ฃผ ๋ฌธ์ : ๊ธธ์ด L, ๊ตฌ๊ฐ [0, a]์์ ์ต๋ ๋ฉด์ ๊ณก์ (์ํธ)"""
# ์ํธ: ๋ฐ์ง๋ฆ R, ์ค์ฌ (a/2, y_c)
# L = 2Rยทarcsin(a/(2R))๋ก๋ถํฐ R ๊ฒฐ์
def eq(R):
if R < a / 2:
return 1e10
return 2 * R * np.arcsin(a / (2 * R)) - L
R = fsolve(eq, L / np.pi)[0]
theta = np.linspace(-np.arcsin(a / (2 * R)), np.arcsin(a / (2 * R)), 300)
x_arc = R * np.sin(theta) + a / 2
y_arc = R * np.cos(theta) - R * np.cos(np.arcsin(a / (2 * R)))
return x_arc, y_arc, R
# ๊ตฌ๊ฐ ๊ธธ์ด 2, ๊ณก์ ๊ธธ์ด ฯ
a, L = 2.0, np.pi
x_arc, y_arc, R = isoperimetric_circle(a, L)
fig, ax = plt.subplots(figsize=(7, 5))
ax.plot(x_arc, y_arc, 'r-', linewidth=2, label=f'์ํธ (R={R:.3f})')
ax.fill_between(x_arc, 0, y_arc, alpha=0.2, color='red')
ax.axhline(y=0, color='k', linewidth=0.5)
ax.set_title('๋ฑ์ฃผ ๋ฌธ์ : ์ฃผ์ด์ง ๊ธธ์ด์์ ์ต๋ ๋ฉด์ ')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend()
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')
plt.tight_layout()
plt.savefig('isoperimetric.png', dpi=150)
plt.show()
6. ๋ผ๊ทธ๋์ฃผ ์ญํ¶
6.1 ์ต์์์ฉ ์๋ฆฌ¶
ํด๋ฐํด์ ์๋ฆฌ: ์ญํ๊ณ์ ์ค์ ์ด๋ ๊ฒฝ๋ก๋ ์์ฉ(action)์ ์ ๋ฅ(stationarize)ํ๋ ๊ฒฝ๋ก์ด๋ค.
$$S[q] = \int_{t_1}^{t_2} L(q, \dot{q}, t)\, dt, \quad \delta S = 0$$
๋ผ๊ทธ๋์ง์: $L = T - V$ (์ด๋์๋์ง - ์์น์๋์ง)
์ผ๋ฐํ ์ขํ(generalized coordinates) $q_i$: ๊ณ์ ์์ ๋๋ฅผ ๊ธฐ์ ํ๋ ๋ ๋ฆฝ ๋ณ์. ๊ตฌ์ ์กฐ๊ฑด์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๊ฐ ์ผ๋ฐํ ์ขํ์ ๋ํ ๋ผ๊ทธ๋์ฃผ ์ด๋๋ฐฉ์ ์:
$$\frac{d}{dt}\frac{\partial L}{\partial \dot{q}_i} - \frac{\partial L}{\partial q_i} = 0, \quad i = 1, 2, \ldots, n$$
6.2 ๋จ์ง์¶
์ผ๋ฐํ ์ขํ: ๊ฐ๋ $\theta$
$$T = \frac{1}{2}ml^2\dot{\theta}^2, \quad V = -mgl\cos\theta$$
$$L = \frac{1}{2}ml^2\dot{\theta}^2 + mgl\cos\theta$$
์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์: $ml^2\ddot{\theta} + mgl\sin\theta = 0$, ์ฆ $\ddot{\theta} + \frac{g}{l}\sin\theta = 0$
import sympy as sp
t = sp.Symbol('t')
m, l, g = sp.symbols('m l g', positive=True)
theta = sp.Function('theta')(t)
theta_dot = theta.diff(t)
# ๋ผ๊ทธ๋์ง์
T = sp.Rational(1, 2) * m * l**2 * theta_dot**2
V = -m * g * l * sp.cos(theta)
Lag = T - V
# ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์ ๋์ถ
dL_dtheta = sp.diff(Lag, theta)
dL_dthetadot = sp.diff(Lag, theta_dot)
d_dt = sp.diff(dL_dthetadot, t)
eq = sp.simplify(d_dt - dL_dtheta)
print("=== ๋จ์ง์ ์ด๋๋ฐฉ์ ์ ===")
print(f" {eq} = 0")
# ์ ๋ฆฌ: mlยฒฮธฬ + mglยทsin(ฮธ) = 0
6.3 ์ด์ค ์ง์¶
์ผ๋ฐํ ์ขํ: $\theta_1, \theta_2$
$$x_1 = l_1\sin\theta_1, \quad y_1 = -l_1\cos\theta_1$$
$$x_2 = l_1\sin\theta_1 + l_2\sin\theta_2, \quad y_2 = -l_1\cos\theta_1 - l_2\cos\theta_2$$
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
def double_pendulum_eom(t, state, m1, m2, l1, l2, g=9.81):
"""์ด์ค ์ง์์ ์ด๋๋ฐฉ์ ์ (๋ผ๊ทธ๋์ฃผ ์ญํ์ผ๋ก ์ ๋)
state = [theta1, theta2, omega1, omega2]
"""
th1, th2, w1, w2 = state
dth = th1 - th2
cos_d, sin_d = np.cos(dth), np.sin(dth)
M = m1 + m2
# ์ง๋ ํ๋ ฌ์ ์ญ์ ์ด์ฉํ ๊ฐ๊ฐ์๋ ๊ณ์ฐ
den = M * l1 - m2 * l1 * cos_d**2
alpha1 = (-m2 * l2 * w2**2 * sin_d
- m2 * g * np.sin(th2) * cos_d
+ M * g * np.sin(th1)) / (-den)
den2 = (l2 / l1) * den
alpha2 = (M * l1 * w1**2 * sin_d
+ M * g * np.sin(th1) * cos_d
- M * g * np.sin(th2)) / den2
return [w1, w2, alpha1, alpha2]
# ์๋ฎฌ๋ ์ด์
m1, m2, l1, l2 = 1.0, 1.0, 1.0, 1.0
state0 = [np.pi / 2, np.pi / 2, 0, 0] # ์ด๊ธฐ ๊ฐ๋ 90ยฐ, ๊ฐ์๋ 0
t_span = (0, 20)
t_eval = np.linspace(*t_span, 2000)
sol = solve_ivp(double_pendulum_eom, t_span, state0, t_eval=t_eval,
args=(m1, m2, l1, l2), method='RK45', rtol=1e-10)
# ๋ฐ์นด๋ฅดํธ ์ขํ ๋ณํ
x1 = l1 * np.sin(sol.y[0])
y1_pos = -l1 * np.cos(sol.y[0])
x2 = x1 + l2 * np.sin(sol.y[1])
y2_pos = y1_pos - l2 * np.cos(sol.y[1])
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# ๋์ ๊ถค์
axes[0].plot(x2, y2_pos, 'b-', linewidth=0.3, alpha=0.7)
axes[0].set_title('์ด์ค ์ง์: ๋์ ๊ถค์ ')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y')
axes[0].set_aspect('equal')
axes[0].grid(True, alpha=0.3)
# ๊ฐ๋ ์๊ฐ ๊ทธ๋ํ
axes[1].plot(sol.t, sol.y[0], label=r'$\theta_1$')
axes[1].plot(sol.t, sol.y[1], label=r'$\theta_2$')
axes[1].set_title('์ด์ค ์ง์: ๊ฐ๋ vs ์๊ฐ')
axes[1].set_xlabel('์๊ฐ (s)')
axes[1].set_ylabel('๊ฐ๋ (rad)')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('double_pendulum.png', dpi=150)
plt.show()
6.4 ์ค์ฌ๋ ฅ ๋ฌธ์ ¶
์ผ๋ฐํ ์ขํ: $(r, \theta)$ (๊ทน์ขํ)
$$L = \frac{1}{2}m(\dot{r}^2 + r^2\dot{\theta}^2) - V(r)$$
$\theta$๊ฐ ์ํ ์ขํ($L$์ด $\theta$์ ๋ช ์์ ์ผ๋ก ์์กดํ์ง ์์)์ด๋ฏ๋ก:
$$p_\theta = \frac{\partial L}{\partial \dot{\theta}} = mr^2\dot{\theta} = \text{const} \quad \text{(๊ฐ์ด๋๋ ๋ณด์กด)}$$
6.5 ์ ํธ์ฐ๋ ๊ธฐ๊ณ (Atwood Machine)¶
๋ ์ง๋ $m_1, m_2$๊ฐ ๋๋ฅด๋์ ์ค๋ก ์ฐ๊ฒฐ๋์ด ์๋ค. ์ผ๋ฐํ ์ขํ: $x$ (ํ ์ชฝ ์ง๋์ ๋ณ์).
$$T = \frac{1}{2}(m_1 + m_2)\dot{x}^2, \quad V = -(m_1 - m_2)gx$$
$$L = \frac{1}{2}(m_1 + m_2)\dot{x}^2 + (m_1 - m_2)gx$$
์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์: $(m_1 + m_2)\ddot{x} = (m_1 - m_2)g$, ์ฆ $\ddot{x} = \frac{m_1 - m_2}{m_1 + m_2}g$
6.6 ๋ํฐ ์ ๋ฆฌ (Noether's Theorem)¶
๋ผ๊ทธ๋์ง์์ด ์ด๋ค ์ฐ์ ๋ณํ์ ๋ํด ๋ถ๋ณ์ด๋ฉด, ๊ทธ์ ๋์ํ๋ ๋ณด์กด๋์ด ์กด์ฌํ๋ค:
| ๋์นญ (๋ณํ) | ๋ณด์กด๋ |
|---|---|
| ์๊ฐ ๋ณ์ง ($t \to t + \epsilon$) | ์๋์ง |
| ๊ณต๊ฐ ๋ณ์ง ($x \to x + \epsilon$) | ์ด๋๋ |
| ํ์ ($\theta \to \theta + \epsilon$) | ๊ฐ์ด๋๋ |
7. ํด๋ฐํด ์ญํ ๊ธฐ์ด¶
7.1 ๋ฅด์ฅ๋๋ฅด ๋ณํ¶
๋ผ๊ทธ๋์ง์ $L(q, \dot{q}, t)$์์ ํด๋ฐํ ๋์ $H(q, p, t)$์ผ๋ก์ ๋ณํ:
์ผ๋ฐํ ์ด๋๋: $p_i = \frac{\partial L}{\partial \dot{q}_i}$
$$\boxed{H(q, p, t) = \sum_i p_i \dot{q}_i - L(q, \dot{q}, t)}$$
์ฌ๊ธฐ์ $\dot{q}_i$๋ $p_i = \partial L / \partial \dot{q}_i$๋ฅผ ์ญ์ผ๋ก ํ์ด $q, p$๋ก ํํํ๋ค.
๋ณด์กด๊ณ(์๊ฐ ๋ ๋ฆฝ)์์ $H = T + V$ (์ ์ฒด ์๋์ง)์ด๋ค.
7.2 ํด๋ฐํด์ ์ ์ค ๋ฐฉ์ ์¶
$$\boxed{\dot{q}_i = \frac{\partial H}{\partial p_i}, \quad \dot{p}_i = -\frac{\partial H}{\partial q_i}}$$
๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ด $n$๊ฐ์ 2์ฐจ ODE์ธ ๋ฐ๋ฉด, ํด๋ฐํด ๋ฐฉ์ ์์ $2n$๊ฐ์ 1์ฐจ ODE์ด๋ค.
7.3 ์์ ๊ณต๊ฐ๊ณผ ํธ์์ก ๊ดํธ¶
์์ ๊ณต๊ฐ(phase space): $(q_1, \ldots, q_n, p_1, \ldots, p_n)$๋ก ์ด๋ฃจ์ด์ง $2n$์ฐจ์ ๊ณต๊ฐ.
ํธ์์ก ๊ดํธ:
$$\{A, B\} = \sum_i \left(\frac{\partial A}{\partial q_i}\frac{\partial B}{\partial p_i} - \frac{\partial A}{\partial p_i}\frac{\partial B}{\partial q_i}\right)$$
์๊ฐ ๋ฐ์ : $\dot{A} = \{A, H\} + \frac{\partial A}{\partial t}$. ๋ณด์กด๋์ด๋ฉด $\{A, H\} = 0$.
7.4 ์์์ญํ๊ณผ์ ์ฐ๊ฒฐ¶
์์์ญํ์์ ํธ์์ก ๊ดํธ๋ ๊ตํ์๋ก ๋์ฒด๋๋ค:
$$\{A, B\}_{\text{Poisson}} \to \frac{1}{i\hbar}[\hat{A}, \hat{B}]$$
์ ์ค ๊ตํ ๊ด๊ณ $\{q, p\} = 1$์ ์์์ญํ์ $[\hat{q}, \hat{p}] = i\hbar$์ ๋์ํ๋ค. ์ด๊ฒ์ด ์ ์ค ์์ํ(canonical quantization)์ ์ถ๋ฐ์ ์ด๋ค.
import sympy as sp
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
# === ์ฌ๋ณผ๋ฆญ: 1์ฐจ์ ์กฐํ์ง๋์์ ํด๋ฐํด ์ญํ ===
t = sp.Symbol('t')
m_sym, k_sym = sp.symbols('m k', positive=True)
q_sym = sp.Function('q')(t)
p_sym = sp.Function('p')(t)
# ํด๋ฐํ ๋์: H = pยฒ/(2m) + kqยฒ/2
H = p_sym**2 / (2 * m_sym) + k_sym * q_sym**2 / 2
# ํด๋ฐํด์ ์ ์ค ๋ฐฉ์ ์
q_dot = sp.diff(H, p_sym) # dq/dt = โH/โp = p/m
p_dot = -sp.diff(H, q_sym) # dp/dt = -โH/โq = -kq
print("=== ์กฐํ์ง๋์ ํด๋ฐํด ๋ฐฉ์ ์ ===")
print(f" dq/dt = {q_dot}")
print(f" dp/dt = {p_dot}")
# === ์์น ํด: ์์ ๊ณต๊ฐ ๊ถค์ ===
def harmonic_hamiltonian(t, state, m=1.0, k=1.0):
q, p = state
dqdt = p / m # โH/โp
dpdt = -k * q # -โH/โq
return [dqdt, dpdt]
# ์ฌ๋ฌ ์ด๊ธฐ ์กฐ๊ฑด์ผ๋ก ์์ ๊ณต๊ฐ ๊ถค์
fig, ax = plt.subplots(figsize=(7, 7))
for E0 in [0.5, 1.0, 2.0, 4.0]:
q0 = np.sqrt(2 * E0) # p0 = 0์ผ ๋ ์ต๋ ๋ณ์
sol = solve_ivp(harmonic_hamiltonian, (0, 10), [q0, 0],
t_eval=np.linspace(0, 10, 1000))
ax.plot(sol.y[0], sol.y[1], label=f'E = {E0}')
ax.set_xlabel('q (์์น)')
ax.set_ylabel('p (์ด๋๋)')
ax.set_title('์กฐํ์ง๋์ ์์ ๊ณต๊ฐ')
ax.legend()
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')
plt.tight_layout()
plt.savefig('phase_space.png', dpi=150)
plt.show()
8. ๋ณ๋ถ๋ฒ์ ํ๋์ ์์ฉ¶
8.1 ํ๋ฅด๋ง ์๋ฆฌ (๊ดํ)¶
๋น์ ๋ ์ ์ฌ์ด๋ฅผ ๊ดํ ๊ฒฝ๋ก ๊ธธ์ด๊ฐ ์ ๋ฅ(stationary)์ธ ๊ฒฝ๋ก๋ก ์งํํ๋ค:
$$\delta \int_A^B n(x, y)\, ds = 0$$
์ฌ๊ธฐ์ $n$์ ๊ตด์ ๋ฅ . ์ด๋ก๋ถํฐ ์ค๋ฌ์ ๋ฒ์น์ด ๋์ถ๋๋ค:
$$n_1 \sin\theta_1 = n_2 \sin\theta_2$$
import numpy as np
import matplotlib.pyplot as plt
def snell_law_demo():
"""ํ๋ฅด๋ง ์๋ฆฌ์ ์ค๋ฌ์ ๋ฒ์น ์๊ฐํ"""
n1, n2 = 1.0, 1.5 # ๊ตด์ ๋ฅ (๊ณต๊ธฐ โ ์ ๋ฆฌ)
y_source, y_target = 2.0, -2.0
x_source, x_target = -1.0, 1.5
# ๊ฒฝ๊ณ๋ฉด์์์ ์
์ฌ์ x๋ฅผ ๋ณํ์ํค๋ฉฐ ๊ดํ ๊ฒฝ๋ก ๊ธธ์ด ๊ณ์ฐ
x_boundary = np.linspace(-2, 3, 1000)
optical_path = []
for xb in x_boundary:
d1 = np.sqrt((xb - x_source)**2 + y_source**2)
d2 = np.sqrt((x_target - xb)**2 + y_target**2)
opl = n1 * d1 + n2 * d2
optical_path.append(opl)
optical_path = np.array(optical_path)
x_opt = x_boundary[np.argmin(optical_path)]
fig, axes = plt.subplots(1, 2, figsize=(13, 5))
# (a) ๊ดํ ๊ฒฝ๋ก ๊ธธ์ด vs ์
์ฌ์
axes[0].plot(x_boundary, optical_path, 'b-')
axes[0].axvline(x_opt, color='r', linestyle='--', label=f'์ต์์ x={x_opt:.3f}')
axes[0].set_xlabel('๊ฒฝ๊ณ๋ฉด ์
์ฌ์ x')
axes[0].set_ylabel('๊ดํ ๊ฒฝ๋ก ๊ธธ์ด')
axes[0].set_title('ํ๋ฅด๋ง ์๋ฆฌ: ๊ดํ ๊ฒฝ๋ก ๊ธธ์ด ์ต์ํ')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# (b) ๋น์ ๊ฒฝ๋ก
axes[1].fill_between([-3, 4], 0, 3, alpha=0.1, color='blue', label=f'๋งค์ง 1 (n={n1})')
axes[1].fill_between([-3, 4], -3, 0, alpha=0.1, color='orange', label=f'๋งค์ง 2 (n={n2})')
axes[1].plot([x_source, x_opt], [y_source, 0], 'r-', linewidth=2)
axes[1].plot([x_opt, x_target], [0, y_target], 'r-', linewidth=2)
axes[1].axhline(y=0, color='k', linewidth=1)
axes[1].plot(x_source, y_source, 'ko', markersize=8)
axes[1].plot(x_target, y_target, 'ko', markersize=8)
axes[1].set_title('์ค๋ฌ์ ๋ฒ์น (ํ๋ฅด๋ง ์๋ฆฌ)')
axes[1].set_xlabel('x')
axes[1].set_ylabel('y')
axes[1].legend()
axes[1].grid(True, alpha=0.3)
axes[1].set_aspect('equal')
plt.tight_layout()
plt.savefig('fermat_snell.png', dpi=150)
plt.show()
# ์ค๋ฌ์ ๋ฒ์น ๊ฒ์ฆ
theta1 = np.arctan2(abs(x_opt - x_source), y_source)
theta2 = np.arctan2(abs(x_target - x_opt), abs(y_target))
print(f"์
์ฌ๊ฐ: {np.degrees(theta1):.2f}ยฐ, ๊ตด์ ๊ฐ: {np.degrees(theta2):.2f}ยฐ")
print(f"nโ sin ฮธโ = {n1 * np.sin(theta1):.4f}")
print(f"nโ sin ฮธโ = {n2 * np.sin(theta2):.4f}")
snell_law_demo()
8.2 ๋ ์ผ๋ฆฌ-๋ฆฌ์ธ ๋ฐฉ๋ฒ (Rayleigh-Ritz Method)¶
๋ณ๋ถ ๋ฌธ์ ์ ๊ทผ์ฌํด๋ฅผ ๊ตฌํ๋ ์ง์ ๋ฒ(direct method). ํด๋ฅผ ๊ธฐ์ ํจ์์ ์ ํ ๊ฒฐํฉ์ผ๋ก ๊ฐ์ ํ๋ค:
$$y(x) \approx \sum_{i=1}^{N} c_i \phi_i(x)$$
๋ฒํจ์๋ฅผ $c_i$์ ํจ์๋ก ๋ฐ๊พธ๊ณ , $\partial J / \partial c_i = 0$์ ํ์ด ๊ณ์๋ฅผ ๊ฒฐ์ ํ๋ค.
import numpy as np
import matplotlib.pyplot as plt
def rayleigh_ritz_beam(N_basis=5, L_beam=1.0, q0=1.0, EI=1.0):
"""
๋ ์ผ๋ฆฌ-๋ฆฌ์ธ ๋ฒ์ผ๋ก ๋จ์ ์ง์ง ๋ณด์ ์ฒ์ง ๊ณ์ฐ
๋ฒํจ์: J[y] = โซ[EI/2ยท(y'')ยฒ - qโยทy]dx
๊ฒฝ๊ณ์กฐ๊ฑด: y(0) = y(L) = 0, y''(0) = y''(L) = 0
๊ธฐ์ ํจ์: ฯโ(x) = sin(nฯx/L)
"""
x = np.linspace(0, L_beam, 500)
# ์ ํํด: y = qโ/(24EI) ยท x(Lยณ - 2Lxยฒ + xยณ)
y_exact = q0 / (24 * EI) * x * (L_beam**3 - 2 * L_beam * x**2 + x**3)
# ๋ ์ผ๋ฆฌ-๋ฆฌ์ธ ๊ทผ์ฌ
y_approx = np.zeros_like(x)
coefficients = []
for n in range(1, N_basis + 1):
kn = n * np.pi / L_beam
# ๊ฐ์ฑ ํ๋ ฌ ๋๊ฐ ์ฑ๋ถ
K_nn = EI * kn**4 * L_beam / 2
# ํ์ค ๋ฒกํฐ: ํ์ n๋ง ๊ธฐ์ฌ
if n % 2 == 1:
f_n = 2 * q0 * L_beam / (n * np.pi)
else:
f_n = 0
c_n = f_n / K_nn
coefficients.append(c_n)
y_approx += c_n * np.sin(n * np.pi * x / L_beam)
# ๊ทธ๋ํ
fig, axes = plt.subplots(1, 2, figsize=(13, 5))
# ์ฒ์ง ๋น๊ต
axes[0].plot(x, y_exact, 'r-', linewidth=2, label='์ ํํด')
axes[0].plot(x, y_approx, 'b--', linewidth=2, label=f'R-R ({N_basis}ํญ)')
axes[0].set_title('๋ ์ผ๋ฆฌ-๋ฆฌ์ธ ๋ฒ: ๋ณด์ ์ฒ์ง')
axes[0].set_xlabel('x')
axes[0].set_ylabel('y(x)')
axes[0].legend()
axes[0].grid(True, alpha=0.3)
# ์๋ ด ๋ถ์
errors = []
N_range = range(1, 20)
for N in N_range:
y_rr = np.zeros_like(x)
for n in range(1, N + 1):
kn = n * np.pi / L_beam
K_nn = EI * kn**4 * L_beam / 2
f_n = 2 * q0 * L_beam / (n * np.pi) if n % 2 == 1 else 0
y_rr += (f_n / K_nn) * np.sin(n * np.pi * x / L_beam)
err = np.max(np.abs(y_rr - y_exact))
errors.append(err)
axes[1].semilogy(list(N_range), errors, 'ko-')
axes[1].set_title('๊ธฐ์ ํจ์ ์์ ๋ฐ๋ฅธ ์ค์ฐจ ์๋ ด')
axes[1].set_xlabel('๊ธฐ์ ํจ์ ์ N')
axes[1].set_ylabel('์ต๋ ์ค์ฐจ')
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('rayleigh_ritz.png', dpi=150)
plt.show()
return coefficients
coeffs = rayleigh_ritz_beam(N_basis=7)
print("๋ ์ผ๋ฆฌ-๋ฆฌ์ธ ๊ณ์:", [f"{c:.6e}" for c in coeffs])
8.3 ์ต์ ์ ์ด ์ด๋ก (๊ฐ์)¶
๋ฌธ์ : ์ํ $\mathbf{x}(t)$์ ์ ์ด $\mathbf{u}(t)$์ ๋ํด ๋น์ฉ ๋ฒํจ์๋ฅผ ์ต์ํ:
$$J = \int_{t_0}^{t_f} L(\mathbf{x}, \mathbf{u}, t)\, dt$$
๊ตฌ์: $\dot{\mathbf{x}} = \mathbf{f}(\mathbf{x}, \mathbf{u}, t)$ (์ํ ๋ฐฉ์ ์)
ํฐํธ๋ด๊ธด์ ์ต๋ ์๋ฆฌ: ํด๋ฐํ ๋์ $H = L + \boldsymbol{\lambda}^T \mathbf{f}$๋ฅผ ์ ์ํ๊ณ , $H$๋ฅผ $\mathbf{u}$์ ๋ํด ์ต์ํํ๋ ๊ฒ์ด ์ต์ ์ ์ด์ด๋ค.
8.4 ์ ํ์์๋ฒ๊ณผ์ ์ฐ๊ฒฐ¶
๋ณ๋ถ ๋ฌธ์ ์ ์ฝํ(weak form)์ ์ ํ์์๋ฒ(FEM)์ ์ถ๋ฐ์ ์ด๋ค. ๋๋ฆฌํด๋ ๋ฌธ์ :
$$\text{์ต์ํ: } J[u] = \frac{1}{2}\int_\Omega |\nabla u|^2\, d\Omega - \int_\Omega fu\, d\Omega$$
์ ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ $-\nabla^2 u = f$ (ํฌ์์ก ๋ฐฉ์ ์)์ด๋ค. FEM์ ์ด ๋ณ๋ถ ๋ฌธ์ ๋ฅผ ์ ํ ์ฐจ์ ๊ธฐ์ ํจ์๋ก ์ด์ฐํํ์ฌ ๊ทผ์ฌ ํด๋ฅผ ๊ตฌํ๋ค.
์ฐ์ต ๋ฌธ์ ¶
๊ธฐ์ด ๋ฌธ์ ¶
- ๋ค์ ๋ฒํจ์์ ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ ๊ตฌํ๋ผ:
- (a) $J[y] = \int_0^1 (y'^2 + 2yy')\, dx$, $y(0)=0$, $y(1)=1$
- (b) $J[y] = \int_0^{\pi} (y'^2 - y^2)\, dx$, $y(0)=0$, $y(\pi)=0$
-
(c) $J[y] = \int_1^2 \frac{\sqrt{1 + y'^2}}{x}\, dx$
-
๋ฒจํธ๋ผ๋ฏธ ํญ๋ฑ์์ ์ด์ฉํ์ฌ $J[y] = \int_0^1 (y'^2 + y^2)\, dx$์ ๊ทน๊ฐ ๊ณก์ ์ ๊ตฌํ๋ผ. ($y(0)=0$, $y(1)=1$)
-
ํธ์ ๊ธธ์ด $L$์ด ์ฃผ์ด์ง ๋ ์ $(0, 0)$, $(a, 0)$์ ์๋ ๊ณก์ ์ค $x$์ถ๊ณผ์ ๋ฉด์ ์ด ์ต๋์ธ ๊ณก์ ์ ๊ตฌํ๋ผ.
์ค๊ธ ๋ฌธ์ ¶
-
๊ตฌ๋ฉด ์์ ์ธก์ง์ ์ด ๋์์์ ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ผ๋ก ์ฆ๋ช ํ๋ผ. (ํํธ: $\phi$๋ฅผ ๋ ๋ฆฝ๋ณ์๋ก ์ฌ์ฉ)
-
์ต์ ๊ฐํ์ : ์ $(0, 0)$์์ $(1, 1)$๊น์ง์ ์ฌ์ดํด๋ก์ด๋๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ตฌํ๊ณ , ์ด๋ ์๊ฐ์ ์ง์ ๊ฒฝ๋ก์ ๋น๊ตํ๋ผ.
-
์ด์ค ์ง์์ ๋ผ๊ทธ๋์ง์์ ๊ตฌํ๊ณ , $\theta_1$, $\theta_2$์ ๋ํ ์ด๋๋ฐฉ์ ์์ ์ ๋ํ๋ผ.
-
1์ฐจ์ ์กฐํ์ง๋์ $L = \frac{1}{2}m\dot{x}^2 - \frac{1}{2}kx^2$์ ๋ํด:
- (a) ๋ผ๊ทธ๋์ฃผ ์ด๋๋ฐฉ์ ์์ ๊ตฌํ๋ผ
- (b) ํด๋ฐํ ๋์์ผ๋ก ๋ณํํ๋ผ
- (c) ํด๋ฐํด์ ์ ์ค ๋ฐฉ์ ์์ด (a)์ ๊ฒฐ๊ณผ์ ์ผ์นํจ์ ๋ณด์ฌ๋ผ
์ฌํ ๋ฌธ์ ¶
-
ํ์ฑ ๋น: ์บํธ๋ ๋ฒ ๋น์ ๊ตฝํ์ $J[y] = \int_0^L \left[\frac{EI}{2}(y'')^2 - qy\right] dx$๋ก ๋ชจ๋ธ๋งํ๋ผ. ๊ฒฝ๊ณ์กฐ๊ฑด $y(0) = y'(0) = 0$, $y''(L) = y'''(L) = 0$์์ ํด๋ฅผ ๊ตฌํ๋ผ.
-
์ ๊ธฐ์ฅ์ ๋ณ๋ถ ์๋ฆฌ: ์ ํ ๋ถํฌ $\rho(\mathbf{r})$๊ฐ ์ฃผ์ด์ง ๋, ๋ฒํจ์ $J[\phi] = \int \left[\frac{\epsilon_0}{2}|\nabla\phi|^2 + \rho\phi\right] d^3r$์ ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์์ด ํฌ์์ก ๋ฐฉ์ ์์์ ๋ณด์ฌ๋ผ.
-
๋ ์ผ๋ฆฌ-๋ฆฌ์ธ ๋ฒ์ผ๋ก $y'' + y = 1$ ($y(0) = y(\pi) = 0$)์ ๊ทผ์ฌํด๋ฅผ $y \approx c_1\sin x + c_2\sin 2x + c_3\sin 3x$๋ก ๊ตฌํ๊ณ , ์ ํํด์ ๋น๊ตํ๋ผ.
์ฌํ ํ์ต¶
์ 2๋ณ๋ถ๊ณผ ์ถฉ๋ถ ์กฐ๊ฑด¶
์ 1๋ณ๋ถ $\delta J = 0$์ ํ์ ์กฐ๊ฑด์ด๋ค. ์ค์ ๋ก ๊ทน์์ธ์ง ํ์ธํ๋ ค๋ฉด ์ 2๋ณ๋ถ์ ์กฐ์ฌํ๋ค:
$$\delta^2 J = \int_a^b \left(P\eta^2 + Q\eta'^2\right) dx$$
์ฌ๊ธฐ์ $P = F_{yy} - \frac{d}{dx}F_{yy'}$, $Q = F_{y'y'}$. $\delta^2 J > 0$์ด๋ฉด ๊ทน์, $\delta^2 J < 0$์ด๋ฉด ๊ทน๋.
๋ฅด์ฅ๋๋ฅด ์กฐ๊ฑด: $F_{y'y'} > 0$์ด๋ฉด ์ฝํ ๊ทน์์ ํ์ ์กฐ๊ฑด.
์ผ์ฝ๋น ์กฐ๊ฑด: ์ผ์ฝ๋น ๋ฐฉ์ ์ $(Q\eta')' - P\eta = 0$์ ํด๊ฐ ๊ตฌ๊ฐ $(a, b)$์์ ์์ ์ ๊ฐ์ง ์์ผ๋ฉด ๊ฐํ ๊ทน์์ ์ถฉ๋ถ ์กฐ๊ฑด.
์ง์ ๋ฒ¶
- ๋ฆฌ์ธ ๋ฒ (Ritz method): ๋ฒํจ์๋ฅผ ์ ํ ์ฐจ์ ๋ถ๋ถ๊ณต๊ฐ์์ ์ต์ํ
- ๊ฐ๋ ๋ฅดํจ๋ฒ (Galerkin method): ์์ฐจ(residual)๋ฅผ ์ํํจ์์ ์ง๊ตํ๊ฒ ์ค์
- ์ ํ์์๋ฒ (FEM): ๊ตฌ๊ฐ๋ณ(piecewise) ๊ธฐ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฆฌ์ธ /๊ฐ๋ ๋ฅดํจ๋ฒ
๋ณ๋ถ ๋ถ๋ฑ์¶
๊ตฌ์ $y(x) \geq \psi(x)$ (์ฅ์ ๋ฌผ ๋ฌธ์ ) ๋ฑ, ๋ฑํธ๊ฐ ์๋ ๋ถ๋ฑํธ ์กฐ๊ฑด์ด ์๋ ๋ฌธ์ . ์์ ๊ฒฝ๊ณ ๋ฌธ์ ์ ๋ฐ์ ํ ๊ด๋ จ๋๋ค.
์ฐธ๊ณ ๋ฌธํ¶
- Boas, M. L. Mathematical Methods in the Physical Sciences, 3rd ed., Ch. 9
- Gelfand, I. M. & Fomin, S. V. Calculus of Variations (Dover) -- ๋ณ๋ถ๋ฒ์ ๊ณ ์ ์ ๊ต๊ณผ์
- Goldstein, Poole, Safko Classical Mechanics, 3rd ed. -- ๋ผ๊ทธ๋์ฃผ/ํด๋ฐํด ์ญํ
- Lanczos, C. The Variational Principles of Mechanics (Dover) -- ๋ณ๋ถ ์๋ฆฌ์ ๋ฌผ๋ฆฌํ์ ํด์
- Arfken, Weber Mathematical Methods for Physicists, 7th ed., Ch. 22
ํต์ฌ ๊ณต์ ์์ฝ¶
| ๊ณต์ | ์ค๋ช |
|---|---|
| $\frac{\partial F}{\partial y} - \frac{d}{dx}\frac{\partial F}{\partial y'} = 0$ | ์ค์ผ๋ฌ-๋ผ๊ทธ๋์ฃผ ๋ฐฉ์ ์ |
| $F - y'F_{y'} = C$ | ๋ฒจํธ๋ผ๋ฏธ ํญ๋ฑ์ ($F$๊ฐ $x$์ ๋ฌด๊ด) |
| $F_{y'} = C$ | $F$๊ฐ $y$์ ๋ฌด๊ดํ ๊ฒฝ์ฐ |
| $\frac{d}{dt}\frac{\partial L}{\partial \dot{q}} - \frac{\partial L}{\partial q} = 0$ | ๋ผ๊ทธ๋์ฃผ ์ด๋๋ฐฉ์ ์ |
| $H = \sum p_i\dot{q}_i - L$ | ํด๋ฐํ ๋์ ์ ์ |
| $\dot{q} = \partial H/\partial p$, $\dot{p} = -\partial H/\partial q$ | ํด๋ฐํด ์ ์ค ๋ฐฉ์ ์ |
| $x = R(\theta - \sin\theta)$, $y = R(1-\cos\theta)$ | ์ฌ์ดํด๋ก์ด๋ (์ต์ ๊ฐํ์ ) |
์ด์ : 16. ๊ทธ๋ฆฐ ํจ์ ๋ค์: 18. ํ ์ ํด์