Skip to main content

Command Palette

Search for a command to run...

Simulasi Pendulum Ganda (Double Pendulum) — Gabriel Hizkia

Pemodelan non-linear dan chaos lewat antarmuka GUI MATLAB

Published
7 min read
Simulasi Pendulum Ganda (Double Pendulum) — Gabriel Hizkia
R

Tech enthusiast | MATLAB & Python lover | Exploring AI, ML, and deep learning. Sharing free code & tutorials to help others learn faster

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

💡
Program ini sangat berguna untuk mahasiswa teknik, fisika, maupun siapa saja yang ingin memahami dinamika non-linear melalui simulasi visual.

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.

💡
Fitur tambahan: program juga menghapus grafik lama sebelum simulasi baru dimulai, sehingga hasil selalu bersih dan interaktif.

Tabel Parameter Input

ParameterSimbolNilai DefaultKeterangan
Panjang 1L11.0 mPanjang batang pertama
Panjang 2L2​1.0 mPanjang batang kedua
Massa 1m11.0 kgMassa pendulum pertama
Massa 2m2​1.0 kgMassa pendulum kedua
Sudut awal 1θ1​π/2 radPosisi awal batang pertama
Sudut awal 2θ2​π/2 radPosisi awal batang kedua
Kecepatan awal 1ω1​0 rad/sKecepatan sudut awal batang pertama
Kecepatan awal 2ω2​0 rad/sKecepatan 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