ccitonline.com

CCIT – Cara Cerdas Ingat Tuhan

| AI-DAI5 | CFDSOF | VisualFOAM | 8N8 | DAI5 eBook Free Download |

Membuat Model Penyelesaian Ordinary Differential Equations (ODE) Metode Runge-Kutta

[Agus’ Learning Progress โ€“ NPM. 2506694625]

Bayangkan sebuah ODE sebagai resep untuk menggambar sebuah kurva. Resep itu tidak memberitahu kita bagaimana bentuk kurva secara langsung, melainkan hanya memberitahu kemiringan (gradien) kurva di setiap titik. Misalnya, ODE dy/dxโ€‹ = y memberitahu kita: “Di titik (x, y) mana pun, kemiringan kurva adalah y.”

Rincian Langkah Matematis RK4

Untuk setiap langkah dari x ke x+h:

  • Hitung Kemiringan Awal (kโ‚)

Ini adalah kemiringan di titik awal, persis seperti Metode Euler.

k1 = h.f(x,y)

  • Hitung Kemiringan Uji di Titik Tengah (kโ‚‚)

Ini adalah “intipan” pertama. Kita gunakan kโ‚ untuk memprediksi nilai y di tengah langkah (y + 0.5 * kโ‚), lalu hitung kemiringan di sana.

k2 = hโ‹…f(x+0.5h, y+0.5k1)

  • Hitung Kemiringan Uji Kedua di Titik Tengah (kโ‚ƒ)

Ini adalah “intipan” yang lebih baik. Kita gunakan kโ‚‚ (yang lebih akurat dari kโ‚) untuk memprediksi lagi nilai y di tengah langkah, lalu hitung kemiringannya.

k3 = hโ‹…f(x+0.5h, y+0.5k2)

  • Hitung Kemiringan Uji di Titik Akhir (kโ‚„)

Terakhir, kita gunakan kโ‚ƒ untuk memprediksi nilai y di akhir langkah (y + kโ‚ƒ), lalu hitung kemiringan di sana.

k4 = hโ‹…f(x+h, y+k3)

  • Gabungkan Semua Kemiringan (Weighted Average)

Nilai y yang baru adalah nilai y lama ditambah rata-rata tertimbang dari keempat kemiringan. Perhatikan bobotnya: kemiringan dari titik tengah (kโ‚‚ dan kโ‚ƒ) diberi bobot 2x lipat.

ybaru = ylama + 1/6(k1 + 2k2 + 2k3 + k4)

โ€‹Meskipun terlihat rumit, secara matematis metode ini dapat mengurangi error dibandingkan Metode Euler. Metode Runge-Kutta 4 adalah cara yang sangat akurat dan stabil untuk menyelesaikan ODE secara numerik dengan meniru bentuk kurva. Ia bekerja dengan cara “mengintip ke depan” di dalam setiap langkah untuk mendapatkan estimasi kemiringan rata-rata yang jauh lebih baik daripada metode yang lebih sederhana. Ia merupakan keseimbangan sempurna antara kemudahan implementasi dan akurasi yang tinggi, menjadikannya salah satu metode numerik pertama yang dipelajari dan paling banyak digunakan.

Kalkulator Ordinary Differential Equations (ODE)

Penyelesaian ODE: Metode Runge-Kutta (RK4) 📈

Soal: Persamaan Diferensial dy/dx = y
Dengan kondisi awal y(0) = 1.

Grafik Hasil Perhitungan

Lampiran



Kalkulator Ordinary Differential Equations (ODE)

<div class="container"> <h2>Kalkulator ODE: Metode Runge-Kutta (RK4) 📈</h2> <div class="problem-box"> <strong>Soal:</strong> Persamaan Diferensial dy/dx = y<br> Dengan kondisi awal y(0) = 1. </div> <div class="input-grid"> <div> <label for="x0">Kondisi Awal (xโ‚€):</label> <input type="number" id="x0" value="0" disabled> </div> <div> <label for="y0">Kondisi Awal (yโ‚€):</label> <input type="number" id="y0" value="1"> </div> <div> <label for="x_final">Hitung y saat (x):</label> <input type="number" id="x_final" value="2"> </div> <div> <label for="langkah">Jumlah Langkah (Akurasi):</label> <input type="number" id="langkah" value="100"> </div> </div> <button onclick="hitungODE()">Hitung dan Gambar Grafik</button> <div id="hasil"></div> </div> <div class="container"> <h3>Grafik Hasil Perhitungan</h3> <canvas id="grafikODE"></canvas> </div> <script> let chartInstance; // Variabel untuk menyimpan instance grafik function hitungODE() { // --- 1. Mendefinisikan Persamaan Diferensial --- // Ini adalah bagian inti yang mendefinisikan soal: dy/dx = y const f = (x, y) => y; // --- 2. Mengambil Input dari User --- const y0 = parseFloat(document.getElementById('y0').value); const x0 = parseFloat(document.getElementById('x0').value); const xFinal = parseFloat(document.getElementById('x_final').value); const n = parseInt(document.getElementById('langkah').value); // Jumlah langkah if (isNaN(y0) || isNaN(xFinal) || isNaN(n)) { document.getElementById('hasil').innerHTML = '<p style="color:red;">Input tidak valid!</p>'; return; } // --- 3. Inisialisasi Perhitungan --- const h = (xFinal - x0) / n; // Menghitung ukuran setiap langkah (step size) let x = x0; let y = y0; const points = [{x: x, y: y}]; // Menyimpan titik untuk grafik // --- 4. Loop Perhitungan Metode Runge-Kutta Orde 4 --- for (let i = 0; i < n; i++) { // Hitung 4 "slope" atau kemiringan const k1 = h * f(x, y); const k2 = h * f(x + 0.5 * h, y + 0.5 * k1); const k3 = h * f(x + 0.5 * h, y + 0.5 * k2); const k4 = h * f(x + h, y + k3); // Hitung nilai y berikutnya berdasarkan rata-rata tertimbang dari slope y = y + (k1 + 2 * k2 + 2 * k3 + k4) / 6.0; x = x + h; points.push({x: x, y: y}); } // --- 5. Menampilkan Hasil --- const hasilDiv = document.getElementById('hasil'); const solusiAnalitik = Math.exp(xFinal); // Jawaban eksak untuk perbandingan const galat = Math.abs((solusiAnalitik - y) / solusiAnalitik) * 100; hasilDiv.innerHTML = ` <p>Menghitung y(${xFinal}) dengan ${n} langkah:</p> <ul> <li>Ukuran Langkah (h): <strong>${h.toFixed(5)}</strong></li> <li>Hasil Perhitungan Numerik (y): <strong class="final-answer">${y.toFixed(6)}</strong></li> </ul> <hr> <p><strong>Perbandingan:</strong></p> <ul> <li>Solusi Eksak ($y = e^x$): <strong>${solusiAnalitik.toFixed(6)}</strong></li> <li>Galat (Error) Relatif: <strong>${galat.toFixed(4)} %</strong></li> </ul> `; buatGrafik(points, xFinal); } function buatGrafik(points, xFinal) { const ctx = document.getElementById('grafikODE').getContext('2d'); if (chartInstance) { chartInstance.destroy(); // Hancurkan grafik lama jika ada } // Data untuk solusi analitik/eksak sebagai pembanding const dataAnalitik = []; for(let i=0; i<points.length; i++){ const x = points[i].x; dataAnalitik.push({x: x, y: Math.exp(x)}); } chartInstance = new Chart(ctx, { type: 'line', data: { datasets: [{ label: 'Hasil Numerik (RK4)', data: points, borderColor: 'rgba(0, 123, 255, 1)', backgroundColor: 'rgba(0, 123, 255, 0.1)', borderWidth: 2, pointRadius: 0, // Sembunyikan titik agar jadi garis mulus }, { label: 'Solusi Eksak (y = e^x)', data: dataAnalitik, borderColor: 'rgba(220, 53, 69, 1)', backgroundColor: 'transparent', borderWidth: 2, pointRadius: 0, borderDash: [5, 5], // Garis putus-putus }] }, options: { responsive: true, scales: { x: { type: 'linear', position: 'bottom', title: { display: true, text: 'x' } }, y: { title: { display: true, text: 'y' } } }, plugins: { title: { display: true, text: `Grafik Solusi ODE dy/dx = y` } } } }); } // Panggil fungsi saat halaman pertama kali dimuat window.onload = hitungODE; </script>


Leave a Reply

Your email address will not be published. Required fields are marked *