{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Praktikum Komputasi 2: Simulasi Transien Rangkaian RLC Seri (Julia)\n",
    "\n",
    "Selamat datang di modul simulasi komputasi untuk **Persamaan Diferensial Orde 2** pada aplikasi rangkaian RLC seri.\n",
    "\n",
    "## 📌 Pemodelan Rangkaian\n",
    "Berdasarkan Hukum Tegangan Kirchhoff (KVL) pada rangkaian RLC seri tanpa sumber tegangan luar (respons alami / *zero-input response*):\n",
    "$$ L \\frac{d^2i}{dt^2} + R \\frac{di}{dt} + \\frac{1}{C} i = 0 $$\n",
    "\n",
    "Dengan mendefinisikan koefisien redaman $\\alpha$ dan frekuensi sudut natural $\\omega_0$:\n",
    "$$ \\alpha = \\frac{R}{2L}, \\quad \\omega_0 = \\frac{1}{\\sqrt{LC}} $$\n",
    "\n",
    "Klasifikasi respons:\n",
    "1. **Underdamped (Kurang Redam):** $\\alpha < \\omega_0$ (Arus berosilasi sambil meluruh secara eksponensial)\n",
    "2. **Critically Damped (Redam Kritis):** $\\alpha = \\omega_0$ (Arus kembali ke nol paling cepat tanpa berosilasi)\n",
    "3. **Overdamped (Lebih Redam):** $\\alpha > \\omega_0$ (Arus meluruh lambat menuju nol tanpa osilasi)\n",
    "\n",
    "Di sini kita akan memecah PDB orde 2 menjadi sistem 2 PDB orde 1 dan menyelesaikannya secara numerik menggunakan Julia."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "using Plots"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Reduksi Orde PDB ke Sistem Orde 1\n",
    "Misalkan variabel keadaan (state variables):\n",
    "$$ x_1 = i(t), \\quad x_2 = \\frac{di}{dt} $$\n",
    "\n",
    "Sistem persamaan diferensial orde 1:\n",
    "$$ \\frac{dx_1}{dt} = x_2 $$\n",
    "$$ \\frac{dx_2}{dt} = -\\frac{R}{L}x_2 - \\frac{1}{LC}x_1 $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Parameter Rangkaian\n",
    "L = 1.0       # Induktansi (Henry)\n",
    "C = 0.01      # Kapasitansi (Farad)\n",
    "omega_0 = 1.0 / sqrt(L * C) # Frekuensi natural = 10 rad/s\n",
    "\n",
    "# Nilai R untuk 3 skenario redaman\n",
    "R_under = 4.0    # alpha = 2 < 10 (Underdamped)\n",
    "R_crit  = 20.0   # alpha = 10 = 10 (Critically Damped)\n",
    "R_over  = 50.0   # alpha = 25 > 10 (Overdamped)\n",
    "\n",
    "println(\"Frekuensi sudut natural ω₀ = $omega_0 rad/s\")\n",
    "println(\"R Kritis = $(2 * L * omega_0) Ω\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Implementasi Numerik (Metode Runge-Kutta Orde 4 / RK4)\n",
    "Metode RK4 memberikan akurasi yang jauh lebih tinggi daripada metode Euler untuk sistem osilasi orde 2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "function solve_rlc_rk4(R, L, C, i0, didt0, t_max, dt)\n",
    "    t_vec = 0.0:dt:t_max\n",
    "    N = length(t_vec)\n",
    "    \n",
    "    # State: x[1] = i, x[2] = di/dt\n",
    "    x = zeros(2, N)\n",
    "    x[:, 1] = [i0, didt0]\n",
    "    \n",
    "    # Turunan: dx/dt = f(x)\n",
    "    function f(state)\n",
    "        i_val, didt_val = state[1], state[2]\n",
    "        return [didt_val, -(R/L)*didt_val - (1.0/(L*C))*i_val]\n",
    "    end\n",
    "    \n",
    "    for k in 1:(N-1)\n",
    "        k1 = f(x[:, k])\n",
    "        k2 = f(x[:, k] + 0.5 * dt * k1)\n",
    "        k3 = f(x[:, k] + 0.5 * dt * k2)\n",
    "        k4 = f(x[:, k] + dt * k3)\n",
    "        \n",
    "        x[:, k+1] = x[:, k] + (dt / 6.0) * (k1 + 2*k2 + 2*k3 + k4)\n",
    "    end\n",
    "    \n",
    "    return t_vec, x[1, :]\n",
    "end\n",
    "\n",
    "# Simulasi 3 kondisi\n",
    "t_max = 1.5\n",
    "dt = 0.001\n",
    "i0 = 0.0       # Arus awal 0 A\n",
    "didt0 = 10.0   # Laju perubahan awal 10 A/s (akibat tegangan awal kapasitor)\n",
    "\n",
    "t_arr, i_under = solve_rlc_rk4(R_under, L, C, i0, didt0, t_max, dt)\n",
    "_,     i_crit  = solve_rlc_rk4(R_crit,  L, C, i0, didt0, t_max, dt)\n",
    "_,     i_over  = solve_rlc_rk4(R_over,  L, C, i0, didt0, t_max, dt)\n",
    "\n",
    "# Plot perbandingan ketiga respon\n",
    "plot(t_arr, i_under, label=\"Underdamped (R = 4 Ω)\", lw=2.5, color=:blue, xlabel=\"Waktu (detik)\", ylabel=\"Arus i(t) [Ampere]\")\n",
    "plot!(t_arr, i_crit,  label=\"Critically Damped (R = 20 Ω)\", lw=2.5, color=:green)\n",
    "plot!(t_arr, i_over,  label=\"Overdamped (R = 50 Ω)\", lw=2.5, color=:red)\n",
    "hline!([0], color=:black, ls=:dash, label=\"\")\n",
    "title!(\"Perbandingan Respons Transien RLC Seri (Julia RK4)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Penyelesaian Menggunakan SciML (DifferentialEquations.jl)\n",
    "Mari kita selesaikan kasus yang sama menggunakan pustaka standar industri `DifferentialEquations.jl`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "using DifferentialEquations\n",
    "\n",
    "# Definisikan PDB dalam format SciML: f(du, u, p, t)\n",
    "# u[1] = i, u[2] = di/dt\n",
    "# p = [R, L, C]\n",
    "function rlc_ode!(du, u, p, t)\n",
    "    R, L, C = p\n",
    "    du[1] = u[2]\n",
    "    du[2] = -(R/L)*u[2] - (1.0/(L*C))*u[1]\n",
    "end\n",
    "\n",
    "u0 = [0.0, 10.0]\n",
    "tspan = (0.0, 1.5)\n",
    "params = [R_under, L, C]\n",
    "\n",
    "prob = ODEProblem(rlc_ode!, u0, tspan, params)\n",
    "sol = solve(prob, Tsit5(), reltol=1e-6, abstol=1e-6)\n",
    "\n",
    "# Plot arus i(t)\n",
    "plot(sol, vars=(0, 1), label=\"Arus i(t) - SciML Tsit5\", lw=2, color=:purple, xlabel=\"Waktu (detik)\", ylabel=\"Arus (A)\")\n",
    "title!(\"Solusi Adaptif RLC Seri dengan Tsit5()\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Tugas Eksplorasi Mahasiswa\n",
    "1. **Analisis Frekuensi:** Pada kasus *underdamped*, hitung secara analitik frekuensi osilasi teredam $\\omega_d = \\sqrt{\\omega_0^2 - \\alpha^2}$. Cocokkan periodenya ($T = 2\\pi / \\omega_d$) dengan jarak puncak ke puncak pada grafik!\n",
    "2. **PDB Non-Homogen:** Ubahlah fungsi diferensial dengan menambahkan tegangan generator sinusoidal $V(t) = 10 \\sin(10t)$. Amati fenomena resonansi yang terjadi ketika frekuensi sumber mendekati frekuensi natural $\\omega_0$!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Julia 1.10",
   "language": "julia",
   "name": "julia-1.10"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
