Assalamualaikum warahmatullahi wabarakatuh (ูฑูุณููููุงู ู ุนูููููููู ู ููุฑูุญูู ูุฉู ูฑูููููฐูู ููุจูุฑูููุงุชููู) dari diskusi saya dengan pak DAI, saya mennyampaikan bahwasannya integrasi perhitungan numerik dari bahasa pemograman python dan javascript yang cukup menarik perhatian saya yang menjadikan sebagai kesadaran saya dalam menggali lebih dalam topik ini.
Teori Curve Fitting
Curve fitting adalah proses mencari fungsi matematis f(x) yang paling sesuai dengan sekumpulan data (xiโ,yiโ), di mana i=1,2,…,n adalah indeks titik data. Tujuannya adalah meminimalkan selisih antara nilai data asli yi dan nilai prediksi f(xi) . Fungsi f(x)bisa berupa:

Metode Least Squares
Metode least squares adalah pendekatan standar untuk curve fitting. Ide utamanya adalah meminimalkan jumlah kuadrat selisih (error) antara data asli dan prediksi:

Proses optimasi melibatkan mencari parameter (misalnya m dan b untuk linier) dengan menurunkan S terhadap setiap parameter dan menyamakan turunannya dengan nol.
Teori dan Perhitungan Least Squares untuk Linear Fitting

Generalisasi untuk Polinomial
Untuk polinomial derajat k, misalnya


Sistem ini diselesaikan dengan matriks (metode normal equations).
Non-Linear Least Squares
Untuk fungsi non-linier (misalnya y=aebx y = ae^(bx) ), turunan tidak menghasilkan solusi analitik langsung. Diperlukan metode numerik seperti:
- Gradient Descent: Iterasi untuk mendekati minimum S.
- Levenberg-Marquardt: Kombinasi gradient descent dan metode Gauss-Newton.
Implementasi di Python
Linear Fitting dengan Least Squares
import numpy as np
import matplotlib.pyplot as plt
# Data input
x = np.array(x_data) # Array x_data dari pengguna
y = np.array(y_data) # Array y_data dari pengguna
# Linear fitting (least squares)
koefisien = np.polyfit(x, y, 1) # Derajat 1 = linier
m, b = koefisien # m = kemiringan, b = intersep
y_fit = m * x + b # Nilai prediksi
# Visualisasi
plt.scatter(x, y, color='blue', label='Data Asli')
plt.plot(x, y_fit, color='red', label='Fit Linier')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.title('Linear Curve Fitting dengan Least Squares')
plt.show()
Penjelasan
- np.polyfit(x, y, 1):
- Mengimplementasikan least squares secara internal.
- Menggunakan solusi matriks untuk persamaan normal: ATAx^=ATb di mana A adalah matriks Vandermonde (kolom [1,x]).
- Mengembalikan koefisien [m,b] [m, b] [m,b].
- Efisiensi: NumPy menggunakan operasi vektor dan aljabar linier yang dioptimalkan.
- Visualisasi: Matplotlib menggambar titik (scatter) dan garis (plot) dengan data yang dihitung.
Polynomial Fitting
# Polynomial fitting
derajat = k # Derajat polinomial dari pengguna
koefisien = np.polyfit(x, y, derajat) # Least squares polinomial
p = np.poly1d(koefisien) # Fungsi polinomial
y_fit = p(x) # Nilai prediksi
# Visualisasi
plt.scatter(x, y, color='blue', label='Data Asli')
plt.plot(x, y_fit, color='red', label='Fit Polinomial')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.title('Polynomial Curve Fitting')
plt.show()
- np.polyfit(x, y, derajat):
- Untuk derajat k k k, membentuk matriks Vandermonde x^2, …, x^k].
- Menyelesaikan sistem ATAx^=ATb untuk koefisien [a_0, a_1, …, a_k]
- np.poly1d: Mengonversi koefisien menjadi fungsi yang bisa dievaluasi.
Non-Linear Fitting
from scipy.optimize import curve_fit
# Definisikan model
def model(x, a, b):
return a * np.exp(b * x) # Contoh fungsi eksponensial
# Fitting
params, _ = curve_fit(model, x, y) # Optimasi least squares non-linier
y_fit = model(x, *params)
# Visualisasi
plt.scatter(x, y, color='blue', label='Data Asli')
plt.plot(x, y_fit, color='red', label='Fit Non-Linier')
plt.legend()
plt.show()
curve_fit:
- Menggunakan algoritma Levenberg-Marquardt untuk meminimalkan S.
- Parameter awal diestimasi secara otomatis kecuali diberikan oleh pengguna
Implementasi di JavaScript
Linear Fitting dengan Least Squares
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<canvas id="myChart" width="400" height="400"></canvas>
<script>
// Data input
const x = xData; // Array xData dari pengguna
const y = yData; // Array yData dari pengguna
// Linear fitting (least squares)
const n = x.length;
const sumX = x.reduce((a, b) => a + b, 0);
const sumY = y.reduce((a, b) => a + b, 0);
const sumXY = x.map((xi, i) => xi * y[i]).reduce((a, b) => a + b, 0);
const sumX2 = x.map(xi => xi * xi).reduce((a, b) => a + b, 0);
const m = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
const b = (sumY - m * sumX) / n;
const yFit = x.map(xi => m * xi + b);
// Visualisasi
const ctx = document.getElementById('myChart').getContext('2d');
new Chart(ctx, {
type: 'scatter',
data: {
datasets: [{
label: 'Data Asli',
data: x.map((xi, i) => ({ x: xi, y: y[i] })),
backgroundColor: 'blue'
}, {
label: 'Fit Linier',
data: x.map((xi, i) => ({ x: xi, y: yFit[i] })),
type: 'line',
borderColor: 'red',
fill: false
}]
},
options: {
scales: {
x: { title: { display: true, text: 'X' } },
y: { title: { display: true, text: 'Y' } }
}
}
});
</script>
</body>
</html>
Penjelasan Detail
- Perhitungan:
- Mengimplementasikan rumus least squares secara eksplisit.
- Operasi seperti โxi dan โ(xiโyiโ) dilakukan dengan reduce dan map.
- Visualisasi:
- Chart.js: Menggambar titik data asli (scatter) dan garis fitting (line).
- Data diformat sebagai array objek {x, y}.
Polynomial atau Non-Linear
JavaScript tidak memiliki fungsi bawaan untuk polinomial atau non-linier. Untuk polinomial:
- Buat matriks Vandermonde dan selesaikan dengan pustaka seperti numeric.js. Untuk non-linier:
- Implementasikan gradient descent manual atau gunakan pustaka seperti math.js.