Created
August 5, 2019 13:55
-
-
Save trpfrog/e42f1358f406f279249bc6c9760c7d36 to your computer and use it in GitHub Desktop.
3*3の逆行列を計算します
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!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 = </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> <input type="text" id="det" readonly="readonly" style="width:2em"></td> | |
| </table> | |
| </p> | |
| </body> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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