Limit lim x→a f(x), one-sided limit, dan continuity adalah konsep fundamental calculus yang menjelaskan convergence iterasi numerik dan asymptotic analysis — fondasi formal dari Big-O notation yang kalian gunakan setiap hari.

Setelah di episode 20 kita menyelesaikan linear algebra — eigenvalues dan eigenvectors — pada episode ini kita memasuki calculus: cabang matematika yang berurusan dengan perubahan dan optimasi. Dan fondasi pertama calculus adalah limits: apa yang terjadi pada fungsi saat input mendekati nilai tertentu.
Mengapa limits penting? Karena limits adalah fondasi dari Big-O notation yang kalian gunakan setiap hari untuk menganalisis kompleksitas. Limits juga menjelaskan convergence — kapan iterasi numerik akan mencapai hasil yang benar, dan kapan ia akan gagal. Memahami limits memberikan pemahaman formal tentang konsep "mendekati" yang sebelumnya hanya kalian rasakan secara intuitif.
lim(x→a) f(x) = L artinya: saat x mendekati a (bukan sama dengan a), f(x) mendekati L.
import math
def f(x):
"""f(x) = sin(x)/x — limit saat x→0 = 1."""
if x == 0:
return 1 # L'Hôpital's rule
return math.sin(x) / x
# Dekati 0 dari berbagai sisi
print("f(x) = sin(x)/x saat x → 0:")
for x in [0.1, 0.01, 0.001, 0.0001, -0.0001, -0.001, -0.01, -0.1]:
print(f" f({x}) = {f(x):.8f}")
print(f"\nLimit = {f(0):.1f} (exact: 1)")Limit bisa berbeda dari sisi kiri dan kanan:
def g(x):
"""Fungsi piecewise: x untuk x<0, x+1 untuk x≥0."""
return x if x < 0 else x + 1
# Limit dari kiri (x→0⁻)
print("g(x) saat x → 0⁻:")
for x in [-0.1, -0.01, -0.001]:
print(f" g({x}) = {g(x)}")
# Limit dari kanan (x→0⁺)
print("\ng(x) saat x → 0⁺:")
for x in [0.1, 0.01, 0.001]:
print(f" g({x}) = {g(x)}")
print("\nLimit kiri ≠ Limit kanan → limit tidak ada!")
print(f" lim(x→0⁻) = 0")
print(f" lim(x→0⁺) = 1")Fungsi kontinu di titik a jika:
lim(x→a) f(x) adalim(x→a) f(x) = f(a)def is_continuous_at(f, a, epsilon=1e-6):
"""Cek kontinuitas secara numerik."""
if math.isnan(f(a)):
return False
# Cek limit dari kiri
left_limit = f(a - epsilon)
# Cek limit dari kanan
right_limit = f(a + epsilon)
# Apakah limit ada dan sama dengan f(a)?
limit_exists = abs(left_limit - right_limit) < epsilon
limit_equals_value = abs(left_limit - f(a)) < epsilon
return limit_exists and limit_equals_value
# Kontinu
def continuous(x):
return x ** 2
# Diskontinu (jump)
def discontinuous(x):
return 1 if x >= 0 else -1
# Diskontinu (removable)
def removable(x):
return 1 if x != 0 else None # f(0) tidak terdefinisi
print(f"x² kontinu di x=0? {is_continuous_at(continuous, 0)}")
print(f"step function kontinu di x=0? {is_continuous_at(discontinuous, 0)}")Jika limit menghasilkan 0/0 atau ∞/∞, gunakan L'Hôpital: lim f(x)/g(x) = lim f'(x)/g'(x).
import math
# sin(x)/x saat x→0: 0/0 → gunakan L'Hôpital
# lim sin(x)/x = lim cos(x)/1 = cos(0)/1 = 1
def f_original(x):
if x == 0:
return float('nan')
return math.sin(x) / x
def f_lhopital(x):
"""Turunan sin(x) = cos(x), turunan x = 1."""
return math.cos(x) / 1
print("sin(x)/x saat x→0:")
print(f" Direct: {f_original(1e-10):.10f}")
print(f" L'Hôpital: {f_lhopital(1e-10):.10f}")
print(f" Expected: 1.0")import math
# Metode Newton untuk mencari akar f(x) = x² - 2
def newton_method(f, f_prime, x0, tolerance=1e-10, max_iter=100):
"""Newton's method — convergence dijamin jika conditions terpenuhi."""
x = x0
history = [x]
for i in range(max_iter):
fx = f(x)
if abs(fx) < tolerance:
break
x = x - fx / f_prime(x)
history.append(x)
return x, history
f = lambda x: x**2 - 2
f_prime = lambda x: 2*x
root, history = newton_method(f, f_prime, x0=10.0)
print(f"Newton's method: √2 ≈ {root:.10f}")
print(f"Exact: {math.sqrt(2):.10f}")
print(f"Iterations: {len(history)}")
print(f"Error setiap iterasi:")
for i, x in enumerate(history):
print(f" i={i}: x={x:.10f}, error={abs(x - math.sqrt(2)):.2e}")import time
import math
def f_linear(n):
return sum(range(n))
def f_quadratic(n):
return sum(i for i in range(n) for _ in range(n))
# Big-O: limit ratio f(n)/g(n) saat n→∞
# O(n): f_linear(n)/n → constant
# O(n²): f_quadratic(n)/n² → constant
print("Convergence ke constant (definisi Big-O):")
for n in [100, 1000, 10000]:
ratio_linear = f_linear(n) / n
ratio_quad = f_quadratic(n) / n**2
print(f" n={n}: f(n)/n = {ratio_linear:.4f}, f(n)/n² = {ratio_quad:.4f}")Note
Limits memberikan fondasi formal untuk Big-O notation: f(n) = O(g(n)) artinya lim(f(n)/g(n)) ada dan terbatas saat n→∞. Tanpa limits, Big-O hanya "feeling" — dengan limits, ia adalah bukti matematika.
Inti yang harus dibawa pulang:
lim(x→a) f(x) = L: f(x) mendekati L saat x mendekati a — bukan tentang nilai di a.Di episode 22 selanjutnya kita akan mempelajari derivatives (turunan) dan gradient — laju perubahan instan dari fungsi. Turunan adalah "kemiringan" fungsi di titik tertentu dan merupakan fondasi dari gradient descent di machine learning!