kxcoze

satie_lab9_8

Nov 9th, 2022 (edited)
952
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.47 KB | None | 0 0
  1. from fractions import Fraction as f
  2.  
  3. # Данные импорты нужны сугубо для удобства работы с матрицами
  4. import numpy as np
  5. import sympy as sy
  6.  
  7.  
  8. def make_inverse_matrix(a):
  9.     # Находим обратную матрицу с помощью Метода Гаусса
  10.     n = len(a)
  11.     m = len(a[0])
  12.     # Единичная матрица размера N x N
  13.     ones = np.eye(n, dtype=f)
  14.     # Ведущая строка a[k], ведущий элемент a[k][k]
  15.     for k in range(n):
  16.         # Идем сверху вниз по всем элементам главной диагонали
  17.         if not any(a[k]):
  18.             # Если матрица имеет нулевую строку, то вызываем ошибку
  19.             raise ValueError('Невозможно найти обратную матрицу от заданной!')
  20.  
  21.         for i in range(1+k, n):
  22.             x = -a[i][k]/a[k][k]
  23.             for j in range(m):
  24.                 # В зависимости от ведущей строки изменяются
  25.                 # все нижние строки
  26.                 # (1)2 3 ↴ x4    (1) 2  3 ↴ x7   (1) 2  3
  27.                 #  4 5 6 ↲ -  ->  0 -3 -6      -> 0 -3 -6
  28.                 #  7 8 9          7  8  9 ↲ -     0 -6 -12
  29.                 a[i][j] += a[k][j]*x
  30.                 # Симметрично изменяем единичную матрицу
  31.                 ones[i][j] += ones[k][j]*x
  32.  
  33.     for k in range(n-1, -1, -1):
  34.         # Идём снизу вверх по всем элементам главной диагонали
  35.  
  36.         x = a[k][k]
  37.         # Превращаем ведущий элемент в единицу
  38.         a[k][k] /= x
  39.         # Делим симметрично строку в единичной матрице на
  40.         # предыдущее число ведущего элемента
  41.         ones[k] = (lambda i: i/x)(ones[k])
  42.         for i in range(k-1, -1, -1):
  43.             x = -a[i][k]
  44.             # Обнуляем все элементы в колонке выше
  45.             a[i][k] += x
  46.             # Попутно изменяя соответствующие строки в едичной матрице, где
  47.             # ones[i] - "текущая" строка, которую нужно изменить
  48.             # ones[k] - "изменяющая" строка, которая изменяет все строки выше
  49.             # x - на какое число умножается изменяющая строка
  50.             for j in range(m):
  51.                 # Поэлементно изменяем "текущую" строку
  52.                 ones[i][j] += ones[k][j]*x
  53.     # Возвращаем изменненую изначальную матрицу(стала единичной)
  54.     # и обратную матрицу от изначальной
  55.     return a, ones
  56.  
  57. n = int(input())
  58. A = np.array([[f(x) for x in input().split()] for i in range(n)])
  59. print('\nA:')
  60. sy.pprint(sy.Matrix(A))
  61.  
  62. E, inv_A = make_inverse_matrix(A)
  63.  
  64. print('\nA -> E:')
  65. sy.pprint(sy.Matrix(E))
  66. print('\nE -> A^-1:')
  67. sy.pprint(sy.Matrix(inv_A))
  68.  
  69. # Примеры вводов
  70. # 3
  71. # 1 2 4
  72. # 5 1 2
  73. # 3 -1 1
  74. #
  75. # 4
  76. # 2 3 2 2
  77. # -1 -1 0 -1
  78. # -2 -2 -2 -1
  79. # 3 2 2 2
  80. #
  81. # 4
  82. # 1 2 3
  83. # 1 2 3
  84. # 9 9 9
  85. # 1 2 3
  86. #
  87. # 4
  88. # 1 2 3
  89. # 1 2 3
  90. # 1 2 3
  91. # 9 9 9
  92. #
  93. # 3
  94. # 1 2 3 4 5
  95. # 7 6 3 1 -2
  96. # 4 5 10 2 3
Advertisement
Add Comment
Please, Sign In to add comment