После того как матрица Dop сформирована, вызывается функция DetMatrix, заносящая в переменную Rtmp определитель этой матрицы. Если сумма индексов il и jl нечетная, то в соответствии с выражением для алгебраических дополнений изменяется знак Rtmp. Затем в обратную матрицу записывается значение элемента как отношение Rtmp к Det.

Функция ReversMatrix2 вычисляет обратную матрицу без предварительного расчета определителя матрицы А (см. разд. 2.3.1). В основных чертах функция ReversMatrix2 подобна ReversMatrix. Отличие только в том, что определитель (переменная Det) формируется по ходу вычислений алгебраических дополнений. Перед началом циклов задается Det = 0. Затем, после вычисления очередного алгебраического дополнения проверяется, не является ли элемент, дополнение которого рассчитано, элементом первого столбца матрицы. Если является, то к текущему значению Det добавляется произведение этого элемента на его алгебраическое дополнение. Таким образом, после завершения циклов по всем элементам матрицы А в переменной Det оказывается сформирован определитель |А|. Остается проверить, не равен ли он нулю (не является ли матрица особенной) и разделить все элементы обратной матрицы на величину определителя.

Функция LSystem возвращает решение линейной системы уравнений вида (2.2). Как параметры в функцию передаются квадратная матрица коэффициентов системы А и вектор правых частей VRight. Реализация функции очень проста и состоит, фактически, из двух операторов: первый функцией ReversMatrix рассчитывает обратную матрицу, а второй функцией MultMatrixVector, описанной в разд. 2.2.2, умножает эту матрицу на вектор правых частей.

Для тестирования методов расчета обратной матрицы можно использовать то же тестовое приложение TMatr, которое было описано в разд. 2.2.3 и показано на рис. 2.5. Для этого достаточно сделать следующие изменения (в приложении TMatr в каталоге Matrix на приложенном к книге диске эти изменения сделаны):

■ добавить в свойство Items компонента СВОрег строки, соответствующие методам обращения матрицы:

Обратная матрица Обратная матрица 2

■ добавить в структуру case процедуры CBOperChange операторы:

9 : begin

STFunc.Caption := #13'ReversMatrix(А)'; STDescr.Caption := #13'Обратная матрица A' end; 10 : begin

STFunc.Caption := #13'ReversMatrix2(A, B)'; STDescr.Caption :=

#13'Обратная матрица А (ускоренный расчет)'

end;

* добавить в структуру case процедуры BRunClick операторы:

9 : С := ReversMatrix(А);
10 : С := ReversMatrix2(А);

Тестирование двух рассмотренных вариантов обращения матрицы показывает, что второй вариант существенно чувствительнее к погрешностям вычисления. Это сказывается при обращении матриц, близких к особенным. Например, задайте особенную матрицу. Для этого достаточно задать в ней линейно зависимые строки. Например:

2.3.2 Программная реализация решения системы линейных уравнений с помощью обратной матрицы

Вы увидите, что процедура ReversMatrix выдаст сообщение "матрица особенная" и обратная матрица не будет рассчитана. Это следствие того, что определитель особенной матрицы равен нулю. А процедура ReveгsMatгix2 рассчитает обратную матрицу, которая будет иметь очень большие элементы, и никаких предупреждений не выдаст. Связано это с тем, что за счет погрешностей вычислений определитель матрицы получится очень малым числом, не равным нулю. Таким образом, процедура ReversMatrix надежнее, особенно в матрицах, близких к особенным.

Алгоритм процедуры ReversMatrix2 должен обеспечивать несколько более быстрый расчет за счет того, что в нем определитель матрицы вычисляется попутно с вычислением алгебраических дополнений. Однако это ускорение практически незаметно. На рис. 2.7 приведены графики зависимости времени расчета обратной матрицы обоими методами. Зрительно обе кривые сливаются в одну, так что в черно-белом изображении выглядят одной кривой. График рис. 2.7 получен тестовым приложением TRevers, аналогичным рассмотренному в разд. 2.2.3 приложению TDeterm. Только в цикле рассчитывается время выполнения не одной, а двух функций:

tl := Time;
М2 := ReversMatrix(Ml);
t2 := Time;
DecodeTime(t2-tl, Hour, Min, Sec, MSec);
t := Msec + Sec * 1000 + Min * 60000 + Hour * 3600000;
FGraph.Seriesl.AddXY(N,t,'',clRed);
tl := Time;
M2 := ReversMatrix2(Ml);
t2 := Time;
DecodeTime(t2-tl, Hour, Min, Sec, MSec);
t := Msec + Sec * 1000 + Min * 60000 + Hour * 3600000;
FGraph.Series2.AddXY(N,t,'f,clBlue);

Рис. 2.7

Зависимость времени расчета обратной матрицы от размерности задачи

2.3.2 Программная реализация решения системы линейных уравнений с помощью обратной матрицы

В целом, как видно из рис. 2.7, время расчета очень быстро нарастает с ростом размера матрицы. Зависимость получается близкой к кубической. Поэтому использовать обратную матрицу для решения системы уравнений вряд ли целесообразно. Далее будет рассмотрен существенно более быстрый метод. Однако если обратная матрица требуется для каких-то других целей (например, для определение собственных значений), то заодно можно использовать ее и для решения систем уравнений. Но в этом случае целесообразнее применять не функцию LSystem, а вычислить с помощью функции ReversMatrix обратную матрицу, а затем умножать ее функцией MultMatrixVector на различные значения вектора правых частей.

В приведенном примере тестового приложения для простоты не используются функции, обеспечивающие более точный учет времени, затраченного текущим потоком. Применение таких функций, рассмотренное ранее в листинге 2.5 а, возможно, конечно, и в данном случае. В приложении TRevers в каталоге Matrix для VCL .NET отображение результатов производится не в виде графика, а в виде таблицы. Причины этого были рассмотрены в разд. 2.2.3 и связаны с отсутствиенм в .NET компонента Chart.

2.3 Решение систем линейных уравнений || Оглавление || 2.3.3 Решение систем уравнений методом LU-разложения


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Февраль
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс