Skip to content

Instantly share code, notes, and snippets.

@trpfrog
Created August 5, 2019 13:55
Show Gist options
  • Select an option

  • Save trpfrog/e42f1358f406f279249bc6c9760c7d36 to your computer and use it in GitHub Desktop.

Select an option

Save trpfrog/e42f1358f406f279249bc6c9760c7d36 to your computer and use it in GitHub Desktop.
3*3の逆行列を計算します
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="favicon.ico">
<script type="text/javascript" src="./InverseMatrix.js"></script>
<style>
body{ margin: 2em; font-size: 3em;}
input{ font-size: 1em; text-align: center; width: 3em;}
button{ font-size: 0.8em; }
</style>
<script>
function inputArea (id){
html = '<input type="text" id="'+id+'" >';
document.write(html);
}
function readArea (id){
html = '<input type="text" id="'+id+'" readonly="readonly">';
document.write(html);
}
function calc(){
var aa = parseFloat(document.getElementById("aa").value);
var ab = parseFloat(document.getElementById("ab").value);
var ac = parseFloat(document.getElementById("ac").value);
var ba = parseFloat(document.getElementById("ba").value);
var bb = parseFloat(document.getElementById("bb").value);
var bc = parseFloat(document.getElementById("bc").value);
var ca = parseFloat(document.getElementById("ca").value);
var cb = parseFloat(document.getElementById("cb").value);
var cc = parseFloat(document.getElementById("cc").value);
var matrix = createMatrix(aa,ab,ac,ba,bb,bc,ca,cb,cc);
var det = getDet(matrix);
matrix = getInverseMatrix(matrix);
document.getElementById("aaR").value = matrix[0][0];
document.getElementById("abR").value = matrix[0][1];
document.getElementById("acR").value = matrix[0][2];
document.getElementById("baR").value = matrix[1][0];
document.getElementById("bbR").value = matrix[1][1];
document.getElementById("bcR").value = matrix[1][2];
document.getElementById("caR").value = matrix[2][0];
document.getElementById("cbR").value = matrix[2][1];
document.getElementById("ccR").value = matrix[2][2];
document.getElementById("det").value = det;
}
</script>
</head>
<body>
<h1 style="font-size: 1em;"> 逆行列計算機 </h1>
<p>
<table>
<tr>
<td></td>
<td><script>inputArea("aa");</script></td>
<td><script>inputArea("ab");</script></td>
<td><script>inputArea("ac");</script></td>
</tr>
<td>A &nbsp; = </td>
<td><script>inputArea("ba");</script></td>
<td><script>inputArea("bb");</script></td>
<td><script>inputArea("bc");</script></td>
<tr>
</tr>
<td></td>
<td><script>inputArea("ca");</script></td>
<td><script>inputArea("cb");</script></td>
<td><script>inputArea("cc");</script></td>
<tr>
<td></td>
<td style="font-size: 2em;"> </td>
<td style="color: gray; font-size: 0.8em;">
↓<button onclick="calc()">計算</button>
</td>
<td></td>
</tr>
<tr>
<td></td>
<td><script>readArea("aaR");</script></td>
<td><script>readArea("abR");</script></td>
<td><script>readArea("acR");</script></td>
<td>  1</td>
</tr>
<td>A<sup>-1</sup> = </td>
<td><script>readArea("baR");</script></td>
<td><script>readArea("bbR");</script></td>
<td><script>readArea("bcR");</script></td>
<td> ×──</td>
<tr>
</tr>
<td></td>
<td><script>readArea("caR");</script></td>
<td><script>readArea("cbR");</script></td>
<td><script>readArea("ccR");</script></td>
<td> &nbsp;<input type="text" id="det" readonly="readonly" style="width:2em"></td>
</table>
</p>
</body>
function hasInverseMatrix(matrix){
return getDet(matrix)!=0
}
function getInverseMatrix(matrix){
let det = getDet(matrix);
//逆行列の初期化
let inverse = new Array(3);
for(i=0;i<inverse.length;i++){
inverse[i] = new Array(3).fill(0);
}
for(let i=0;i<3;i++){
for(let j=0;j<3;j++){
inverse[i][j] = getCofactor(i,j,matrix);
}
}
inverse = transpose(inverse);
multiply(det,matrix)
return inverse;
}
function createMatrix(aa,ab,ac,ba,bb,bc,ca,cb,cc){
return [[aa, ab, ac],
[ba, bb, bc],
[ca, cb, cc]];
}
function multiply(scalar,matrix){
for(let i=0;i<matrix.length;i++){
for(let j=0;j<matrix.length;j++){
matrix[i][j] *= scalar;
}
}
return matrix;
}
function getCofactor(i,j,matrix){
let elements = [0,0,0,0];
let x = 0; //カウンタ
for(let p=0;p<3;p++){
if (p==i) continue;
for(let q=0;q<3;q++){
if (q==j) continue;
elements[x] = matrix[p][q];
x++;
}
}
matrix = [[elements[0],elements[1]],
[elements[2],elements[3]]];
return getDet(matrix)*((i+j)%2==0 ? 1 : -1);
}
function transpose(matrix){
//2次元配列の初期化
let transposed = new Array(matrix.length);
for(i=0;i<transposed.length;i++){
transposed[i] = new Array(matrix.length).fill(0);
}
//転置
for(let i=0;i<3;i++){
for(let j=0;j<3;j++){
transposed[i][j] = matrix[j][i];
}
}
return transposed;
}
function getDet(matrix){
if(matrix.length==3){
let det = 0;
det += matrix[0][0]*matrix[1][1]*matrix[2][2];
det += matrix[1][0]*matrix[2][1]*matrix[0][2];
det += matrix[0][1]*matrix[1][2]*matrix[2][0];
det -= matrix[2][0]*matrix[1][1]*matrix[0][2];
det -= matrix[0][0]*matrix[1][2]*matrix[2][1];
det -= matrix[0][1]*matrix[1][0]*matrix[2][2];
return det;
}else if(matrix.length==2){
let det = 0;
det += matrix[0][0]*matrix[1][1];
det -= matrix[0][1]*matrix[1][0];
return det;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment