Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.55 KB | None | 0 0
  1. import random
  2. import time
  3. import typing
  4. import numpy as np
  5.  
  6.  
  7. # Task 1
  8. def filter(A: np.ndarray, threshold):
  9.     position_list = np.argwhere(np.array(A) >= threshold)
  10.     return [tuple(x) for x in position_list]
  11.  
  12.  
  13. A = np.array([[random.random() * 50 for _ in range(5)] for _ in range(5)])
  14.  
  15.  
  16. # tuple_list = filter(A, 25.3)
  17. # print(A)
  18. # print(tuple_list)
  19.  
  20. # Task 2
  21. def check_moves_conditions(x, y, index_x, index_y):
  22.     if (index_x == x or index_y == y or index_x + index_y == x + y or index_x - index_y == x - y) and not (
  23.             index_x == x and index_y == y):
  24.         return 1
  25.     else:
  26.         return 0
  27.  
  28.  
  29. def get_queen_moves(y: int, x: int):
  30.     moves = [[check_moves_conditions(x, y, index_x, index_y) for index_x in range(8)] for index_y in range(8)]
  31.     return moves
  32.  
  33.  
  34. # print(np.array(get_queen_moves(2, 4)))
  35.  
  36. # Task 3
  37. # A = np.zeros((8, 8))
  38. # A[0, 0] = 1
  39. # A[2, 1] = 1
  40. # A[1, 4] = 1
  41. # A[4, 2] = 1
  42. # A[6, 3] = 1
  43. # A[3, 5] = 1
  44. # A[5, 6] = 1
  45. # A[7, 7] = 1
  46.  
  47.  
  48. def check_queen_puzzle(A):
  49.     positions = filter(A, 1)
  50.     queens_moves = [np.array(get_queen_moves(x[0], x[1])) for x in positions]
  51.     aggregated = np.sum(queens_moves, axis=0)
  52.     unsafe_queens = not np.any([True for x in positions if aggregated[x[0], x[1]] != 0])
  53.     return unsafe_queens
  54.  
  55.  
  56. # print(A)
  57. # print(check_queen_puzzle(A))
  58.  
  59.  
  60. # Task 4
  61. def generate_system(X):
  62.     A = np.random.uniform(-1, 1, X.size ** 2).reshape((X.size, X.size))
  63.     A[np.diag_indices(X.size)] = np.sum(np.abs(A), axis=1)
  64.     B = np.dot(A, X)
  65.     return A, B
  66.  
  67.  
  68. # Task 5
  69. def solve_system(A: np.ndarray, B: np.ndarray):
  70.     a_diagonal = A.diagonal()
  71.     A = -(A / np.expand_dims(a_diagonal, axis=1))
  72.     B /= a_diagonal
  73.     np.fill_diagonal(A, 0)
  74.     X = np.zeros(B.size)
  75.     for iteration in range(10000):
  76.         old_X = np.array(X)
  77.         X = np.dot(A, X) + B
  78.         if np.isclose(X, old_X).all():
  79.             break
  80.     return X
  81.  
  82.  
  83. X = np.array([1, 2, 3, 4, 5])
  84. A, B = generate_system(X)
  85. solved_x = np.dot(np.linalg.inv(A), B)
  86. print(solved_x)
  87. solved_x = solve_system(A, B)
  88. print(solved_x)
  89.  
  90. for number_of_equations in [100, 200, 500, 2000, 5000]:
  91.     X = np.array([x for x in range(number_of_equations)])
  92.     A, B = generate_system(X)
  93.  
  94.     time0_inverse = time.time()
  95.     inverse_x = np.dot(np.linalg.inv(A), B)
  96.     print(f"Inverse time for {number_of_equations} equations: {time.time()-time0_inverse}")
  97.     time0_jacobi = time.time()
  98.     jacobi_x = solve_system(A, B)
  99.     print(f"Jacobi time for {number_of_equations} equations: {time.time()-time0_jacobi}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement