// simeq.swift solve A X = Y given matrix A and vector Y // X is solution // WRITTEN BY : JON SQUIRE , 3 Dec 2017 // ORIGONAL DEC 1959 for IBM 650, TRANSLATED TO OTHER LANGUAGES // e.g. FORTRAN converted to Ada converted to C and many other languages // X[] = simeq(A[][],Y[]) // X[] = simeqb(AY[][]) Y as last column of A // X[] = simeq2(n,A[][],X[],Y[]) func simeq(_ A: [[Double]], _ Y: [Double]) -> [Double] { // X let n = A.count let m = n+1 var X = [Double](repeating:0.0,count:n) var B = [[Double]](repeating:[Double](repeating:0.0,count:m),count:n) var ROW = [Int](repeating:0,count:n) // ROW INTERCHANGE INDICIES var HOLD = 0 var I_PIVOT = 0 // PIVOT INDICIES var PIVOT = 0.0 // PIVOT ELEMENT VALUE var ABS_PIVOT = 0.0 // check sizes if n != A[0].count || n != Y.count { print("inconistant size arrays rows=\(n),cols=\(A[0].count),Y=\(Y.count)") return X } // BUILD WORKING DATA STRUCTURE for i in 0.. ABS_PIVOT { I_PIVOT = i PIVOT = B[ROW[i]][k] ABS_PIVOT = abs(PIVOT) } } // HAVE PIVOT, INTERCHANGE ROW POINTERS HOLD = ROW[k] ROW[k] = ROW[I_PIVOT] ROW[I_PIVOT] = HOLD // CHECK FOR NEAR SINGULAR if ABS_PIVOT < 1.0E-32 { for j in k.. [Double] { // X let n = AY.count let m = n+1 var X = [Double](repeating:0.0,count:n) var B = [[Double]](repeating:[Double](repeating:0.0,count:m),count:n) var ROW = [Int](repeating:0,count:n) // ROW INTERCHANGE INDICIES var HOLD = 0 var I_PIVOT = 0 // PIVOT INDICIES var PIVOT = 0.0 // PIVOT ELEMENT VALUE var ABS_PIVOT = 0.0 // check sizes if m != AY[0].count { print("inconistant size arrays rows=\(n),cols=\(AY[0].count)") return X } // BUILD WORKING DATA STRUCTURE for i in 0.. ABS_PIVOT { I_PIVOT = i PIVOT = B[ROW[i]][k] ABS_PIVOT = abs(PIVOT) } } // HAVE PIVOT, INTERCHANGE ROW POINTERS HOLD = ROW[k] ROW[k] = ROW[I_PIVOT] ROW[I_PIVOT] = HOLD // CHECK FOR NEAR SINGULAR if ABS_PIVOT < 1.0E-32 { for j in k.. ABS_PIVOT) { I_PIVOT = i PIVOT = B[ROW[i]][k] ABS_PIVOT = abs(PIVOT) } } // HAVE PIVOT, INTERCHANGE ROW POINTERS HOLD = ROW[k] ROW[k] = ROW[I_PIVOT] ROW[I_PIVOT] = HOLD // CHECK FOR NEAR SINGULAR if ABS_PIVOT < 1.0E-32 { for j in k+1.. [Double] { let n = a.count var prod = [Double](repeating:0.0,count:n) for i in 0..