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.


















