-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathgauss.js
71 lines (60 loc) · 1.53 KB
/
gauss.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
var abs = Math.abs;
function array_fill(i, n, v) {
var a = [];
for (; i < n; i++) {
a.push(v);
}
return a;
}
/**
* Gaussian elimination
* @param array A matrix
* @param array x vector
* @return array x solution vector
*/
function gauss(A, x) {
var i, k, j;
// Just make a single matrix
for (i=0; i < A.length; i++) {
A[i].push(x[i]);
}
var n = A.length;
for (i=0; i < n; i++) {
// Search for maximum in this column
var maxEl = abs(A[i][i]),
maxRow = i;
for (k=i+1; k < n; k++) {
if (abs(A[k][i]) > maxEl) {
maxEl = abs(A[k][i]);
maxRow = k;
}
}
// Swap maximum row with current row (column by column)
for (k=i; k < n+1; k++) {
var tmp = A[maxRow][k];
A[maxRow][k] = A[i][k];
A[i][k] = tmp;
}
// Make all rows below this one 0 in current column
for (k=i+1; k < n; k++) {
var c = -A[k][i]/A[i][i];
for (j=i; j < n+1; j++) {
if (i===j) {
A[k][j] = 0;
} else {
A[k][j] += c * A[i][j];
}
}
}
}
// Solve equation Ax=b for an upper triangular matrix A
x = array_fill(0, n, 0);
for (i=n-1; i > -1; i--) {
x[i] = A[i][n]/A[i][i];
for (k=i-1; k > -1; k--) {
A[k][n] -= A[k][i] * x[i];
}
}
return x;
}
module.exports = gauss;