Algorithma Gauss-Jordan untuk Mencari Invers Matrix dengan Javascript

Awal Mula

Suatu hari, penulis mendapat email dari pengguna aplikasi Invers Matrix penulis yang berbunyi seperti di bawah ini.



Intinya berdasarkan aplikasi yang penulis buat, dia meminta bantuan penulis untuk menyelesaikan algorithma perkalian matrix-nya, untuk problem perkalian pangkat.

Yang mana problem itu merupakan tugas kuliahnya.

Karena sudah memiliki kode, mulanya penulis menganggap dia hanya butuh bantuan sedikit saja menyelesaikan algorithmanya tersebut.

Maka untuk praktisnya, agar tidak ribet menjelaskan, penulis meminta kode yang dia buat, lalu membantu mengoreksi kodenya saja secara langsung.

Dia menggunakan GUI (Graphic User Interface) berbasis C++, entah menggunakan compiler apa, dan penulis hanya mengedit bagian fungsi perhitungan matrix perpangkatannya saja.

Perbaikan itu selesai, dan hasilnya sesuai dengan yang penulis post di tulisan blog ini yang berjudul "Algorithma Perkalian Pangkat Matrix dengan C++".

Menggangu

Selama beberapa hari kemudian, tidak disangka dia terus berusaha menghubungi penulis. 

Masih dengan aplikasi yang sama, dia meminta bantuan penulis untuk menyelesaikan algorithma matrix inversnya.

Tentu karena sudah merasa cukup membantu dengan mengedit kodenya sebelumnya, untuk masalah invers, penulis menolak untuk membantunya secara langsung.

Penulis hanya memberi petunjuk, agar dia belajar perhitungan numerik, dan menyelesaian problem invers matrix menggunakan metode eliminasi Gauss-Jordan, sebagaimana yang penulis lakukan pada aplikasi Invers Matrix penulis.

Bukannya tidak bisa, penulis hanya ingin dia belajar menyelesaiakannya sendiri.

Nglunjak

Dikasih hati, malah minta jantung.

Mungkin peribahasa inilah yang cocok untuk mahasiswa itu.

Dengan bantuan yang didapatnya dengan mudah sebelumnya, sepertinya dia berusaha untuk mendapatkan hal yang sama untuk invers.

Hal ini terbukti sesuai cuplikan chat dia dibawah ini:


Artinya, meskipun penulis berkali-kali berusaha meminta dia belajar sendiri dan menyelesaikan dengan belajar dulu eliminasi Gauss-Jordan, dia tidak mendengarkan dan bersikeras meminta bantuan penulis (kode penulis) sebab katanya terbatas waktu.

Karena merasa dia hanya memanfaatkan penulis, maka penulis pun marah dan tidak tahan, sehingga memunculkan kata-kata chat berikut:


Sungguh penulis sangat tidak menyukai orang yang hanya suka memperalat orang, terutama dengan kemasan "meminta tolong" seperti ini.

Kode

Link berikut ini, adalah implementasi eliminasi Gauss-Jordan dengan Javascript, dan bukti bahwa penulis tidak pelit.


Kode tersebut sesuai kode yang penulis cantumkan di bawah, yang dapat di coba dan download di link di atas, dengan cara save as.

Penulis hanya ingin setiap mahasiswa itu belajar, bukan memanfaatkan orang lain seenak hatinya.

Dan yang terpenting adalah mereka tahu etika bagaimana untuk menghargai orang lain.

Disini penulis tidak menyertakan pembahasan secara matematis mengenai Gauss-Jordan, karena dapat ditemukan dengan mudah di sumber internet lain.
<html> 
<head> 
<title>Invers Matrix dengan Javascript</title> 
</head> 
<body> 
<div style="text-align:right;border-bottom:1px solid black;padding:5px;"> 
<a href="edugameapp.com">Home</a> 
</div> 
<script> 
var DIMENSION=0; 
var A=[],B=[],C=[],D=[],E=[]; 
 
function makeMatrix() 
{ 
 var row=parseInt(document.getElementById("row").value); 
 var col=parseInt(document.getElementById("column").value); 
 if(isNaN(row)||isNaN(col)){ 
  alert("Row and Column must be integer!"); 
 }else{ 
  if(row<1 || col<1){ 
   alert("Minimum Row and Column is 1!"); 
  }else if(row!=col){ 
   alert("Row and Column must be same!"); 
  }else{ 
   DIMENSION=row; 
   document.getElementById("maintable").innerHTML=""; 
   for(var i=0;i<row;i++){ 
    var str="<tr>"; 
    for(var j=0;j<col;j++){ 
     str+="<td><input id='A"+i+""+j+"' type='text' style='text-align:center;width:50px;'/></td>"; 
    } 
    str+="</tr>"; 
    document.getElementById("maintable").innerHTML+=str; 
   } 

   document.getElementById("tablegaussjordan").innerHTML=""; 
   for(var i=0;i<row;i++){ 
    var str="<tr>"; 
    for(var j=0;j<col;j++){ 
     str+="<td><input id='B"+i+""+j+"' type='text' value='' style='text-align:center;width:50px;'/></td>"; 
    } 
    str+="</tr>"; 
    document.getElementById("tablegaussjordan").innerHTML+=str; 
   } 

   document.getElementById("tablegaussjordan1").innerHTML=""; 
   for(var i=0;i<row;i++){ 
    var str="<tr>"; 
    for(var j=0;j<col;j++){ 
     str+="<td><input id='C"+i+""+j+"' type='text' value='"+((i==j)?1:0).toString()+"' style='text-align:center;width:50px;'/></td>"; 
    } 
    str+="</tr>"; 
    document.getElementById("tablegaussjordan1").innerHTML+=str; 
   } 

   document.getElementById("tableresult").innerHTML=""; 
   for(var i=0;i<row;i++){ 
    var str="<tr>"; 
    for(var j=0;j<col;j++){ 
     str+="<td><input id='D"+i+""+j+"' type='text' value='' style='text-align:center;width:50px;'/></td>"; 
    } 
    str+="</tr>"; 
    document.getElementById("tableresult").innerHTML+=str; 
   } 

   document.getElementById("tablebukti1").innerHTML=""; 
   for(var i=0;i<row;i++){ 
    var str="<tr>"; 
    for(var j=0;j<col;j++){ 
     str+="<td><input id='E"+i+""+j+"' type='text' value='' style='text-align:center;width:50px;'/></td>"; 
    } 
    str+="</tr>"; 
    document.getElementById("tablebukti1").innerHTML+=str; 
   } 

   document.getElementById("tablebukti2").innerHTML=""; 
   for(var i=0;i<row;i++){ 
    var str="<tr>"; 
    for(var j=0;j<col;j++){ 
     str+="<td><input id='F"+i+""+j+"' type='text' value='' style='text-align:center;width:50px;'/></td>"; 
    } 
    str+="</tr>"; 
    document.getElementById("tablebukti2").innerHTML+=str; 
   } 

   document.getElementById("tablebukti3").innerHTML=""; 
   for(var i=0;i<row;i++){ 
    var str="<tr>"; 
    for(var j=0;j<col;j++){ 
     str+="<td><input id='G"+i+""+j+"' type='text' value='' style='text-align:center;width:50px;'/></td>"; 
    } 
    str+="</tr>"; 
    document.getElementById("tablebukti3").innerHTML+=str; 
   } 
  } 
 } 
} 
 
function calculate() 
{ 
 var row=parseInt(document.getElementById("row").value); 
 var col=parseInt(document.getElementById("column").value); 
 if(isNaN(row)||isNaN(col)){ 
  alert("Row and Column must be integer!"); 
 }else{ 
  if(row<1 || col<1){ 
   alert("Minimum Row and Column is 1!"); 
  }else if(row!=col){ 
   alert("Row and Column must be same!"); 
  }else{ 
   for(var i=0;i<row;i++){ 
    for(var j=0;j<col;j++){ 
     A[i+DIMENSION*j]=parseFloat(document.getElementById("A"+i+""+j).value); 
     B[i+DIMENSION*j]=A[i+DIMENSION*j]; 
     C[i+DIMENSION*j]=0; 
     if(i==j)C[i+DIMENSION*j]=1; 
    } 
   } 

   var b=cekDiagonal(0); 
   if(!b)alert("Cannot calculate invers!"); 

   for(var k=0;k<row;k++){ 
    var p=B[k+DIMENSION*k]; 
    if(p==0){ 
     alert("Cannot calculate invers!"); 
     return; 
    } 
    for(var j=0;j<col;j++){ 
     B[k+DIMENSION*j]/=p; 
     C[k+DIMENSION*j]/=p; 
    } 

    for(var i=k+1;i<row;i++){ 
     p=B[i+DIMENSION*k]; 
     for(var j=0;j<col;j++){ 
      B[i+DIMENSION*j]-=B[k+DIMENSION*j]*p; 
      C[i+DIMENSION*j]-=C[k+DIMENSION*j]*p; 
     } 
    } 
   } 

   for(var k=row-1;k>=0;k--){ 
    for(var i=k-1;i>=0;i--){ 
     var p=B[i+DIMENSION*k]; 
     for(var j=row-1;j>=0;j--){ 
      B[i+DIMENSION*j]-=B[k+DIMENSION*j]*p; 
      C[i+DIMENSION*j]-=C[k+DIMENSION*j]*p; 
     } 
    } 
   } 

   for(var i=0;i<row;i++){ 
    for(var j=0;j<col;j++){ 
     var sum=0.0; 
     for(var k=0;k<row;k++){ 
      sum+=A[i+DIMENSION*k]*C[k+DIMENSION*j]; 
     } 
     D[i+DIMENSION*j]=sum; 
    } 
   } 

   masukkan(); 
  } 
 } 
} 
 
