Макрос приведения прямоугольной области выделенных данных к верхней треугольной матрице.

Приведение матрицы к треугольному виду требуется, прежде всего, для решения систем линейных уравнений, а именно для вычисления определителя матрицы. Ведь самый быстрый способ вычислить определитель — привести матрицу к треугольному виду (по алгоритму Гаусса), а затем перемножить её диагональные элементы.

Для работы с матрицами существует три функции листа Excel.

    Это:
  1. МОПРЕД(массив) - возвращает определитель матрицы (матрица хранится в массиве);
  2. МОБР(массив) - возвращает обратную матрицу для матрицы, хранящейся в массиве;
  3. МУМНОЖ(массив1;массив2) - возвращает произведение матриц (матрицы хранятся в массивах). Результатом является массив с таким же числом строк, как массив1 и с таким же числом столбцов, как массив2;

Поскольку этих функций не достаточно для выполнения задания, то для приведения прямоугольной (и даже обязательно квадратной) области листа Excel к виду верхней треугольной матрицы будем использовать специальный алгоритм.

Выбираю для макроса алгоритм Барейса.

Изучив преимущества и недостатки имеющихся алгоритмов (Гаусса и Барейса), я остановился на алгоритме Барейса, так как:
  • если матрица состоит из целых чисел, алгоритм Барейса позволяет привести её к треугольному виду с использованием только целочисленной арифметики;
  • определитель исходной матрицы равен правому нижнему элементу матрицы, полученной в результате алгоритма Барейса, т.е. не нужно выполнять перемножение элементов главной диагонали, как после алгоритма Гаусса;
  • алгоритм Барейса так же, как и алгоритм Гаусса, может быть улучшен путём добавления перестановки строк, но в нашей задаче это излишне;
VBA Excel Алгоритм Барейса макрос

Суть алгоритма Барейса.

j- строки, а i-столбцы выделенной области. Ячейка, обозначенная как а-1,-1 лежит вне области выделения (т.е. выше и левее ячейки а0,0) и ей в начальный период обязательно присваивается 1. В своей функции вместо а-1,-1 я использую переменную znm (от знаменатель) и базовое значение счетчиков 1 вместо 0. Суть алгоритма это не меняет. При пошаговом выполнении программы прекрасно прослеживается постепенное приведение матрицы к верхнему треугольному виду.

Поэтому код приведения будет следующим:

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 – переменная модуля, ссылающаяся на выделенная область.

    Кроме того:
  • в макросе проводится проверка на соответствие выделенной области, и если размеры не совпадают (а матрица должна быть квадратной), то выдается сообщение и работа макроса завершается;
  • в ячейку AJ2 вводится формула для вычисления определителя (на основе функции МОПРЕД) выделенной области;
  • в завершающем сообщении предлагается очистить лист «Результат» по желанию пользователя;

скачать xls-файл

Другие примеры на языке «Visual Basic for application - VBA»




Если на этой странице не нашлось того, что Вы так искали...

         Не расстраивайтесь, не все потеряно... Смело щелкайте...

исходный код на заказ. orenstudent.ru исходный код на заказ. orenstudent.ru Помогите найти и устранить ошибку в исходном коде программы. orenstudent.ru Skype-консультирование по программированию
Скайп-консультации

Акция !!!
Весь код по 49 руб


требуются
школьники!


и СТУДЕНТЫ!
Кому не плевать
на деньги!
Сайт помощи студентам по программированию и информатике

Program code