ekaterinaparamonova

Untitled

May 27th, 2020
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import math
  3. import numpy
  4. import operator
  5.  
  6.  
  7. m = numpy.matrix('1 2 3 4; 5 6 7 8; 9 1 5 7')
  8.  
  9.  
  10.  
  11.  
  12.  
  13. class SolveSLAE:
  14.  
  15. # создает квадратные матрицы с нулями на диагонали и нулями в другом случае
  16. @staticmethod
  17. def ones_matrix(size):
  18. matrix = numpy.zeros((size, size))
  19. for i in range(size):
  20. matrix[i][i] = 1
  21. return matrix
  22.  
  23. # перестановка столбцов
  24. @staticmethod
  25. def change_cols(m, pr, fin):
  26. if (pr != fin):
  27. m[:, [pr, fin]] = m[:, [fin, pr]]
  28. return m
  29.  
  30. # перестановка строк
  31. @staticmethod
  32. def change_rows(m, pr, fin):
  33. if (pr != fin):
  34. m[[pr, fin]] = m[[fin, pr]]
  35. return m
  36.  
  37. # чтобы избежать сильного влияния вычислительной погрешности на решение, применяем метод Гаусса с выбором главного элемента
  38. # среди элементов матрицы выбераем наибольший по модулю(главный)элемент
  39. @staticmethod
  40. def pivoting(L, U, P, Q, x):
  41. abs_U = abs(U)
  42. if abs_U[x:, x:].sum() < pow(10, -12):
  43. return 0, L, U, P, Q
  44.  
  45. i, j = numpy.where(abs_U[x:, x:] == abs_U[x:, x:].max())
  46. i[0] += x
  47. j[0] += x
  48.  
  49. L = change_cols(L, i[0], x)
  50. L = change_rows(L, j[0], x)
  51. U = change_cols(U, i[0], x)
  52. U = change_rows(U, j[0], x)
  53. P = change_rows(P, i[0], x)
  54. Q = change_cols(Q, j[0], x)
  55.  
  56. return 1, L, U, P, Q
  57.  
  58. def LUP_decomposition(m):
  59. size = len(m)
  60. L = numpy.zeros((size, size))
  61. U = numpy.copy(m)
  62. P, Q = SolveSLAE.ones_matrix(size), SolveSLAE.ones_matrix(size)
  63.  
  64. for i in range(size - 1):
  65.  
  66. success, L, U, P, Q = pivot(L, U, P, Q, i)
  67.  
  68. if success == False:
  69. break
  70.  
  71. T = SolveSLAE.ones_matrix(size)
  72. for k in range(i + 1, size):
  73. L[k, i] = U[k, i] / U[i, i]
  74. T[k, i] = (-1) * L[k, i]
  75.  
  76. print(f"\n{T}\n")
  77. U = numpy.dot(T, U)
  78.  
  79. L = L + numpy.eye(size)
  80.  
  81. return L, U, P, Q
  82.  
  83.  
  84.  
  85. print(m)
  86. print(SolveSLAE.change_rows(m,0,2))
  87. print(SolveSLAE.change_cols(m,0,2))
  88. print(SolveSLAE.ones_matrix(5))
Advertisement
Add Comment
Please, Sign In to add comment