@andreika_big

Определитель матрицы nxn Python?

Как написать программу для нахождения определителя матрицы nxn без сторонних библиотек?
Вот код
import pandas as pd

a, b, c = 0, 0, 0
print('Выберите действие от 1 до 6: 1 сложение, 2 вычитание, 3 умножение, 4 деление, 5 транспонирование и 6 определитель')
a = int(input())
if a < 5:
  print('введите числа')
  b = int(input())
  c = int(input())
  if a == 1:
    print(b+c)
  if a == 2:
    print(b-c)
  if a == 3:
    print(b*c)
  if a == 4:
    print(b-c)
else:
  print('введите размерность матрицы')
  b = int(input())
  c = int(input())
  mat = {}
  for row in range(b):
    print(f'Строка {row}')
    for column in range(c):
      mat[row, column] = input()
  if a == 5:
    for column in range(c):
        str = ''
        for row in range(b):
          str += mat[row, column] + ', '
        print(str[:-2])
  if a == 6:
    # создаем df для удобства
    df = pd.DataFrame()
    for row in range(b):
      for column in range(c):
        df.loc[row, column] = int(mat[row, column])

    # получаем матрицу треугольного вида
    for column in range(b):
      for row in range(column+1, b):
        df.loc[row, :] = df.loc[column, :] * (- df.loc[row, column] /  df.loc[column, column]) + df.loc[row, :]

    # Находим детерминант
    det = 1
    for row in range(b):
      det *= df.loc[row, row]

    print(det)


Но он не корректно работает, не понимаю, в чем ошибка, помогите исправить, буду признателен
Вот ошибка:
C:\Main\Programming\Univ\test2.py:43: RuntimeWarning: invalid value encountered in double_scalars
df.loc[row, :] = df.loc[column, :] * (- df.loc[row, column] / df.loc[column, column]) + df.loc[row, :]
nan
  • Вопрос задан
  • 1943 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Где-то в расчётах получилось NaN - Not A Number.
Могли поделить на ноль, больше я не вижу операций, которые могли NaN сгенерировать.
Проверяйте значения матрицы по шагам, что тут ещё скажешь.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Onigire
Вот тебе неплохое решение:
def determinant(matrix: list[list[int]]) -> int:
    det = 0
    match ln := len(matrix):
        case 1:
            return matrix[0][0]
        case 2:
            return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
        case _:
            for k in range(ln):
                det += matrix[0][k] * (-1) ** k * determinant([matrix[i][:k] + matrix[i][k+1:] for i in range(1,ln)])
    return det


a = [[1, 2, 9],
     [4, 5 ,6],
     [7, 8, 9]]

print(determinant(a))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы