Мир объектов Excel 2000


Задача 12 Решение системы линейных уравнений и обращение матриц - часть 4


End Sub

Процедура Linear выполняет линейное преобразование над строками матрицы. Под линейным преобразованием понимается добавление к одной строке матрицы другой строки, умноженной на произвольный коэффициент. Вот текст этой процедуры:

Public Sub Linear(A() As Variant, Ind As Integer) 'Линейные преобразования над строками матрицы A. 'В результате столбец Ind становится единичным. Dim i As Integer For i = 1 To Ind - 1 Call AddLine(A, Ind, i) Next i For i = Ind + 1 To UBound(A, 1) Call AddLine(A, Ind, i) Next i End Sub

В процедуре Linear поочередно изменяются все строки за исключением строки с номером Ind. Целью линейных преобразований является получение нулей выше и ниже диагонали в столбце с заданным индексом Ind. Для этого в теле Linear организованы два цикла, в которых вызывается процедура AddLine, выполняющая линейное преобразование для заданной строки.

Public Sub AddLine(A() As Variant, _ ByVal Ind1 As Integer, ByVal Ind2 As Integer) 'Cтрока с индексом Ind1 с соответствующим коэффициентом 'вычитается из строки Ind2 матрицы A Dim i As Integer, Elem As Variant Elem = A(Ind2, Ind1) For i = Ind1 To UBound(A, 2) A(Ind2, i) = A(Ind2, i) - A(Ind1, i) * Elem Next i End Sub

Нам остается привести результаты тестирования функции SLEQ. Вот как они выглядят на рабочем листе Excel:

Решение m систем линейных уравнений и обращение матриц.

увеличить изображение
Рис. 2.8.  Решение m систем линейных уравнений и обращение матриц.

В ячейки рабочего листа я ввел матрицу A, матрицу правых частей B и единичную матрицу E, дав всем этим массивам соответствующие имена. Матрица B состоит из двух столбцов, так что, вызвав функцию SLEQ в формуле над массивами - {=SLEQ(A;B)}, я "одним махом" решил две системы линейных уравнений, получив решение в матрице X, каждый столбец которой является решением соответствующей системы уравнений. Затем, используя в формуле над массивами единичную матрицу E -{=SLEQ(A; E)}, я вычислил матрицу, обратную к A. Для проверки качества решения я, используя вызов MultMatr, умножил матрицу A на полученную обратную матрицу AMinus1, а также A умножил на X. В первом случае получена "почти" единичная матрица (один из элементов не равен точно 0), во втором случае результат умножения, как и дол жно, практически совпадает с матрицей B.




Начало  Назад  Вперед



Книжный магазин