正剧开始:
星历2016年05月02日 13:26:38, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[矩阵与变换]。
<span style="font-size:18px;"> if (1) { var mathText = new MathText(); var matrix = new Matrix(); var x = y = 20; //希腊字母表(存此用于Ctrl C/V //ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ //αβγδεζηθικλμνξοπρστυφχψω //例3 var A = [[1, 1], [0, 1]]; var B = [[1, -1], [-2, 3]]; var mulAB = matrix.multiple(A, B); mathText.printMatrix(mulAB, x, y, 100); x+=120; A = [[1, 2], [3, 4]]; B = [[0, 1], [1, 0]]; mulAB = matrix.multiple(A, B); mathText.printMatrix(mulAB, x, y, 100); //例 A = [[1, 1], [0, 1]]; B = matrix.deepCopy(A); for (var i = 0; i < 5; i++) { mulAB = matrix.multiple(A, B); A = mulAB; } x+=120; mathText.printMatrix(mulAB, x, y, 100); }</span>
<span style="font-size:18px;"> if (1) { var mathText = new MathText(); var matrix = new Matrix(); var x = y = 20; //希腊字母表(存此用于Ctrl C/V //ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ //αβγδεζηθικλμνξοπρστυφχψω var rank = 2; var m1 = [['cosα', '-sinα'], ['sinα', ' cosa']]; mathText.printMatrix(m1, x, y, 150); x += 180; var m2 = [[1, 0], [0, 1]]; mathText.printMatrix(m2, x, y, 60); x += 80; m2 = [[1, 0], [0, -1]]; mathText.printMatrix(m2, x, y, 80); x += 90; m2 = [[-1, 0], [0, 1]]; mathText.printMatrix(m2, x, y, 80); x += 90; m2 = [[-1, 0], [0, -1]]; mathText.printMatrix(m2, x, y, 80); x = 20; y+= 150; var m3 = [[1, 0], [0, 'k']]; mathText.printMatrix(m3, x, y, 80); x += 90; m3 = [['k', 0], [0, 1]]; mathText.printMatrix(m3, x, y, 80); x += 90; m3 = [['k_[1]', 0], [0, 'k_[2]']]; mathText.printMatrix(m3, x, y, 80); x += 90; m3 = [[1, 0], ['k', 1]]; mathText.printMatrix(m3, x, y, 80); var A = [[1,2], [3,4], [5,6], [7,8]]; var B = [[1,2,3,4], [5,6,7,8]]; var mulAB = matrix.multiple(A, B); x+=90; mathText.printMatrix(mulAB, x, y, 150); x = 20; y+= 150; A = [[-1, 0], [0, 1]]; B = [[2], [2]]; mulAB = matrix.multiple(A, B); mathText.printMatrix(mulAB, x, y, 40); x += 50; A = [[0.866, -0.5], [0.5, 0.866]]; B = [[1, 2], [0, 1]]; mulAB = matrix.multiple(A, B); mathText.printMatrix(mulAB, x, y, 150); x += 160; A = [[0.866, -0.5], [0.5, 0.866]]; B = [[1], [0]]; mulAB = matrix.multiple(A, B); mathText.printMatrix(mulAB, x, y, 70); x += 80; A = [[1, 2], [0, 1]]; B = mulAB; mulAB = matrix.multiple(A, B); mathText.printMatrix(mulAB, x, y, 70); x += 80; A = [[0.866, -0.5], [0.5, 0.866]]; B = [[1, 2], [0, 1]]; mulAB = matrix.multiple(A, B); mathText.printMatrix(mulAB, x, y, 150); }</span>
<span style="font-size:18px;"> //矩阵书写,给一块区域的左上角坐标及范围宽度和高度 //可以比较美观的写出矩阵 this.printMatrix = function(matrix, leftUpPointX, leftUpPointY, regionWidth, regionHeight) { leftUpPointX = leftUpPointX ? leftUpPointX : 20; leftUpPointY = leftUpPointY ? leftUpPointY : 20; regionWidth = regionWidth ? regionWidth : 200; var row = matrix.length; var col = matrix[0].length; var gap = 10; regionHeight = regionHeight ? regionHeight : row*(20+gap); var cellWidth = regionWidth/col-gap; var cellHeight = regionHeight/row - gap; var x = leftUpPointX; var y = leftUpPointY; var s = ''; plot.save() .beginPath() .moveTo(x, y) .lineTo(x, y+regionHeight) .moveTo(x+regionWidth, y) .lineTo(x+regionWidth, y+regionHeight) .closePath() .stroke() .restore(); var style = 'black'; var measure = 0; y += gap+15; var s1 = ''; var len = 0; var count = 0; for (var i = 0; i < row; i++) { for (var j = 0; j < col; j++) { s = matrix[i][j].toString(); len = s.length; s1 = ''; count = 0; //由于字符串中植入了许多格式识别符,这里需要去除掉 //才能比较准确的确定显示宽度 for (var n = 0; n < len; n++) { if (s[n] == '_' || s[n] == '[' || s[n] == ']' || s[n] == '^') { count++; } else { s1 += s[n]; } } measure = plot.measureText(s1); measure -= count/3*10; x += cellWidth; //右对齐 this.print(s, x-measure*1.5, y, style); x += gap; } x = leftUpPointX; y += cellHeight+gap; } }</span>
<span style="font-size:18px;"> if (1) { var matrix = new Matrix(); var d = matrix.delta([[3,1], [4, 2]]); document.write(d); }</span>
<span style="font-size:18px;">3.00 , 1.00 , 4.00 , 2.00 , 2 1.00 , 2.00 , 3.00 , 4.00 , -2 1.00 , 0.00 , 1.00 , 0.00 , 0 5.00 , -3.00 , 2.00 , -1.00 , 1 1.00 , 0.00 , 0.00 , -1.00 , -1 1.00 , 0.00 , 0.00 , -1.00 , 6.00 , -3.00 , -4.00 , 2.00 , 0 0.00 , 3.00 , 2.00 , 1.00 , -1.00 , -5 0.20 , 0.40 , 0.20 , -0.60 , if (1) { var matrix = new Matrix(); var d = matrix.delta([[3,1], [4, 2]]); matrix.print([[3,1], [4, 2]]); document.write(d+'<br/>'); d = matrix.delta([[1, 2], [3, 4]]); matrix.print([[1, 2], [3, 4]]); document.write(d+'<br/>'); d = matrix.delta([[1, 0], [1, 0]]); matrix.print([[1, 0], [1, 0]]); document.write(d+'<br/>'); d = matrix.delta([[5, -3], [2, -1]]); matrix.print([[5, -3], [2, -1]]); document.write(d+'<br/>'); var m = [[1, 0], [0, -1]]; matrix.print([[1, 0], [0, -1]]); d = matrix.delta(m); document.write(d+'<br/>'); var inv = matrix.invOfRank2(m); matrix.print(inv); m = [[6, -3], [-4, 2]]; d = matrix.delta(m); matrix.print(m); document.write(d+'<br/>'); inv = matrix.invOfRank2(m); matrix.print(inv); m = [[3, 2], [1, -1]]; d = matrix.delta(m); matrix.print(m); document.write(d+'<br/>'); inv = matrix.invOfRank2(m); matrix.print(inv); }</span>
<span style="font-size:18px;">-----原矩阵---- 3.00 , 1.00 , 4.00 , 2.00 , -----逆矩阵---- 1.00 , -0.50 , -2.00 , 1.50 , -----解矩阵---- 2.00 , -4.00 , ----- ---- -----原矩阵---- 1.00 , 2.00 , 0.00 , 1.00 , -----逆矩阵---- 1.00 , -2.00 , 0.00 , 1.00 , -----解矩阵---- -1.00 , 1.00 , ----- ---- -----原矩阵---- 0.71 , -0.71 , 0.71 , 0.71 , -----逆矩阵---- 0.71 , 0.71 , -0.71 , 0.71 , -----解矩阵---- 0.00 , 1.41 , ----- ---- -----原矩阵---- 5.00 , -3.00 , 2.00 , -1.00 , -----逆矩阵---- -1.00 , 3.00 , -2.00 , 5.00 , -----解矩阵---- -7.00 , -12.00 , ----- ---- -----原矩阵---- 3.00 , 2.00 , 1.00 , 1.00 , -----逆矩阵---- 1.00 , -2.00 , -1.00 , 3.00 , -----解矩阵---- 4.00 , -6.00 , ----- ---- -----原矩阵---- 3.00 , 1.00 , 4.00 , 2.00 , -----逆矩阵---- 1.00 , -0.50 , -2.00 , 1.50 , -----解矩阵---- 0.50 , 0.50 , ----- ---- if (1) { var matrix = new Matrix(); //例 var m = [[3, 1], [4, 2]]; var v = [[2], [0]]; var inv = matrix.invOfRank2(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----逆矩阵----'+'<br/>'); matrix.print(inv); document.write('-----解矩阵----'+'<br/>'); var mul = matrix.multiple(inv, v); matrix.print(mul); document.write('----- ----'+'<br/>'); m = [[1, 2], [0, 1]]; v = [[1], [1]]; inv = matrix.invOfRank2(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----逆矩阵----'+'<br/>'); matrix.print(inv); document.write('-----解矩阵----'+'<br/>'); mul = matrix.multiple(inv, v); matrix.print(mul); document.write('----- ----'+'<br/>'); m = [[0.707, -0.707], [0.707, 0.707]]; v = [[-1], [1]]; inv = matrix.invOfRank2(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----逆矩阵----'+'<br/>'); matrix.print(inv); document.write('-----解矩阵----'+'<br/>'); mul = matrix.multiple(inv, v); matrix.print(mul); document.write('----- ----'+'<br/>'); m = [[5, -3], [2, -1]]; v = [[1], [-2]]; inv = matrix.invOfRank2(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----逆矩阵----'+'<br/>'); matrix.print(inv); document.write('-----解矩阵----'+'<br/>'); mul = matrix.multiple(inv, v); matrix.print(mul); document.write('----- ----'+'<br/>'); m = [[3, 2], [1, 1]]; v = [[0], [-2]]; inv = matrix.invOfRank2(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----逆矩阵----'+'<br/>'); matrix.print(inv); document.write('-----解矩阵----'+'<br/>'); mul = matrix.multiple(inv, v); matrix.print(mul); document.write('----- ----'+'<br/>'); m = [[3, 1], [4, 2]]; v = [[2], [3]]; inv = matrix.invOfRank2(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----逆矩阵----'+'<br/>'); matrix.print(inv); document.write('-----解矩阵----'+'<br/>'); mul = matrix.multiple(inv, v); matrix.print(mul); document.write('----- ----'+'<br/>'); }</span>
<span style="font-size:18px;"> if (1) { var matrix = new Matrix(); //例 var m = [[1, 2], [-1, 4]]; var eigen = matrix.eigenvalue(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----特征矩阵----'+'<br/>'); matrix.print(eigen); } -----原矩阵---- 8.00 , -5.00 , 6.00 , -3.00 , -----特征矩阵---- 2.00 , 3.00 , 1.00 , 1.20 , 1.00 , 1.00 , </span>
<span style="font-size:18px;">-----原矩阵---- 0.99 , 0.05 , 0.01 , 0.95 , -----特征矩阵---- 0.94 , 1.00 , 1.00 , -1.00 , 5.00 , 1.00 , if (1) { var matrix = new Matrix(); var m = [[0.99,0.05],[0.01,0.95]]; var eigen = matrix.eigenvalue(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----特征矩阵----'+'<br/>'); matrix.print(eigen); } </span>
<span style="font-size:18px;">[5, 6], [1, 1] 6.00 , 7.00 , ----- ---- 13.00 , 15.00 , ----- ---- 29.00 , 33.00 , ----- ---- 67.00 , 75.00 , ----- ---- 161.00 , 177.00 , ----- ---- 403.00 , 435.00 , if (1) { var matrix = new Matrix(); //习题4.2 -- 1 var m = [[8, -5], [6, -3]]; var v = [[6], [7]]; /* var eigen = matrix.eigenvalue(m); document.write('-----原矩阵----'+'<br/>'); matrix.print(m); document.write('-----特征矩阵----'+'<br/>'); matrix.print(eigen); */ matrix.print(v); var mulAB = matrix.multiple(m, v); for (var i = 0; i < 5; i++) { document.write('----- ----'+'<br/>'); matrix.print(mulAB); v = mulAB; mulAB = matrix.multiple(m, v); } }</span>
<span style="font-size:18px;">def fun(n): A = [2**n*5+3**n, 2**n*6+3**n]; print(A); def tmp(): fun(5); fun(100); </span>
<span style="font-size:18px;">/** * @usage 矩阵类 * @author mw * @date 2016年03月24日 星期四 14:51:45 * @param * @return * */ function Matrix() { this.delta = function(matrix) { var size = matrix.length; if (!matrix[0].length) { return 0; } else { if (matrix[0].length != size) { return 0; } if (size < 1) { return 0; } else if (size == 1) { return matrix[0][0]; } else { var d = 0; var subMatrix = []; for (var i = 0; i < size; i++) { subMatrix = this.subSet(matrix, i, 0); d += Math.pow(-1, i)*matrix[i][0]*this.delta(subMatrix); } return d; } } } this.subSet = function(matrix, row, col) { var size = matrix.length; if (!matrix[0].length) { return []; } else { if (matrix[0].length != size) { return []; } var newMatrix = new Array(); var rowArray= new Array(); for (var i = 0; i < size; i++) { if (i == row) { continue; } else { rowArray = []; for (var j = 0; j < size; j++) { if (j == col) { continue; } else { rowArray.push(matrix[i][j]); } } newMatrix.push(rowArray) } } return newMatrix; } } this.identityMatrix = function(rank) { var newMatrix = new Array(); var rowArray= new Array(); for (var i = 0; i < rank; i++) { rowArray = []; for (var j = 0; j < rank; j++) { if (j == i) { rowArray.push(1); } else { rowArray.push(0); } } newMatrix.push(rowArray); } return newMatrix; } //建立row*col空矩阵 this.zeroMatrix = function(row, col) { var newMatrix = new Array(); var rowArray= new Array(); for (var i = 0; i < row; i++) { rowArray = []; for (var j = 0; j < col; j++) { rowArray.push(0); } newMatrix.push(rowArray); } return newMatrix; } //把从1-n的n个数按顺序放到矩阵中 this.sequenceMatrix = function(rank) { var newMatrix = new Array(); var rowArray= new Array(); var count = 0; for (var i = 0; i < rank; i++) { rowArray = []; for (var j = 0; j < rank; j++) { count++; rowArray.push(count); } newMatrix.push(rowArray); } return newMatrix; } this.print = function(matrix) { var size = matrix.length; if (!matrix[0].length) { return []; } else { var rSize = matrix[0].length; var s = ''; for (var i = 0; i < size; i++) { s = ''; for (var j = 0; j < rSize; j++) { s += matrix[i][j].toFixed(2) + ' , '; } document.write(s+'<br/>'); } } } this.deepCopy = function(matrix) { var size = matrix.length; if (!matrix[0].length) { return []; } else { var rSize = matrix[0].length; var newMatrix = new Array(); var rowArray= new Array(); for (var i = 0; i < size; i++) { rowArray = []; for (var j = 0; j < rSize; j++) { rowArray.push(matrix[i][j]); } newMatrix.push(rowArray); } return newMatrix; } } /** * @usage 矩阵的乘法 * @author mw * @date 2016年05月02日 星期一 10:44:46 * @param * @return * */ this.multiple = function(Matrix1, Matrix2) { var row1 = Matrix1.length; var col1 = Matrix1[0].length; var row2 = Matrix2.length; var col2 = Matrix2[0].length; var A = [row1, col1, row2, col2]; if (col1 != row2) { return this.zeroMatrix(row1, col2); } var mulResult = this.zeroMatrix(row1, col2); for (var i = 0; i < row1; i++) { for (var j = 0; j < col2; j++) { for (var k = 0; k < row2; k++) { mulResult[i][j] += Matrix1[i][k]*Matrix2[k][j]; } } } return mulResult; } //二阶矩阵的逆 this.invOfRank2 = function(Matrix) { var d = this.delta(Matrix); if (d != 0) { return [[Matrix[1][1]/d, -Matrix[0][1]/d], [-Matrix[1][0]/d, Matrix[0][0]/d]]; } else { return this.zeroMatrix(2, 2); } } //二阶矩阵的特征值 this.eigenvalue = function(Matrix) { var a = Matrix[0][0]; var b = Matrix[0][1]; var c = Matrix[1][0]; var d = Matrix[1][1]; var judge = (a+d)*(a+d)-4*(a*d-b*c); if ( judge >= 0) { var lambda_1 = 0.5*((a+d)-Math.sqrt(judge)); var lambda_2 = 0.5*((a+d)+Math.sqrt(judge)); } //特征向量有很多组,这里随便取一组 //特征值放在第一行,然后是每个特征值对应的一个特征向量 if (b != 0) { return [[lambda_1, lambda_2], [1, (lambda_1-a)/b], [b/(lambda_2-a), 1]]; } else if (c != 0) { return [[lambda_1, lambda_2], [1, c/(lambda_1-d)], [(lambda_2-d)/c, 1]]; } } }</span>