|
Текст подпрограммы и версий ash4r_p.zip , ash4e_p.zip |
Тексты тестовых примеров tash4r_p.zip , tash4e_p.zip |
Решение разреженной линейной системы с симметричной положительно определенной матрицей, заданной своим треугольным разложением в формате RR (U) O.
Описание формата RR (U) U приведено в описании подпрограммы AM21R . Формат RR (U) О совпадает с форматом RR (U) U за тем исключением, что в нем элементы каждой строки матрицы упорядочены, т.е. расположены в порядке возрастания номеров столбцов.
Пусть дана система линейных алгебраических уравнений АХ = b, где А - симметричная положительно определенная разреженная матрица. Пусть, кроме того, матрица А предварительно приведена подпрограммой AFH7R к виду A = UTDU, где U - верхняя треугольная матрица с единичными диагональными элементами, представленная в формате RR (U) О, а D - диагональная матрица. Иными словами, предполагается, что известно упорядоченное строчное треугольное разложение матрицы А системы в формате RR (U) О. Требуется найти решение системы Ах = UTDUх = b, т.е. выполнить прямой ход и обратную подстановку.
Полагая z = DUx, w = Ux, получаем следующие три линейные системы:
UTz = b
Dw = z
Ux = w
Решения этих систем находим последовательно: вначале z, затем w и, наконец, x. Поскольку матрицы U и UT треугольные, а матрица D диагональная, то векторы z, w и x вычисляются при помощи несложного алгоритма. Рассмотрим этот алгоритм на примере следующей системы:
| 1 0 0 | | a 0 0 | | 1 d e | | x1 | | b1 | | d 1 0 | | 0 b 0 | | 0 1 f | | x2 | = | b2 | | e f 1 | | 0 0 c | | 0 0 1 | | x3 | | b3 |
В этом примере система UTz = b имеет вид:
| 1 0 0 | | z1 | | b1 |
| d 1 0 | | z2 | = | b2 |
| e f 1 | | z3 | | b3 |
Последовательной подстановкой получаем
z1 = b1
z2 = b2 - d z1
z3 = b3 - e z1 - f z2
Вторая система Dw = z имеет вид:
| a 0 0 | | w1 | | z1 |
| 0 b 0 | | w2 | = | z2 |
| 0 0 c | | w3 | | z3 |
Отсюда имеем:
w1 = z1 / a
w2 = z2 / b
w3 = z3 / c
Так как в памяти машины треугольное разложение хранится таким образом, что вместо D известна сразу же обратная матрица D- 1 (см. подпрограмму AFH7R ), то вместо делений при определении wi ( i = 1, 2, 3) следует использовать более быстрые операции умножения. Наконец, решение последней системы
| 1 d e | | x1 | | w1 |
| 0 1 f | | x2 | = | w2 |
| 0 0 1 | | x3 | | w3 |
вычисляется обратной подстановкой
x3 = w3
x2 = w2 - f x3
x1 = w1 - d x2 - e x3
С.Писсанецки. Технология разреженных матриц. - М.: Мир, 1998
procedure ASH4R(var IU :Array of Integer; var JU :Array of Integer;
var UN :Array of Real; var DI :Array of Real;
N :Integer; var B :Array of Real;
var X :Array of Real);
Параметры
|
IU, JU - UN | заданные портрет и ненулевые элементы верхней треугольной матрицы U с единичной диагональю в формате RR (U) O; |
| DI - | вещественный одномерный массив длины N, содержащий элементы матрицы, обратной к диагональной матрице D; |
| N - | заданный порядок системы (тип: целый); |
| B - | вещественный одномерный массив длины N, содержащий компоненты вектора правой части системы; |
| X - | вещественный одномерный массив длины N, содержащий вычисленные компоненты вектора решения системы |
Версии
| ASH4E - | решение разреженной линейной системы с симметричной положительно определенной матрицей, заданной своим треугольным разложением в формате RR (U) O, в режиме расширенной (Extended) точности; при этом параметры UN, DI, B и X должны иметь тип Extended. |
Вызываемые подпрограммы: нет
Замечания по использованию: нет
Unit TASH4R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ASH4R_p;
function TASH4R: String;
implementation
function TASH4R: String;
var
N,_i :Integer;
X :Array [0..4] of Real;
const
IU :Array [0..5] of Integer = ( 1,2,3,4,5,5 );
JU :Array [0..3] of Integer = ( 5,5,5,5 );
UN :Array [0..3] of Real = ( 0.125,0.8,0.6666667,2.0 );
DI :Array [0..4] of Real = ( 0.0625,1.6,0.3333333,2.0,60.0 );
B :Array [0..4] of Real = ( -4.0,-4.0,7.0,3.0,7.0 );
begin
Result := ''; { результат функции }
{ ТЕСТ ДЛЯ ПОДПРОГРАММЫ ASH4R }
N := 5;
ASH4R(IU,JU,UN,DI,N,B,X);
Result := Result + Format('%s',[' X=']);
Result := Result + #$0D#$0A;
for _i:=0 to 4 do
begin
Result := Result + Format('%20.16f ',[X[_i]]);
if ( ((_i+1) mod 4)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TASH4R',Result); { вывод результатов в файл TASH4R.res }
exit;
end;
end.
Результаты: X = (- 0.499996, - 7.99998, 1.00002, 2.00006, 1.99997)