-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgauss.js
109 lines (101 loc) · 3.31 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//created by talhakkas date:14.01.2013-
function singular(A) {
alert("Matris Singular oldugu için çözümü veremiyoruz.");
createDiv("Singular matris"+ stringfyMatrix(A, "Matris") + "\n", "Singular denklem 0*X = 5 gibi anlamsiz denklemlerdir");
return -1;
}
// Attempt to factor the matrix A as A = LU using direct
// Gauss elimination (without row interchanges).
function factorDirectLU(A) {
var n = A[0].length - 1;
var m = A.length;
var j, k, pivot, multiplier;
for (var k = 0; k < n ; k++) {
A = serbestDegisken(A)
createDiv((k+1) + ". Asama" + "\n", "Basamak formuna gelene kadar her bir sutunun alt kisimlari 0 a esitlenecek");
A=cleanMatrix(A);
m = A.length;
var max_row = k;
for (var j = k; j < m; j++){
if (Math.abs(A[j][k]) > Math.abs(A[max_row][k]))
max_row = j;
}
// swap max row with row i of [A:y]
createDiv("R"+(max_row + 1) +"<---->"+ "R" + (k+1) + "\n","Satirlarini yer degistiriyoruz");
for (var t = k; t <= n ; t++){
var tmp = A[k][t];
A[k][t] = A[max_row][t];
A[max_row][t] = tmp;
}
var pivot = A[k][k];
if (pivot == 0)return singular(A);
for (var i = k + 1; i < m; i++) {
var multiplier = A[i][k]/pivot;
createDiv("R"+(i + 1) + "<---" + "R" + (i+1) + "- (" + stringifyNum(multiplier) +"* R" + (k+1) + ")\n","R"+(i + 1) + " satirindan " + stringifyNum(multiplier) + " adet " + "R" + (k+1)+ " sutununu çikartiyoruz");
A[i][k] = 0;
for (var j = k + 1; j < n+1; j++) A[i][j] -= multiplier*A[k][j]
}
for(var i = 0; i < m; i++){
var val = true;
for(var j = 0; j < n; j++){
if(A[i][j] != 0) val=false;
}
if(val){
if(A[i][n] == 0) {
createDiv((i + 1)+". satiri yok ediyoruz" + stringfyMatrix(A, "Matris") + "\n","Tüm degerleri 0 olan bir denklemin (0*X = 0) hiç bir anlami olmadigindan çikartilir");
A.splice(i);
m = A.length;
}else{
return singular(A);
}
}
}
createDiv((k+1) + ". degisken elemine edildiginde" + stringfyMatrix(A, "Matris") + "\n", "Bu islemler uygulandiginda matrisin hali");
}
// Test a[n-1,n-1].
console.log(n);
if (A[n-1][n-1] == 0) return singular(A)
if (n != A.length) factorDirectLU(A,1)
return 0;
}
// Solve Ax = y after A has been factored as A = LU.
function substitute(A,X){
var j, k;
var N = A[0].length - 1;
var M = A.length;
for (var j = N - 1; j >= 0; j--)
{
var sum = 0.0;
for (var k = j+1; k < M; k++)
sum += A[j][k]*X[k];
X[j] = (A[j][N] - sum)/A[j][j];
createDiv((j+1) + ". degisken = " + stringifyNum(X[j]) + "\n", "Basamak formunda en alt basamaktan baslayarak yukari çikacagiz");
}
}
function cleanMatrix(A){
for(var i=0; i<A.length;i++){
for(var j=i+1; j<A.length; j++){
if(similar(A[i],A[j])){
A.splice(j);
createDiv((j + 1)+". satiri "+(i+1)+". satirla ayni oldugu için yok ediyoruz" + stringfyMatrix(A, "Matris") + "\n", "Ayni olan iki denklemin matriste yeri yoktur");
}
}
}
return A
}
function similar(a,b){
var val = a.lenght == b.lenght;
var mul = null;
for(var i=0; i<b.length && val; i++){
if (b[i]!= 0 && a[i] != 0){
if(mul != null){
val = a[i]/b[i] == mul;
}else{
mul = a[i]/b[i] ;
}
}else{
val = !(b[i]!= 0 || a[i] != 0);
}
}
return val;
}