// test_simeq.swift solve A X = Y given matrix A and vector Y #if os(OSX) || os(iOS) // for libraries, portable for OSX and Linux import Foundation // or Playground #elseif os(Linux) import Glibc #endif print("test_simeq.swift running simeq") var A = [[1.0, 2.0, 3.0], [2.0, 4.0, 4.0], [3.0, -2.0, -1.0]] print("A = \(A) \n") var X = [2.0, 5.0, -3.0] print("X = \(X) \n") var Y = matvecmul(A, X) print("Y = \(Y) \n") var Xr = [0.0, 0.0, 0.0] Xr = simeq(A, Y) print("Xr = simeq(A, Y) =\(Xr) \n") print("check Xr about X with roundoff") print("\ntest_simeq.swift running simeqb") let n = 3 let m = 4 var AY = [[Double]](repeating:[Double](repeating:0.0,count:m),count:n) for i in 0.. [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..