Текст подпрограммы и версий ask2c_p.zip |
Тексты тестовых примеров task2c_p.zip |
Решение комплексной системы линейных алгебраических уравнений А*x = b с клеточно - теплицевой матрицей A специального вида.
Матрица А состоит из Р на Р клеток размера М на М. Обозначим SK, RK, 1 ≤ К ≤ Р, соответственно К - ю клетку первой клеточной строки и К - ю клетку первого клеточного столбца матрицы А. В данном случае под специальным видом клеточно - теплицевой матрицы А понимается выполнение соотношений
RK = ( LSKN )* , 1 ≤ K ≤ P ,
где L и N - фиксированные симметрические матрицы престановок (" * " означает комплексное сопряжение).
В подпрограмме реализован алгорифм, который является видоизменением вычислительной схемы алгорифма для решения системы уравнений с клеточно - теплицевой матрицей общего вида. Это видоизменение обеспечивает значительную экономию памяти ЭВМ.
С.Н.Воеводина, Решение системы уравнений с клеточно - теплицевыми матрицами. Сб. "Вычислительные методы и программирование", вып.24, Изд-во МГУ, 1975.
procedure ASK2C(var A1 :Array of Complex; var B :Array of Complex; var Y :Array of Complex; var B3 :Array of Complex; var L :Array of Integer; var N :Array of Integer; var C :Array of Complex; var Q :Array of Integer; M :Integer; P :Integer);
Параметры
A1 - | трехмерный М на М на Р массив, в котором задается первая клеточная строка матрицы системы (тип: комплексный); |
B - | двумерный М на Р массив, в котором задается вектор правой части (тип: комплексный); |
Y - | двумерный М на Р массив, в котором запоминается вектор вычисленного решения (тип: комплексный); |
L, N - | векторы длины М, в которых задаются матрицы перестановок (тип: целый); |
B3 - | трехмерный М на М на Р массив, используемый подпрограммой как рабочий (тип: комплексный); |
C - | трехмерный М на М на 3 массив, используемый подпрограммой как рабочий (тип: комплексный); |
Q - | вектор длины М, используемый как рабочий (тип: целый); |
M - | заданный порядок клетки (тип: целый); |
P - | заданное число клеток в клеточной строке или столбце (тип: целый). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
1. |
В массиве В3 по окончании работы подпрограммы запоминается последний клеточный столбец матрицы, являющейся обратной для матрицы исходной системы. | |
2. | Вектор L определяет симметрическую матрицу перестановок следующим образом: К - я компонента вектора L есть номер строки, которая переставляется с К - й. Аналогично, К - я компонента вектора N есть номер столбца переставляемого с К - м столбцом. |
Unit TASK2C_p; interface uses SysUtils, Math, { Delphi } Lstruct, Lfunc, UtRes_p, ASK2C_p; function TASK2C: String; implementation function TASK2C: String; var M,P,I,J,K,_i :Integer; Y :Array [0..5] of Complex; B3 :Array [0..11] of Complex; C :Array [0..11] of Complex; Q :Array [0..1] of Integer; coNST A1 :Array [0..11] of Complex = ( ( re:1.0; im:0.0 ),( re:0.0; im:0.0 ),( re:0.0; im:0.0 ),( re:1.0; im:0.0 ),( re:0.0; im:0.0 ),( re:0.0; im:0.0 ),( re:0.0; im:0.0 ),( re:0.0; im:0.0 ),( re:1.0; im:0.0 ),( re:0.0; im:0.0 ),( re:0.0; im:1.0 ),( re:1.0; im: 0.0 ) ); B :Array [0..5] of Complex = ( ( re:2.0; im:1.0 ),( re:2.0; im:0.0 ),( re:1.0; im:0.0 ),( re:1.0; im:0.0 ),( re:2.0; im:0.0 ),( re:2.0; im: -1.0 ) ); L :Array [0..1] of Integer = ( 2,1 ); N :Array [0..1] of Integer = ( 2,1 ); begin Result := ''; { результат функции } P := 3; M := 2; ASK2C(A1,B,Y,B3,L,N,C,Q,M,P); Result := Result + #$0D#$0A; for _i:=0 to 5 do begin Result := Result + Format('%20.16f %20.16f ',[Y[_i].re,Y[_i].im]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 5 do begin Result := Result + Format('%20.16f %20.16f ',[B[_i].re,B[_i].im]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 11 do begin Result := Result + Format('%20.16f %20.16f ',[A1[_i].re,A1[_i].im]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 11 do begin Result := Result + Format('%20.16f %20.16f ',[B3[_i].re,B3[_i].im]); if ( ((_i+1) mod 2)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TASK2C',Result); { вывод результатов в файл TASK2C.res } exit; end; end. Результат: Y = ( (1., 0.), (1., 0.), (1., 0.), (1., 0.), (1., 0.), (1., 0.) )