Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. def getFloatArray(matrix):
  2. return [float(element) for element in matrix]
  3.  
  4.  
  5. def matrixMinusMatrix(matrix_1, matrix_2):
  6. return np.subtract(np.array(matrix_1), np.array(getFloatArray(matrix_2)))
  7.  
  8.  
  9. def matrixMultiplyVector(matrix, vector):
  10. result_array = [0 for index in range(0, len(matrix))]
  11.  
  12. for line_index in range(0, len(matrix)):
  13. line_multiplication = 0
  14. for elements in matrix[line_index]:
  15. value = elements[0]
  16. column_index = elements[1]
  17. line_multiplication += value * vector[column_index]
  18. result_array[line_index] = line_multiplication
  19.  
  20. return result_array
  21.  
  22.  
  23. def verifyMatrix(matrix):
  24. for row in range(0, len(matrix)):
  25. flag_found_in_line = False
  26. for col in range(0, len(matrix[row])):
  27. if matrix[row][col][1] == row:
  28. flag_found_in_line = True
  29. if abs(matrix[row][col][0]) < Tema4.Epsilon:
  30. return False
  31. if not flag_found_in_line:
  32. return False
  33. return True
  34.  
  35.  
  36. def getValue(matrix, row, col):
  37. for index_array in range(0, len((matrix[row]))):
  38. if matrix[row][index_array][1] == col:
  39. return matrix[row][index_array][0]
  40.  
  41.  
  42. def testConditions(xGS, index_line, elem, convergent, divergent):
  43. if abs(xGS[index_line] - elem) >= Tema4.Epsilon:
  44. convergent = False
  45. if abs(xGS[index_line] - elem) <= Tema4.DELTA_max:
  46. divergent = False
  47. return convergent, divergent
  48.  
  49.  
  50. def calculateSums(matrix, index_line, xGS):
  51. count = 0
  52. sum_below_diag, sum_above_diag = 0, 0
  53. # Calculam sumele de care avem nevoie
  54. while count < len(matrix[index_line]) and matrix[index_line][count][1] < index_line:
  55. sum_below_diag += matrix[index_line][count][0] * xGS[matrix[index_line][count][1]]
  56. count += 1
  57. count += 1
  58. while count < len(matrix[index_line]) and matrix[index_line][count][1] < len(xGS):
  59. sum_above_diag += matrix[index_line][count][0] * xGS[matrix[index_line][count][1]]
  60. count += 1
  61. return sum_below_diag, sum_above_diag
  62.  
  63.  
  64. def Gauss_Siedel(matrix, vector, arraySize):
  65. vector = getFloatArray(vector)
  66. # Initializam vectorul xGS pe care-l vom folosii mai tarziu
  67. xGS = [0.0 for index in range(0, arraySize)]
  68. # Folosim un for in care vom merge de maxim K_max ori
  69. convergent = True
  70. k = 0
  71. for k in range(0, Tema4.K_max):
  72. convergent = True
  73. divergent = True
  74. # Folosim un for pentru a parcurge fiecare linie
  75. for index_line in range(0, arraySize):
  76. # Resetam sumele de fiecare data
  77. sum_below_diag, sum_above_diag = calculateSums(matrix, index_line, xGS)
  78. # Calculam valoarea elementului
  79. value = (vector[index_line] - sum_below_diag - sum_above_diag) / getValue(matrix, index_line, index_line)
  80. # Verificam conditiile descrise in PDF de oprire
  81. convergent, divergent = testConditions(xGS, index_line, value, convergent, divergent)
  82. # Updatam vectorul cu valoarea elementului
  83. xGS[index_line] = value
  84. if convergent or divergent:
  85. break
  86. if convergent and k != Tema4.K_max - 1:
  87. return xGS, k
  88. else:
  89. return [], k
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement