Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- import math
- import numpy
- import operator
- m = numpy.matrix('1 2 3 4; 5 6 7 8; 9 1 5 7')
- class SolveSLAE:
- # создает квадратные матрицы с нулями на диагонали и нулями в другом случае
- @staticmethod
- def ones_matrix(size):
- matrix = numpy.zeros((size, size))
- for i in range(size):
- matrix[i][i] = 1
- return matrix
- # перестановка столбцов
- @staticmethod
- def change_cols(m, pr, fin):
- if (pr != fin):
- m[:, [pr, fin]] = m[:, [fin, pr]]
- return m
- # перестановка строк
- @staticmethod
- def change_rows(m, pr, fin):
- if (pr != fin):
- m[[pr, fin]] = m[[fin, pr]]
- return m
- # чтобы избежать сильного влияния вычислительной погрешности на решение, применяем метод Гаусса с выбором главного элемента
- # среди элементов матрицы выбераем наибольший по модулю(главный)элемент
- @staticmethod
- def pivoting(L, U, P, Q, x):
- abs_U = abs(U)
- if abs_U[x:, x:].sum() < pow(10, -12):
- return 0, L, U, P, Q
- i, j = numpy.where(abs_U[x:, x:] == abs_U[x:, x:].max())
- i[0] += x
- j[0] += x
- L = change_cols(L, i[0], x)
- L = change_rows(L, j[0], x)
- U = change_cols(U, i[0], x)
- U = change_rows(U, j[0], x)
- P = change_rows(P, i[0], x)
- Q = change_cols(Q, j[0], x)
- return 1, L, U, P, Q
- def LUP_decomposition(m):
- size = len(m)
- L = numpy.zeros((size, size))
- U = numpy.copy(m)
- P, Q = SolveSLAE.ones_matrix(size), SolveSLAE.ones_matrix(size)
- for i in range(size - 1):
- success, L, U, P, Q = pivot(L, U, P, Q, i)
- if success == False:
- break
- T = SolveSLAE.ones_matrix(size)
- for k in range(i + 1, size):
- L[k, i] = U[k, i] / U[i, i]
- T[k, i] = (-1) * L[k, i]
- print(f"\n{T}\n")
- U = numpy.dot(T, U)
- L = L + numpy.eye(size)
- return L, U, P, Q
- print(m)
- print(SolveSLAE.change_rows(m,0,2))
- print(SolveSLAE.change_cols(m,0,2))
- print(SolveSLAE.ones_matrix(5))
Advertisement
Add Comment
Please, Sign In to add comment