Guest User

Untitled

a guest
Jan 22nd, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. def lup(A):
  2. # функция для LUP-разложения матрицы A
  3. # возвращает L, U и столбец престановок pi
  4.  
  5. # копирование матрицы (для предотвращения изменения внешней матрицы)
  6. A = [list(row) for row in A]
  7. n = len(A) # число строк в мтр A
  8. pi = [i for i in range(n)] # создание столбца перестановок
  9.  
  10. for k in range(n):
  11. p = 0.0
  12. k1 = k
  13.  
  14. for i in range(k, n): # для i от k до n-1
  15. if abs(A[i][k]) > p:
  16. p = abs(A[i][k])
  17. k1 = i
  18.  
  19. if p == 0.0:
  20. print("error") # выдает ошибку при обнаружении вырожденной матрицы
  21.  
  22. pi[k], pi[k1] = pi[k1], pi[k] # обмен значений pi[k] и pi[k1]
  23. A[k], A[k1] = A[k1], A[k] # обмен строк A[k] и A[k1]
  24.  
  25. for i in range(k + 1, n):
  26. A[i][k] = A[i][k] / A[k][k] # деление на ведущий элемент
  27. for j in range(k + 1, n):
  28. A[i][j] = A[i][j] - A[i][k] * A[k][j] # вычитание из подматрицы
  29.  
  30. L = [[0] * n for i in range(n)]# создание пустых матриц L, U
  31. U = [[0] * n for i in range(n)]
  32.  
  33. # далее формирование матриц
  34. for i in range(n):
  35. for j in range(n):
  36. if i > j:
  37. L[i][j] = A[i][j]
  38. else:
  39. U[i][j] = A[i][j]
  40.  
  41. for i in range(n):
  42. L[i][i] = 1.0
  43.  
  44. return pi, L, U
  45.  
  46. def solve(A, b):
  47. # функция для нахождения корней х с помощью lup
  48.  
  49. pi, L, U = lup(A) # вычисление мтр с помощью функции lup() для мтр а
  50.  
  51. n = len(L) # число строк в матрице L
  52. x = [0] * n # создание пустых векторов x, y для записи решения
  53. y = [0] * n
  54.  
  55. for i in range(n):
  56. s = sum(L[i][j] * y[j] for j in range(i)) # суммирование по j до i-1
  57. y[i] = b[pi[i]] - s # прямая подстановка
  58.  
  59. for i in reversed(range(n)): #разворот для прохода от n-1 до 0
  60. s = sum(U[i][j] * x[j] for j in range(i + 1, n)) # суммирование от j = i+1 до n
  61. x[i] = (y[i] - s) / U[i][i] # обратная подстановка
  62.  
  63. return x
  64.  
  65.  
  66. A = [[2.0, 1.0, 3.0], [1.0, 1.0, 1.0], [3.0, 1.0, 1.0]]
  67. b = [13.0, 6.0, 8.0]
  68. print(solve(A, b)) # выведет [1.0, 2.0, 3.0]
Add Comment
Please, Sign In to add comment