Simulasi Pendulum Ganda (Double Pendulum) — Gabriel Hizkia
Pemodelan non-linear dan chaos lewat antarmuka GUI MATLAB

Pendulum ganda adalah contoh sistem fisika yang sederhana tetapi menunjukkan dinamika yang kompleks dan kacau. Meskipun hanya terdiri dari dua batang dengan massa yang terhubung, gerakannya bisa sangat sensitif terhadap kondisi awal, sebuah fenomena yang dikenal sebagai chaos deterministik.
Dalam artikel ini, saya membagikan program MATLAB yang mensimulasikan gerakan pendulum ganda dengan:
Antarmuka GUI (Graphical User Interface)
Input interaktif untuk panjang batang, massa, sudut awal, dan kecepatan awal
Visualisasi animasi real-time yang memperlihatkan lintasan kedua massa
Teori Dasar Pendulum Ganda
Pendulum ganda terdiri dari dua pendulum yang terhubung secara seri:
Batang pertama memiliki panjang (L1) dan massa (m1).
Batang kedua memiliki panjang (L2) dan massa (m2), terhubung pada ujung batang pertama.
Posisi tiap batang dinyatakan dengan sudut (θ1) dan (θ2).
Persamaan gerak pendulum ganda diturunkan dari hukum Newton–Euler atau prinsip Lagrangian, menghasilkan sistem persamaan diferensial non-linear.
Bentuk umum persamaan diferensialnya:
$$\frac{d\theta_1}{dt} = \omega_1, \quad \frac{d\theta_2}{dt} = \omega_2$$
$$ \frac{d\omega_1}{dt} = f(\theta_1, \theta_2, \omega_1, \omega_2, m_1, m_2, L_1, L_2, g)$$
$$ \frac{d\omega_2}{dt} = g(\theta_1, \theta_2, \omega_1, \omega_2, m_1, m_2, L_1, L_2, g)$$
Di mana (ω1) dan (ω2) adalah kecepatan sudut masing-masing batang. Karena kompleksitas persamaan, penyelesaian analitik hampir mustahil sehingga digunakan metode numerik.
Struktur Program
1. Pembuatan GUI
Antarmuka dibuat menggunakan uifigure, dengan field input numerik untuk:
Panjang pendulum (L1, L2)Massa (m1, m2)Sudut awal (θ1, θ2)Kecepatan awal (ω1, ω2)
Tersedia juga tombol “Mulai Simulasi” untuk menjalankan animasi.
2. Penyelesaian Persamaan Diferensial
Program menggunakan solver bawaan MATLAB yaitu ode45, yang berbasis metode Runge-Kutta orde 4–5 adaptif. Fungsi persamaan diferensial untuk pendulum ganda didefinisikan terpisah.
3. Visualisasi Animasi
Dua batang divisualisasikan dengan garis merah (pendulum 1) dan biru (pendulum 2).
Massa divisualisasikan dengan lingkaran (red & blue dot).
Lintasan gerak (trajectory) digambar dengan garis putus-putus.
Animasi dijalankan secara iteratif dengan update posisi setiap timestep.
Tabel Parameter Input
| Parameter | Simbol | Nilai Default | Keterangan |
| Panjang 1 | L1 | 1.0 m | Panjang batang pertama |
| Panjang 2 | L2 | 1.0 m | Panjang batang kedua |
| Massa 1 | m1 | 1.0 kg | Massa pendulum pertama |
| Massa 2 | m2 | 1.0 kg | Massa pendulum kedua |
| Sudut awal 1 | θ1 | π/2 rad | Posisi awal batang pertama |
| Sudut awal 2 | θ2 | π/2 rad | Posisi awal batang kedua |
| Kecepatan awal 1 | ω1 | 0 rad/s | Kecepatan sudut awal batang pertama |
| Kecepatan awal 2 | ω2 | 0 rad/s | Kecepatan sudut awal batang kedua |
Program MATLAB Pendulum Ganda
function doublePendulumSimulation()
% Membuat GUI
fig = uifigure('Position', [100, 100, 800, 400], 'Name', 'Simulasi Pendulum Ganda');
% Input untuk panjang pendulum, massa, dan sudut
uilabel(fig, 'Position', [20, 350, 100, 22], 'Text', 'Panjang L1 (m):');
L1Field = uieditfield(fig, 'numeric', 'Position', [120, 350, 100, 22], 'Value', 1.0);
uilabel(fig, 'Position', [20, 320, 100, 22], 'Text', 'Panjang L2 (m):');
L2Field = uieditfield(fig, 'numeric', 'Position', [120, 320, 100, 22], 'Value', 1.0);
uilabel(fig, 'Position', [20, 290, 100, 22], 'Text', 'Massa m1 (kg):');
m1Field = uieditfield(fig, 'numeric', 'Position', [120, 290, 100, 22], 'Value', 1.0);
uilabel(fig, 'Position', [20, 260, 100, 22], 'Text', 'Massa m2 (kg):');
m2Field = uieditfield(fig, 'numeric', 'Position', [120, 260, 100, 22], 'Value', 1.0);
uilabel(fig, 'Position', [20, 230, 100, 22], 'Text', 'Sudut Awal θ1 (rad):');
theta1Field = uieditfield(fig, 'numeric', 'Position', [120, 230, 100, 22], 'Value', pi/2);
uilabel(fig, 'Position', [20, 200, 100, 22], 'Text', 'Sudut Awal θ2 (rad):');
theta2Field = uieditfield(fig, 'numeric', 'Position', [120, 200, 100, 22], 'Value', pi/2);
uilabel(fig, 'Position', [20, 170, 100, 22], 'Text', 'Kecepatan Awal ω1 (rad/s):');
omega1Field = uieditfield(fig, 'numeric', 'Position', [120, 170, 100, 22], 'Value', 0);
uilabel(fig, 'Position', [20, 140, 100, 22], 'Text', 'Kecepatan Awal ω2 (rad/s):');
omega2Field = uieditfield(fig, 'numeric', 'Position', [120, 140, 100, 22], 'Value', 0);
% Tombol untuk memulai simulasi
startButton = uibutton(fig, 'Position', [120, 100, 100, 40], 'Text', 'Mulai Simulasi', 'ButtonPushedFcn', @(btn, event) startSimulation());
% Area untuk menampilkan grafik
ax = axes(fig, 'Position', [0.3, 0.1, 0.65, 0.85]);
% Fungsi untuk memulai simulasi
function startSimulation()
% Ambil nilai input
L1 = L1Field.Value;
L2 = L2Field.Value;
m1 = m1Field.Value;
m2 = m2Field.Value;
theta1 = theta1Field.Value;
theta2 = theta2Field.Value;
omega1 = omega1Field.Value;
omega2 = omega2Field.Value;
% Waktu simulasi
tspan = [0 20]; % interval waktu untuk simulasi (0 sampai 20 detik)
initial_conditions = [theta1, theta2, omega1, omega2];
% Menghapus objek grafik lama jika ada
delete(findall(fig, 'Type', 'line')); % Menghapus semua objek bertipe 'line'
% Menyelesaikan persamaan diferensial dengan ode45
[t, sol] = ode45(@(t, y) pendulumEquations(t, y, 9.81, m1, m2, L1, L2), tspan, initial_conditions);
% Visualisasi gerak pendulum ganda
axis(ax, 'equal');
hold(ax, 'on');
xlim(ax, [-2 2]);
ylim(ax, [-2 2]);
title(ax, 'Simulasi Pendulum Ganda');
% Inisialisasi grafik pendulum
pendulum1_line = plot(ax, [0, 0], [0, 0], 'r', 'LineWidth', 2); % Pendulum 1
pendulum2_line = plot(ax, [0, 0], [0, 0], 'b', 'LineWidth', 2); % Pendulum 2
mass1 = plot(ax, 0, 0, 'ro', 'MarkerFaceColor', 'r'); % Massa 1
mass2 = plot(ax, 0, 0, 'bo', 'MarkerFaceColor', 'b'); % Massa 2
% Menyimpan lintasan pendulum
traj1_x = [];
traj1_y = [];
traj2_x = [];
traj2_y = [];
% Inisialisasi posisi pendulum dan massa
x1 = L1 * sin(theta1);
y1 = -L1 * cos(theta1);
x2 = x1 + L2 * sin(theta2);
y2 = y1 - L2 * cos(theta2);
% Update grafik awal
set(pendulum1_line, 'XData', [0, x1], 'YData', [0, y1]);
set(pendulum2_line, 'XData', [x1, x2], 'YData', [y1, y2]);
set(mass1, 'XData', x1, 'YData', y1);
set(mass2, 'XData', x2, 'YData', y2);
% Animasi gerak pendulum
for i = 1:length(t)
% Posisi pendulum 1
x1 = L1 * sin(sol(i, 1));
y1 = -L1 * cos(sol(i, 1));
% Posisi pendulum 2
x2 = x1 + L2 * sin(sol(i, 2));
y2 = y1 - L2 * cos(sol(i, 2));
% Memperbarui posisi pendulum dan massa
set(pendulum1_line, 'XData', [0, x1], 'YData', [0, y1]);
set(pendulum2_line, 'XData', [x1, x2], 'YData', [y1, y2]);
set(mass1, 'XData', x1, 'YData', y1);
set(mass2, 'XData', x2, 'YData', y2);
% Menyimpan posisi untuk garis lintasan
traj1_x = [traj1_x, x1];
traj1_y = [traj1_y, y1];
traj2_x = [traj2_x, x2];
traj2_y = [traj2_y, y2];
% Menggambar lintasan (track) pendulum 1 dan pendulum 2 setiap 5 langkah
if mod(i, 5) == 0
plot(ax, traj1_x, traj1_y, 'r--'); % Lintasan pendulum 1 (garis merah putus-putus)
plot(ax, traj2_x, traj2_y, 'b--'); % Lintasan pendulum 2 (garis biru putus-putus)
end
% Menunggu agar animasi terlihat dengan smooth
pause(0.00000000000000000000000000001);
end
end
% Fungsi persamaan diferensial untuk pendulum ganda
function dydt = pendulumEquations(t, y, g, m1, m2, L1, L2)
% y(1) = theta1, y(2) = theta2, y(3) = dtheta1/dt, y(4) = dtheta2/dt
theta1 = y(1);
theta2 = y(2);
omega1 = y(3);
omega2 = y(4);
% Persamaan diferensial untuk pendulum ganda
delta_theta = theta2 - theta1;
denominator1 = (m1 + m2) * L1 - m2 * L1 * cos(delta_theta) * cos(delta_theta);
denominator2 = (L2 / L1) * denominator1;
dtheta1_dt = omega1;
dtheta2_dt = omega2;
domega1_dt = (m2 * L2 * omega2 * omega2 * sin(delta_theta) * cos(delta_theta) ...
+ m2 * g * sin(theta2) * cos(delta_theta) ...
+ m2 * L2 * omega2 * omega2 * sin(delta_theta) ...
- (m1 + m2) * g * sin(theta1)) / denominator1;
domega2_dt = (-m2 * L2 * omega2 * omega2 * sin(delta_theta) * cos(delta_theta) ...
+ (m1 + m2) * g * sin(theta1) * cos(delta_theta) ...
- (m1 + m2) * L1 * omega1 * omega1 * sin(delta_theta) ...
- (m1 + m2) * g * sin(theta2)) / denominator2;
dydt = [dtheta1_dt; dtheta2_dt; domega1_dt; domega2_dt];
end
end
Catatan Penting
Pendulum ganda sangat sensitif terhadap kondisi awal → perubahan kecil menghasilkan trajektori yang sangat berbeda.
Program ini memungkinkan pengguna mengeksplorasi berbagai kombinasi parameter untuk mengamati transisi dari gerak stabil ke chaotic.
Semakin lama simulasi, semakin jelas pola chaotic yang muncul.
Referensi
Strogatz, S. H. (2015). Nonlinear Dynamics and Chaos. CRC Press.
Wikipedia: Double Pendulum






