Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.75 KB | None | 0 0
  1. import numpy as np
  2.  
  3. # Исходные данные
  4.  
  5. As = [
  6. np.array([
  7. [-7.8, -2.4, -0.3, -3.1],
  8. [-8.0, 4.5, -9.2, 2.3],
  9. [-4.8, 5.5, 1.7, -9.5],
  10. [-2.5, 0.3, -8.8, 7.5]
  11. ]),
  12. np.array([
  13. [-8.5, -5.1, -1.3, -6.8],
  14. [ 0.7, -9.4, 3.1, 1.7],
  15. [-9.2, -2.2, 7.7, -4.9],
  16. [-3.2, -5.4, 3.2, 8.2]
  17. ]),
  18. np.array([
  19. [-6.6, -8.8, 6.6, -8.1],
  20. [-5.7, -9.3, -1.4, 5.2],
  21. [-1.0, -1.2, 4.1, -5.9],
  22. [ 4.3, 0.8, -7.2, -6.6]
  23. ])
  24. ]
  25.  
  26. x = np.array([1, 2, 3, 4])
  27. bs = [A.dot(x) for A in As]
  28.  
  29.  
  30. # вспомогательные функции
  31.  
  32. def _get_column_base(M, col):
  33. """Ищём главный элемент столбца"""
  34. base_i = 0
  35. base = 0
  36. for row in range(col, M.shape[0]):
  37. if abs(base) < abs(M[row][col]):
  38. base = M[row][col]
  39. base_i = row
  40. return base, base_i
  41.  
  42.  
  43. def _swap_rows(M, i, j):
  44. if i == j:
  45. return
  46. temp = np.copy(M[i])
  47. M[i] = M[j]
  48. M[j] = temp
  49. # M[[i, j]] = M[[j, i]]
  50.  
  51.  
  52. def _permutate_b(P, b):
  53. b = np.copy(b)
  54. n = len(P)
  55. for i in range(n):
  56. b[i], b[P[i]] = b[P[i]], b[i]
  57. return b
  58.  
  59.  
  60. # основные функции
  61.  
  62. def LUP_factor(A):
  63. M = np.copy(A)
  64. n = M.shape[0]
  65. P = np.arange(n)
  66. for col in range(n - 1):
  67. base, base_i = _get_column_base(M, col)
  68. _swap_rows(M, base_i, col)
  69. P[col] = P[base_i]
  70. for row in range(col + 1, n):
  71. k = M[row, col] / base
  72. M[row, col] = k
  73. for i in range(col + 1, n):
  74. M[row, i] -= M[col, i] * k
  75. return M, P
  76.  
  77.  
  78. """
  79. 1) Решить заданную систему линейных алгебраических уравнений
  80. методом LU разложения с выбором главного элемента по столбцу.
  81. Ax=b
  82. """
  83.  
  84. print('Задание №1', end="\n---\n")
  85.  
  86.  
  87. def solve_LU(M, b):
  88. LU, P = LUP_factor(M)
  89. b = _permutate_b(P, b)
  90. n = M.shape[0]
  91. y = np.zeros((n,))
  92. x = np.zeros((n,))
  93. # TODO Is it possible to combine x, y?
  94.  
  95. # Ly = b => y
  96. for i in range(n):
  97. left_sum = 0
  98. for j in range(i):
  99. left_sum += LU[i][j] * y[j]
  100. y[i] = b[i] - left_sum
  101.  
  102. # Ux = y => x
  103. for i in range(n - 1, -1, -1):
  104. left_sum = 0
  105. for j in range(i + 1, n):
  106. left_sum += LU[i][j] * x[j]
  107. x[i] = (y[i] - left_sum) / LU[i][i]
  108. return x
  109.  
  110.  
  111. for i, (A, b) in enumerate(zip(As, bs), start=1):
  112. print(f'Решение системы №{i}: ', solve_LU(A, b))
  113.  
  114. """
  115. 2) Используя полученное ранее LU разложение вычислить обратную матрицу к исходной.
  116. """
  117.  
  118. print('\nЗадание №2', end="\n---\n")
  119.  
  120.  
  121. def inverse(M):
  122. n = M.shape[0]
  123. cols = []
  124. for k in range(n):
  125. b = np.eye(1, n, k=k)[0] # правая часть, где x_i = 0, кроме x_k = 1
  126. cols.append(solve_LU(M, b))
  127. M_inv = np.array(cols).transpose()
  128. return M_inv
  129.  
  130.  
  131. for i, A in enumerate(As, start=1):
  132. print(f'Обратная матрица для A_{i}:')
  133. print(inverse(A), end='\n\n')
  134.  
  135.  
  136. """
  137. 3) Вычислить определитель и найти число обусловленности исходной матри-цы
  138. в кубической, октаэдрической и евклидовой нормах.
  139. """
  140.  
  141. print('\nЗадание №3', end="\n---\n")
  142.  
  143.  
  144. def _sign_det(P):
  145. P = np.copy(P)
  146. pc = 0
  147. for i in range(len(P)):
  148. if P[i] != i:
  149. pc += 1
  150. P[P[i]] = P[i]
  151. return (1, -1)[pc % 2]
  152.  
  153.  
  154. def det_LU(LU, P):
  155. n = LU.shape[0]
  156. det = LU[0, 0]
  157. for i in range(1, n):
  158. det *= LU[i, i]
  159. return det * _sign_det(P)
  160.  
  161.  
  162. def C_norm(M): # np.linalg.norm(A1, ord=1)
  163. max_el = 0
  164. n = M.shape[0]
  165. for j in range(n):
  166. el_sum = 0
  167. for i in range(n):
  168. el_sum += abs(M[i][j])
  169. if el_sum > max_el:
  170. max_el = el_sum
  171. return max_el
  172.  
  173.  
  174. def O_norm(M): # np.linalg.norm(A1, ord=np.inf)
  175. max_el = 0
  176. n = M.shape[0]
  177. for i in range(n):
  178. el_sum = 0
  179. for j in range(n):
  180. el_sum += abs(M[i][j])
  181. if el_sum > max_el:
  182. max_el = el_sum
  183. return max_el
  184.  
  185.  
  186. def E_norm(M): # np.linalg.norm(A1, ord='fro')
  187. s = 0
  188. n = M.shape[0]
  189. for i in range(n):
  190. for j in range(n):
  191. s += M[i][j]**2
  192. return np.sqrt(s)
  193.  
  194.  
  195. def cond(A, norm):
  196. A_inv = inverse(A)
  197. return norm(A) * norm(A_inv)
  198.  
  199.  
  200. for i, A in enumerate(As, start=1):
  201. LU, P = LUP_factor(A)
  202. print(f'det(A{i}) =', det_LU(LU, P))
  203. print(f'cond_C(A{i}) =', cond(A, norm=C_norm))
  204. print(f'cond_O(A{i}) =', cond(A, norm=O_norm))
  205. print(f'cond_E(A{i}) =', cond(A, norm=E_norm))
  206. print()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement