Определитель треугольной матрицы
- Треугольные матрицы
- Вычисление определителя треугольной матрицы
- Алгоритм Барейса
- Исходный код VBA EXCEL
Матрица - двумерный массив. Это особый тип организации данных, который выступает как единое и неразрывное целое. Данные в матрице строго структурированы и несут (сохраняют) причинно следственные связи.
Треугольные матрицы
Название говорит само за себя.
Если все элементы матрицы ниже главной диагонали равны 0, то это верхняя треугольная матрица. Если выше главной диагонали все 0, то это нижняя треугольная матрица.
Рис.1 Треугольные матрицы
Вычисление определителя треугольной матрицы
По-моему, с первого взгляда видно, что вычислить определитель треугольной матрицы (т.е. матрицы, которая содержит почти половину элементов равных нулю) значительно проще.
Рис.2 Вычисление определителя треугольной матрицы
Это и есть метод Гаусса, гласящий, что определитель треугольной матрицы равен произведению элементов главной диагонали. А о дополнительных преимуществах алгоритма Барейса читайте ниже…
Алгоритм Барейса
Рис.3 Алгоритм Барейса
Изучив преимущества и недостатки имеющихся алгоритмов (Гаусса и Барейса), я остановился на алгоритме Барейса, так как:
- если матрица состоит из целых чисел, алгоритм Барейса позволяет привести её к треугольному виду с использованием только целочисленной арифметики;
- определитель исходной матрицы равен правому нижнему элементу матрицы, полученной в результате алгоритма Барейса, т.е. не нужно выполнять перемножение элементов главной диагонали, как после алгоритма Гаусса;
- алгоритм Барейса так же, как и алгоритм Гаусса, может быть улучшен путём добавления перестановки строк, но в нашей задаче это излишне;
Поэтому код VBA приведения будет следующим:
For j = 1 To n - 1
jj = mR.Cells(j, j) 'определяем первый множитель
If j = 1 Then 'определяем знаменатель
znm = 1
Else
znm = mR.Cells(j - 1, j - 1)
If znm = 0 Then Exit Function
End If
For i = j + 1 To n
ij = mR.Cells(i, j) 'определяем второй множитель
For k = j To n
mR.Cells(i, k) = (jj * mR.Cells(i, k) - ij * mR.Cells(j, k)) / znm
Next k
Next i
Next j
Где mR as Range – переменная модуля, ссылающаяся на выделенная область.
j- индексы строк, а i- индексы столбцов выделенной области.
Ячейка, обозначенная как а-1,-1 лежит вне области выделения
(т.е. выше и левее ячейки а0,0 ) и ей в начальный период обязательно присваивается 1.
В своей функции вместо а-1,-1 я использую переменную znm (от знаменатель) и базовое
значение счетчиков 1 вместо 0. Суть алгоритма это не меняет. При пошаговом выполнении
программы прекрасно прослеживается постепенное приведение матрицы к верхнему треугольному виду.
Исходный код VBA EXCEL
Для работы с матрицами в Microsoft EXCEL существует три функции листа Excel.
Это:
- МОПРЕД(массив) - возвращает определитель матрицы (матрица хранится в массиве);
- МОБР(массив) - возвращает обратную матрицу для матрицы, хранящейся в массиве;
- МУМНОЖ(массив1;массив2) - возвращает произведение матриц (матрицы хранятся в массивах). Результатом является массив с таким же числом строк, как массив1 и с таким же числом столбцов, как массив2;
Первую из этих функций буду использовать для проверки результата.
Кроме того:
- в макросе проводится проверка на соответствие выделенной области, и если размеры не совпадают (а матрица должна быть квадратной), то выдается сообщение и работа макроса завершается;
- в ячейку AJ2 вводится формула для вычисления определителя (на основе функции МОПРЕД) выделенной области; (просто для проверки)
- в завершающем сообщении предлагается очистить лист «Результат» по желанию пользователя;
Тестирование - это наиболее важный этап в жизненном цикле программного продукта. Поэтому не верьте картинкам, фильмам и сказкам…
Только личное тестирование во всех наиболее сложных сочетаниях данных - должно убедить Вас в доброкачественности алгоритма и исходного кода!
скачать xlsm-файл для тестирования
Другие примеры на языке «Visual Basic for application (VBA)»
Другие примеры на тему «Матрицы и операции вычислений с ними»
Если у Вас остались вопросы, то задать их Вы можете, нажав на эту кнопочку ...