1. 선수 지식

(1) ODE & Euler Discretization

$$ \frac{dz(t)}{dt} = 2t \iff z(t) = t^2 $$

image.png

image.png

def ode_solve(init_z0, start_t0, end_t1, func, method='euler'):
    if method == 'euler':
        return apply_euler_discretization(init_z0, start_t0, end_t1, func)
    else:
        raise ValueError(f"Unknown method: {method}")

def apply_euler_discretization(z0, t0, t1, deriv_at_t):
    n_steps = 20
    step_size = (t1 - t0) / n_steps

    z = z0
    t = t0
    z_values = [z0]
    t_values = [t0]
    for i in range(n_steps):
        z += step_size * deriv_at_t(z, t)
        t += step_size

        z_values.append(z)
        t_values.append(t)

    return z_values, t_values

# 파라미터 설정
z0 = 1       # 초기 조건 z(0) = 1
t0 = 0       # 초기 시간 t = 0
t1 = 5       # 종단 시간 t = 5

# 결과 시각화(Euler method에 입력되는 function은 f(z, t))
z_values, t_values = apply_euler_discretization(z0, t0, t1, lambda z, t: z)

plt.plot(t_values, z_values, label="Euler Approximation", marker='o')
plt.xlabel("t")
plt.ylabel("z(t)")
plt.title("Euler Method Approximation of dz/dt = 2t <-> z = t^2")
plt.legend()
plt.grid(True)
plt.show()

image.png

(2) Normalizing Flow

image.png

2. 아이디어

$$ z_{t+1} = z_t + f(z_t, \theta) $$

$$ g(t+ h) = g_t + h \frac{dg(t)}{dt} $$