Sunday, July 1, 2018

Perbandingan Lama eksekusi perhitungan determinan matriks di MATLAB dengan beberapa metode

Dalam postingan kali ini saya akan memberikan contoh perbandingan perhitungan determinan matriks di MATLAB. Dalam menghitung determinan matriks ini saya gunakan tiga cara. Pertama dengan menggunakan metode eliminasi Gauss. Kedua dengan menggunakan metode ekspansi Laplace. Dan yang ketiga dengan menggunakan perintah built-in "det" di MATLAB, yang menurut informasi yang saya perolah juga dilakukan dengan menggunakan metode eliminasi Gauss.

Matriks yang akan dihitung determinannya adalah matriks persegi yang dibangkitkan secara acak oleh perintah "randi" di MATLAB. Sehingga kita bisa melihat berapa akurasi perhitungan antara ketiga metode ini beserta lama eksekusinya. Untuk keperluan tersebut, saya bagikan saja mi skripnya
function testLamaEksekusiDeterminanMatriks()
clear all; 
clc; 
% alokasi matriks persegi dengan bilangan integer acak
A = randi(320,6);
tic; 

% metode 1 dengan eliminasi gauss
hasil = A; % copy matriks, bukan reference
[m,n] = size(A); 
singularFlag = 0; 
for i=1:m
    % jika nilai elemen ke-(i,i) dari matriks hasil = 0, maka tukar
    % baris ke-i dengan baris di bawahnya yang nilai pada kolom
    % ke-i paling besar
    if hasil(i,i) ==0 
        for ii=i+1:m
            if hasil(ii,i)  > hasil(i,i)
                temp = hasil(i,:); 
                hasil(i,:) = hasil(i+1,:);
                hasil(i+1,:) = temp; 
            end
        end
    end
    
    if hasil(i,i) ~= 0
        % untuk setiap baris di bawah baris ke-i dari matriks hasil
        % bagi kolom ke-i nya dengan kolom ke-i pada baris ke-i
        % dan kalikan nilai ini untuk setiap kolom pada baris ke-i
        % di mulai dari kolom ke-i. Kurangkan nilai tiap kolom pada
        % baris di bawah baris ke-i dengan nilai ini di mulai
        % dari kolom ke-i nya.
        for ii=i+1:m
            temp = hasil(ii,i)/hasil(i,i);
            for j=i:n
                hasil(ii,j) = hasil(ii,j) - temp * hasil(i,j);
            end
        end
    else
        disp('matriks singular');
        singularFlag = 1;
    end
    if singularFlag
        break; 
    end
    
end


if ~ singularFlag 
    determinan = 1;
    % determinan matriks merupakan hasil perkalian elemen 
    % diagonal dari matriks hasil yang sudah dieliminasi
    for i=1:m
        determinan = determinan * hasil(i,i); 
    end
    disp(['nilai determinan = ' num2str(determinan)]);
end
disp(['waktu pengerjaan ', num2str(toc)]);

% metode 2, dengan ekspansi laplace
tic; 
determinan = laplaceExpansion(A);
disp(['nilai determinan = ' num2str(determinan)]);
disp(['waktu pengerjaan ', num2str(toc)]);

% metode 3, dengan perintah built in
tic; 
determinan = det(A);
disp(['nilai determinan = ' num2str(determinan)]);
disp(['waktu pengerjaan ', num2str(toc)]);


function x = laplaceExpansion(matriks)
[m,n]=size(matriks);
if m==1 && n == 1
    x = matriks(1,1); 
    return; 
end
x = 0;
for i=1:m
    baris = i; 
    kolom = 1;
    sign = (-1)^(baris+ kolom);
    x = x + (sign * matriks(i,1) *  ...
        laplaceExpansion(removeRowColumn(matriks,i,1)) ); 
        % rekursi
end

% hapus baris ke-ii dan kolom ke-jj dari matriks input
function hasil = removeRowColumn(matriks, ii, jj)
[m,n]=size(matriks); 
hasil = zeros(m-1,n-1); 
c = 1;
for i=1:m
    if i~=ii
        d = 1;
        for j=1:n
            if j~= jj
                hasil(c,d) = matriks(i,j); 
                d = d +1;
            end
        end
        c = c + 1; 
    end
end

Dalam skrip di atas terlihat bahwa yang pertama diuji adalah metode eliminasi Gausss, kemudian metode ekspansi Laplace, dan yang ketiga perintah built-in di MATLAB. Saya kemudian mencoba matriks dengan beberapa ukuran untuk mengukur ketiga metode tersebut. Pertama matriks ukuran 10 x 10. Hasil eksekusinya bisa dilihat pada gambar berikut ini.



Terlihat bahwa metode ketiga memiliki waktu eksekusi yang jauh lebih cepat ketimbang dua metode sebelumnya. Hal ini tentu dikarenakan kodrat metode ini yang ditulis langsung dengan bahasa yang terkompilasi. Hasil yang berbeda terlihat ketika matriks yang akan dihitung adalah matriks ukuran 100 x 100, 200 x 200, dan 300 x 300. Perhatikan gambar, gambar berikut.







Terlihat bahwa akurasi pengerjaan metode pertama menjadi berkurang seiring bertambahnya ukuran matriks. Sementara akurasi pengerjaan metode kedua boleh dibilang cukup meyakinkan karena nilainya sama saja dengan  hasil perhitungan metode ketiga dalam tiga gambar tersebut.