Jump to content

Step 1: Konveksi linear 1-D

From Haidhi Wiki
Revision as of 08:49, 19 July 2026 by SanzSkuy (talk | contribs) (Created page with "'''Konveksi linear 1-D''' adalah PDE paling sederhana yang bisa dipakai buat belajar fondasi CFD. Persamaan ini memodelkan gelombang yang merambat dengan kecepatan konstan tanpa berubah bentuk. Walaupun kelihatan remeh, hampir semua ide inti CFD — diskritisasi, time-stepping, stabilitas, numerical diffusion — udah muncul di sini. == Persamaan == <math>\frac{\partial u}{\partial t} + c \frac{\partial u}{\partial x} = 0</math> {| class="wikitable" ! Simbol !! Ar...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Konveksi linear 1-D adalah PDE paling sederhana yang bisa dipakai buat belajar fondasi CFD. Persamaan ini memodelkan gelombang yang merambat dengan kecepatan konstan tanpa berubah bentuk. Walaupun kelihatan remeh, hampir semua ide inti CFD — diskritisasi, time-stepping, stabilitas, numerical diffusion — udah muncul di sini.

Persamaan

∂u∂t+c∂u∂x=0

Simbol Arti Analogi
u(x,t) besaran yang diangkut (mis. konsentrasi) tinggi air / asap di angin
c kecepatan rambat (konstan) kecepatan angin
∂u/∂t laju perubahan di satu titik seiring waktu "seberapa cepat berubah sambil gua diem nunggu"
∂u/∂x kemiringan spasial "beda gua dengan sensor sebelah"

Cara baca (disusun ulang): ∂u/∂t=−c∂u/∂x → perubahan terhadap waktu di suatu titik ditentukan oleh kemiringan spasial di titik itu, dikali kecepatan. Informasi datang dari arah hulu (upstream).

Solusi eksak

Dengan kondisi awal u(x,0)=u0(x):

u(x,t)=u0(x−ct)

Artinya: bentuk awal digeser ke kanan sejauh ct, tanpa berubah bentuk. Puncak yang awalnya di x=5 pada waktu t ada di x=5+ct.

Solusi eksak ini penting sebagai alat verifikasi: kalau hasil numerik menyimpang, kita tahu itu salah metode, bukan salah fisika. (Konsep terkait: Method of Manufactured Solutions.)

Analogi: estafet bisik-bisik

Anak-anak berdiri sejajar, jarak antar anak = Δx.
Tiap ronde (Δt), pesan cuma boleh dibisikkan ke tetangga sebelah.
   o    o    o    o    o    o        ← sensor / titik grid
   |----|
     Δx
Gelombang lari dengan kecepatan c.
Dalam satu ronde, gelombang menempuh jarak c·Δt.
c·Δt ≤ Δx  → gelombang TIDAK menyalip pesan → simulasi aman
c·Δt > Δx  → gelombang menyalip → anak "ngarang" → MELEDAK

Diskritisasi

Komputer tidak mengerti turunan (konsep limit / jarak tak-hingga kecil). Yang dia punya cuma:

  • Grid ruang: titik xi, i=0…N, jarak Δx → index array
  • Langkah waktu: foto ke-n, selisih Δt → iterasi loop

Notasi uin = "nilai u di titik ke-i, pada langkah waktu ke-n" = u[i] pada iterasi ke-n. Superscript n bukan pangkat.

Mengganti turunan dengan pengurangan

Dari definisi turunan, buang limit-nya (justifikasi formal: Deret Taylor):

Turunan Skema Aproksimasi Alasan pemilihan
∂u/∂t Forward difference uin+1−uinΔt kita mau maju ke masa depan
∂u/∂x Backward difference uin−ui−1nΔx informasi datang dari kiri (hulu) → Skema Upwind

Persamaan diskrit

uin+1−uinΔt+cuin−ui−1nΔx=0

Satu-satunya yang tidak diketahui: uin+1 (masa depan). Pindah ruas:

uin+1=uin−cΔtΔx(uin−ui−1n)

Bahasa manusia: nilai baru = nilai lama − koreksi berdasarkan selisih dengan tetangga kiri.

Paradigma: time-stepping / marching

state SEKARANG + ATURAN perubahan  →  state SEBENTAR LAGI
       ↑                                      |
       └────────────── ulangi ────────────────┘
frame 0 → frame 1 → frame 2 → frame 3 → ...

Paradigma yang sama dipakai di prakiraan cuaca, orbit satelit, molecular dynamics, dan physics engine game. Yang berbeda cuma aturannya (PDE-nya) dan ukuran grid-nya.

Peta lengkap dari fisika ke kode:

PDE (fisika)        = aturan alam
Finite difference   = terjemahan aturan → aritmetika array
Persamaan update    = resep: frame[n+1] = f(frame[n])
Loop time-stepping  = jalankan resep berulang
CFL                 = batas kecepatan biar tidak ngaco

Skema ini tipe explicit (masa depan dihitung langsung dari masa kini). Alternatifnya Metode Implicit — lebih mahal per langkah, tapi bebas batas CFL; relevan buat HPC karena explicit = embarrassingly parallel / GPU-friendly.

Implementasi

import numpy as np

nx = 81                    # jumlah titik grid
dx = 2 / (nx - 1)          # jarak antar titik
nt = 25                    # jumlah langkah waktu
dt = 0.02                  # ukuran langkah waktu (cek CFL!)
c  = 1.0                   # kecepatan gelombang

# kondisi awal: fungsi topi (hat function)
u = np.ones(nx)
u[int(0.5/dx):int(1/dx + 1)] = 2

for n in range(nt):
    un = u.copy()          # WAJIB: simpan state lama
    for i in range(1, nx):
        u[i] = un[i] - c * dt/dx * (un[i] - un[i-1])

Bug klasik pemula: lupa un = u.copy(). Semua titik harus di-update pakai nilai langkah n, bukan nilai yang setengah ter-update. Hasilnya sekilas mirip, tapi fisikanya salah.

Catatan gaya: jangan langsung di-vectorize. Nested loop dulu biar fisikanya kelihatan; vectorize (u[1:] = un[1:] - c*dt/dx*(un[1:] - un[:-1])) sebagai exercise terpisah + bahan benchmark loop vs vectorized vs numba.

Kondisi CFL (Courant–Friedrichs–Lewy)

CFL=cΔtΔx≤1

CFL Kondisi Perilaku
≤ 1 gelombang menempuh ≤ 1 sel grid per langkah waktu stabil
> 1 gelombang "menyalip" informasi grid osilasi zigzag tumbuh eksponensial → meledak

Intuisi: informasi fisik tidak boleh lari lebih cepat daripada informasi numerik. Stabilitas ditentukan kombinasi c, Δt, dan Δx — bukan Δt sendirian. Pembuktian formal: Analisis von Neumann.

Numerical diffusion

Fenomena: sudut-sudut tajam gelombang kotak makin lama makin tumpul/melengkung, padahal solusi eksak bentuknya tetap.

  • Ini bukan bug — efek samping error truncation dari skema backward difference orde-1
  • Error-nya berperilaku seperti suku difusi (makanya disebut numerical diffusion)
  • Trade-off akurasi vs stabilitas adalah tema besar di CFD; skema orde tinggi mengurangi ini tapi bawa masalah lain
  • Detail: Numerical Diffusion, Error Truncation

Kertas vs komputer

Pembagian kerja di scientific computing:

Kerjaan komputer Kerjaan kertas (tidak bisa di-outsource)
menghitung solusi PDE (menjalankan resep) menurunkan resep update dari Taylor series
menjalankan jutaan iterasi analisis stabilitas (von Neumann → dari mana CFL ≤ 1)
verifikasi kode via solusi eksak
debugging fisika: "bug di kode, atau memang perilaku matematisnya?"

Analogi: kertas itu posisinya kayak assembly buat programmer Rust — bukan tempat produksi, tapi tempat memahami dan mendiagnosis. Porsi realistis: ~90% ngoding, ~10% coret-coretan, tapi 10% itu yang membedakan "bisa menjalankan notebook" dari "mengerti CFD".

Checklist penguasaan

  • [x] Paham arti fisik persamaan konveksi (aturan estafet)
  • [x] Paham solusi eksak u₀(x − ct) dan fungsinya sebagai alat verifikasi
  • [x] Paham notasi u_i^n (i = index ruang, n = index waktu)
  • [x] Bisa menurunkan persamaan update dari persamaan diskrit
  • [x] Paham intuisi CFL (gelombang vs kecepatan informasi grid)
  • [x] Paham numerical diffusion itu bukan bug
  • [ ] Implement Step 1 sendiri di NumPy (tanpa lihat notebook)
  • [ ] Reproduce ledakan CFL di matplotlib (coba CFL = 1.1)
  • [ ] Eksperimen: plot hasil pada CFL = 0.5 vs 0.9 vs 1.0 — bandingkan ketumpulan sudut
  • [ ] Vectorize loop + benchmark vs nested loop
  • [ ] Bonus: turunkan sendiri forward difference dari ekspansi Taylor

Lihat juga