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.
No comments:
Post a Comment