function masukkan() 
{ 
 for(var i=0;i<DIMENSION;i++){ 
  for(var j=0;j<DIMENSION;j++){ 
   document.getElementById("E"+i+""+j).value=A[i+DIMENSION*j]; 
   document.getElementById("B"+i+""+j).value=B[i+DIMENSION*j]; 
   document.getElementById("C"+i+""+j).value=C[i+DIMENSION*j]; 
   document.getElementById("D"+i+""+j).value=C[i+DIMENSION*j]; 
   document.getElementById("F"+i+""+j).value=C[i+DIMENSION*j]; 
   document.getElementById("G"+i+""+j).value=D[i+DIMENSION*j]; 
  } 
 } 
} 
 
function cekDiagonal(a) 
{ 
 var row=DIMENSION; 
 var col=DIMENSION; 
 if(a>row*10)return false; 
 for(var i=0;i<row;i++){ 
  var nilai=B[i+DIMENSION*i]; 
  if(nilai==0){ 
   var k=(i+Math.round(Math.random()*row))%row; 
   if(k==i)return cekDiagonal(a+1); 
   else{ 
    for(var j=0;j<col;j++){ 
     var stro=B[i+DIMENSION*j]; 
     B[i+DIMENSION*j]=B[k+DIMENSION*j]; 
     B[k+DIMENSION*j]=stro; 

     stro=C[i+DIMENSION*j]; 
     C[i+DIMENSION*j]=C[k+DIMENSION*j]; 
     C[k+DIMENSION*j]=stro; 
    } 
    return cekDiagonal(a+1); 
   } 
  } 
 } 
 return true; 
} 
</script> 
 
<h1>Invers Matrix with Gauss-Jordan Elimination Method</h1> 
<div> 
Matrix dimension<br/> 
<input id="row" type="text" value="1" size="3"/>X<input id="column" type="text" value="1" size="3"/><input type="submit" value="submit" onclick="makeMatrix()"/> 
</div> 
 
<div style="margin:20px;display:flex;"> 
<div style="align-self: center">A=</div> 
<div style="align-self: center"> 
<table id="maintable" style="border-right: 2px solid black;border-left: 2px solid black;"> 
</table> 
</div> 
</div> 
 
<div><input type="submit" value="Calculate" onclick="calculate()"/></div> 
 
<div style="margin:20px;display:flex;"> 
<div style="align-self: center"> 
<table id="tablegaussjordan" style="border-right: 1px dashed black;border-left: 2px solid black;"> 
</table> 
</div> 
<div style="align-self: center"> 
<table id="tablegaussjordan1" style="border-right: 2px solid black;border-left: 1px dashed black;"> 
</table> 
</div> 
</div> 
 
<div style="margin:20px;display:flex;"> 
<div style="align-self: center">A<sup>-1</sup>=</div> 
<div style="align-self: center"> 
<table id="tableresult" style="border-right: 2px solid black;border-left: 2px solid black;"> 
</table> 
</div> 
</div> 
 
<div style="margin:20px;display:flex;"> 
<div style="align-self: center">A*A<sup>-1</sup>=</div> 
<div style="align-self: center"> 
<table id="tablebukti1" style="border-right: 2px solid black;border-left: 2px solid black;"> 
</table> 
</div> 
<div style="align-self: center"> 
<table id="tablebukti2" style="border-right: 2px solid black;border-left: 2px solid black;"> 
</table> 
</div> 
<div style="align-self: center"> 
= 
</div><div style="align-self: center"> 
<table id="tablebukti3" style="border-right: 2px solid black;border-left: 2px solid black;"> 
</table> 
</div> 
</div> 
 
<div>Created by uboiz@yahoo.com</div> 
 
</body> 
</html> 

Cuplikan

Berikut ini cuplikan lain, beberapa hasil chat dengan mahasiswa di atas, yang membuat penulis kesal.







Komentar



Postingan populer dari blog ini

Kumpulan Source Code Greenfoot

Algorithma Coretan Abstrak dengan HTML5 Canvas

Cara Membuat Halaman HTML Sederhana

Game TicTacToe dengan Greenfoot

Kode Greenfoot Game Snake Sederhana

Algoritma Tombol Putar dengan Greenfoot

Honeycomb Style Wallpaper dengan HTML5 Canvas

Tips Agar Website Anda Segera di Terima oleh Google Adsense dan di-Monetize

Modifikasi Obyek 3D Hellosceneform dengan MeshLab

Selamatan Latar Glundengan Bubuk Banyuwangi