Обратите внимание, что Maple теперь выдает информационные сообщения о новых условиях реализации операции инвертирования матриц с вещественными элементами и, в частности, об использовании алгоритмов NAG и арифметики, встроенной в сопроцессор.

Следующий пример иллюстрирует создание двух случайных матриц M1 и М2 и затем их умножение:

> M1:=RandomMatrix(2,3); М2:=RandomMatrix(3,3);

Multiply(M1,M2,'inplace'); M1;

Параметр inplace в функции умножения обеспечивает помещение результата умножения матриц на место исходной матрицы М1 — излюбленный прием создателей быстрых матричных алгоритмов NAG. Поскольку матрицы M1 и М2 заданы как случайные, то при повторении этого примера результаты, естественно, будут иными, чем приведенные.

Другой пример иллюстрирует проведение хорошо известной операции LU-разложения над матрицей М, созданной функцией Matrix:

> M:=Matrix([[14,-8,1],[-11,-4,18],[3,12,19]], datatype=float);

LUDecomposition(М,output=['NAG'],inplace);

ipiv:=%[1];

M;

LUDecomposition: 'calling external function'

LUDecomposition: 'NAG' hw_f07adf

6.3.3. Методы решения систем линейных уравнений средствами пакета LinearAlgebra

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

• обращением матрицы коэффициентов уравнений и решением вида Х=А-1;

• применением метода LU-декомпозиции (method='LU');

• применением метода QR-декомпозиции (method='QР');

• применением метода декомпозиция Холесского (method='Cholesky');

• метод обратной подстановки (method='subs').

Решение с применением обращения матрицы коэффициентов левой части системы уравнений А уже не раз рассматривалось и вполне очевидно. В связи с этим отметим особенности решения систем линейных уравнений другими методами. Любопытно отметить, что указание метода может быть сделано и без его заключения в одинарные кавычки.

6.3.4. Решение системы линейных уравнений методом LU-декомпозиции

Зададим матрицу А левой части системы уравнений и вектор свободных членов В:

> restart; with(LinearAlgebra): UseHardwareFloats := false:

> A:=<<4|.24|-.08>,<.09|3|-.15>,<.041-.08|4>>; B:=<8, 9, 20>;

Прямое решение этим методом выполняется одной из двух команд, отличающихся формой записи:

> х := LinearSolve(А, В, method= 'LU');

х := LinearSolve(<А|B>, method='LU');

Проверим решение данной системы уравнений:

> А.х-В;

В данном случае решение точно (в пределах точности вычислений по умолчанию).

Можно также выполнить решение проведя отдельно LU-декомпозицию, что делает наглядным алгоритм решения и операции подстановки:

> P,L,U:=LUDecomposition(A);

> V2:=Transpose(Р).В;

> V3:=ForwardSubstitute(L,V2);

> x:=BackwardSubstitute(U,V3);

> A.x-B;

6.3.5. Решение системы линейных уравнений методом QR-декомпозиции

Выполним теперь решение для тех же исходных данных методом QR-декомпозиции, обозначив метод в функции LinearSolve:

> х := LinearSolve(А, В, method='QR');

> A.x-B;

Другой, более явный, но и более громоздкий метод решения представлен ниже:

> Q,R := QRDecomposition(А);

> V2:=Transpose(Q).B;

> x:=BackwardSubstitute(R,V2);

> A.x-B;

Тут, пожалуй, любопытно, что погрешность вычислений оказалась несколько выше, чем при использовании функции LinearSolve. Однако погрешность не выходит за рамки допустимой по умолчанию.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату