Расчетное задание / КМ4 / Отчет КМ4 с ошибками Долгов Р ТФ-12-20
.pdf
Fortran:
Результаты совпадают.
Подпрограмма №3: Compute determinant after factoring (Вычислить определитель после разложения на множители).
Задача: Вычислить определитель комплексной Эрмитовой матрицы с учетом разложения вида U·DUH.
Для этого используем: CALL LFDHF (N, FAC, LDFAC, IPVT, DET1, DET2)
11
Входные параметры подпрограммы:
1.N — Число уравнений.
2.FAC — Комплексная матрица размерностью NxN, содержащая разложение матрицы коэффициентов A в качестве выходных данных процедуры LFCHF/DLFCHF или LFTHF/DLFTHTHF. Используется только верхний треугольник FAC.
3.LDFAC — ведущее измерение FAC в точности так, как указано в инструкции измерения вызывающей программы.
4.IPVT — вектор длины N, содержащий сводную информацию для факторизации A в качестве выходных данных из процедуры
LFCHF/DLFCHF или LFTHF/DLFTHTHF.
Выходные параметры подпрограммы:
1.DET1 — скалярный параметр, содержащий мантиссу определителя. Значение, установленное в 1, нормализуется таким образом, что 1.0 = |DET1| < 10.0 или DET 1 = 0.0.
2.DET2 — скалярный параметр, содержащий показатель степени определителя. Определитель возвращается в виде det(A) = DET1∙10DET2.
Алгоритм.
Процедура LFDHF вычисляет определитель комплексной Эрмитовой матрицы неопределенных коэффициентов. Чтобы вычислить определитель, матрица коэффициентов должна сначала подвергнуться разложению вида U·DUH. Это можно сделать, вызвав либо LFCHF, либо LFТHF. Поскольку det U = ±1, для вычисления определителя используется формула det A = det U det D det UH = det D. Det D вычисляется как произведение определителей его блоков.
Пример решения.
Перенесем пример из библиотеки IMSL в систему программирования Fortran и сравним результаты описанные в IMSL и полученные в программе.
12
Компиляция – 0 ошибок, 0 предупреждений.
13
Линкинг – 0 ошибок, о предупреждений.
Для наглядности сравним результаты из программы и примера в IMSL.
IMSL:
14
Fortran:
Результаты совпадают.
Объединение процедур.
Листинг программы с одинарной точностью.
program odinarnaya_tochonst implicit none
! Объявление переменных
INTEGER LDA, N, I, j, k, z, v PARAMETER (LDA=3, N=3) INTEGER IPVT(N), NOUT
REAL RCOND, DET1, DET2, START, FINISH
COMPLEX A(LDA,LDA), B(N,3), X(N,3), FAC(LDA,LDA), C(N), D(N), RES(N), M1(3,12000000), M2(3,12000000), M3(12000000)
CALL CPU_TIME (START)
DATA A/(3.0,0.0), (1.0,1.0), (4.0,0.0), (1.0,-1.0), (2.0,0.0), (-5.0,-1.0), (4.0,0.0), (- 5.0,1.0), (-2.0,0.0)/
DATA B/(7.0,32.0), (-39.0,-21.0), (51.0,9.0), (-6.0,11.0), (-5.5,-22.5), (16.0,17.0), (- 2.0,-17.0), (4.0,10.0), (-2.0,12.0)/
DATA C/(7.0,32.0), (-39.0,-21.0), (51.0,9.0)/ DO j=1,12000000-2,3
DO k=0,2 M1(1,j+k)=A(1,1+k) M1(2,j+k)=A(2,1+k) M1(3,j+k)=A(3,1+k) A(1,1+k)=A(1,1+k)+(0.001/j) A(2,1+k)=A(2,1+k)+(0.001/j) A(3,1+k)=A(3,1+k)+(0.001/j)
15
M2(1,j+k)=B(1,1+k)
M2(2,j+k)=B(2,1+k)
M2(3,j+k)=B(3,1+k)
B(1,1+k)=B(1,1+k)+(0.001/j)
B(2,1+k)=B(2,1+k)+(0.001/j)
B(3,1+k)=B(3,1+k)+(0.001/j)
M3(j+k)=C(1+k)
C(1+k)=C(1+k)+(0.001/j) end do
end do
DO z=1,12000000-2,3 DO k=0,2 A(1,1+k)=M1(1,z+k) A(2,1+k)=M1(2,z+k) A(3,1+k)=M1(3,z+k) B(1,1+k)=M2(1,z+k) B(2,1+k)=M2(2,z+k) B(3,1+k)=M2(3,z+k) C(1+k)=M3(z+k) END DO
! Программа 1
CALL LFTHF (N, A, LDA, FAC, LDA, IPVT) DO 10 I=1, 3
CALL LFSHF (N, FAC, LDA, IPVT, B(1,I), X(1,I)) 10 CONTINUE
CALL WRCRN ('X', N, 3, X, N, 0) ! Программа 2
CALL UMACH (2, NOUT)
CALL LFCHF (N, A, LDA, FAC, LDA, IPVT, RCOND) WRITE (NOUT,99998) RCOND, 1.0E0/RCOND
DO 20 I=1, 3
CALL LFIHF (N, A, LDA, FAC, LDA, IPVT, C, D, RES) WRITE (NOUT,99999) I
CALL WRCRN ('D', 1, N, D, 1, 0) CALL WRCRN ('RES', 1, N, RES, 1, 0) C(2) = C(2) + (0.2E0, 0.2E0)
20 CONTINUE
99998 FORMAT (' RCOND = ',F5.3,/,' L1 Condition number = ',F6.3) 99999 FORMAT (//,' For problem ', I1)
! Программа 3
CALL LFTHF (N, A, LDA, FAC, LDA, IPVT) CALL LFDHF (N, FAC, LDA, IPVT, DET1, DET2) CALL UMACH (2, NOUT)
WRITE (NOUT,99997) DET1, DET2
99997 FORMAT (' The determinant is', F5.1, ' * 10**', F2.0)
16
END DO
CALL CPU_TIME (FINISH)
PRINT *, 'TIME = ', FINISH-START, ' SEC' end program odinarnaya_tochonst
Листинг программы с двойной точностью.
program dvoinaya_tochnost implicit none
! Объявление переменных
INTEGER LDA, N, I, j, k, z, v PARAMETER (LDA=3, N=3) INTEGER IPVT(N), NOUT
REAL(8) RCOND, DET1, DET2, START, FINISH
COMPLEX(8) A(LDA,LDA), B(N,3), X(N,3), FAC(LDA,LDA), C(N), D(N), RES(N), M1(3,12000000), M2(3,12000000), M3(12000000)
CALL CPU_TIME (START)
DATA A/(3.0,0.0), (1.0,1.0), (4.0,0.0), (1.0,-1.0), (2.0,0.0), (-5.0,-1.0), (4.0,0.0), (- 5.0,1.0), (-2.0,0.0)/
DATA B/(7.0,32.0), (-39.0,-21.0), (51.0,9.0), (-6.0,11.0), (-5.5,-22.5), (16.0,17.0), (- 2.0,-17.0), (4.0,10.0), (-2.0,12.0)/
DATA C/(7.0,32.0), (-39.0,-21.0), (51.0,9.0)/ DO j=1,12000000-2,3
DO k=0,2 M1(1,j+k)=A(1,1+k) M1(2,j+k)=A(2,1+k) M1(3,j+k)=A(3,1+k) A(1,1+k)=A(1,1+k)+(0.001/j) A(2,1+k)=A(2,1+k)+(0.001/j) A(3,1+k)=A(3,1+k)+(0.001/j) M2(1,j+k)=B(1,1+k) M2(2,j+k)=B(2,1+k) M2(3,j+k)=B(3,1+k) B(1,1+k)=B(1,1+k)+(0.001/j) B(2,1+k)=B(2,1+k)+(0.001/j) B(3,1+k)=B(3,1+k)+(0.001/j) M3(j+k)=C(1+k) C(1+k)=C(1+k)+(0.001/j) END DO
END DO
DO z=1,12000000-2,3 DO k=0,2 A(1,1+k)=M1(1,z+k) A(2,1+k)=M1(2,z+k) A(3,1+k)=M1(3,z+k)
17
B(1,1+k)=M2(1,z+k)
B(2,1+k)=M2(2,z+k)
B(3,1+k)=M2(3,z+k)
C(1+k)=M3(z+k) END DO
! Программа 1
CALL DLFTHF (N, A, LDA, FAC, LDA, IPVT) DO 10 I=1, 3
CALL DLFSHF (N, FAC, LDA, IPVT, B(1,I), X(1,I)) 10 CONTINUE
CALL WRCRN ('X', N, 3, X, N, 0) ! Программа 2
CALL UMACH (2, NOUT)
CALL DLFCHF (N, A, LDA, FAC, LDA, IPVT, RCOND) WRITE (NOUT,99998) RCOND, 1.0E0/RCOND
DO 20 I=1, 3
CALL DLFIHF (N, A, LDA, FAC, LDA, IPVT, C, D, RES) WRITE (NOUT,99999) I
CALL WRCRN ('D', 1, N, D, 1, 0) CALL WRCRN ('RES', 1, N, RES, 1, 0) C(2) = C(2) + (0.2E0, 0.2E0)
20 CONTINUE
99998 FORMAT (' RCOND = ',F5.3,/,' L1 Condition number = ',F6.3) 99999 FORMAT (//,' For problem ', I1)
! Программа 3
CALL DLFTHF (N, A, LDA, FAC, LDA, IPVT) CALL DLFDHF (N, FAC, LDA, IPVT, DET1, DET2) CALL UMACH (2, NOUT)
WRITE (NOUT,99997) DET1, DET2
99997 FORMAT (' The determinant is', F5.1, ' * 10**', F2.0) END DO
CALL CPU_TIME (FINISH)
PRINT *, 'TIME = ', FINISH-START, ' SEC' end program dvoinaya_tochnost
Расчет памяти.
В программе используется матрица А размерностью 3х3, матрица В размерностью 3х3, а также вектор-столбец С 3х1. В постановке задачи исследования производительности ПК необходимо выполнение программы минимум 40 секунд времени, с учётом ограничения на используемую RAMпамять компьютера (минимум 300-400 Мб), поэтому для увеличения используемой процессом памяти было необходимо создать буферную матрицу.
18
При 300 Мб выполняется минимум по времени. Посчитаем необходимое количество элементов:
(300 ∙ 1024 ∙ 1024) / (4 ∙ 3 ∙ 2 + 1) = 11234736 элементов.
Примем значение 12000000. Тогда объем памяти для одинарной точности будет составлять 320,43 Мб. Соответсвтенно для двойной точности объем памяти составит 640,86 Мб.
4 Байта предоставляется 1 элементу вещественного типа REAL. Так как будет использоваться 2 буферные матрицы – делим на 2. Таким образом, 2 буферные матрицы будет иметь размерность (3, 12000000), а буферный вектор столбец (12000000).
Основные параметры тестируемой системы.
∙CPU – Intel(R) Core(TM) i7-12800 1.80 GHz 3.70 GHz; 14 ядер, 20 потоков
∙RAM – 16.00 Гб Kingston 9905600-119.A00G DDR4 SO-DIMM 8 Gb, Kingston 9905600-119.A00G DDR4 SO-DIMM 8 Gb
∙SSD – NVMe Kingston RBUSNS8 1 Тб
∙Windows 11 Домашняя для одного языка, 64-разрядная
Результаты измерений.
Таблица 1 – результаты 90 расчетов в режиме debug с одинарной точностью
Т1 = |
Т2 = |
Т3 = |
Т4 = |
Т5 = |
Т6 = |
Т7 = |
Т8 = |
Т9 = |
Т10 = |
22.92 |
17.09 |
16.93 |
10.98 |
18.56 |
20.42 |
13.76 |
21.00 |
27.79 |
21.67 |
Т11 = |
Т12 = |
Т13 = |
Т14 = |
Т15 = |
Т16 = |
Т17 = |
Т18 = |
Т19 = |
Т20 = |
23.56 |
17.00 |
23.23 |
27.26 |
41.85 |
18.45 |
9.734 |
8.031 |
12.85 |
17.94 |
Т21 = |
Т22 = |
Т23 = |
Т24 = |
Т25 = |
Т26 = |
Т27 = |
Т28 = |
Т29 = |
Т30 = |
14.96 |
9.265 |
18.91 |
14.78 |
14.07 |
18.92 |
17.14 |
16.96 |
19.55 |
25.28 |
Т31 = |
Т32 = |
Т33 = |
Т34 = |
Т35 = |
Т36 = |
Т37 = |
Т38 = |
Т39 = |
Т40 = |
27.58 |
21.50 |
21.50 |
21.94 |
21.70 |
16.00 |
23.31 |
20.59 |
20.21 |
22.71 |
Т41 = |
Т42 = |
Т43 = |
Т44 = |
Т45 = |
Т46 = |
Т47 = |
Т48 = |
Т49 = |
Т50 = |
17.21 |
25.10 |
27.70 |
22.70 |
21.98 |
21.85 |
26.62 |
18.73 |
20.50 |
28.92 |
Т51 = |
Т52 = |
Т53 = |
Т54 = |
Т55 = |
Т56 = |
Т57 = |
Т58 = |
Т59 = |
Т60 = |
29.76 |
20.01 |
31.85 |
24.59 |
30.53 |
33.31 |
25.51 |
34.10 |
23.57 |
29.32 |
Т61 = |
Т62 = |
Т63 = |
Т64 = |
Т65 = |
Т66 = |
Т67 = |
Т68 = |
Т69 = |
Т70 = |
46.40 |
52.34 |
25.12 |
15.09 |
22.28 |
22.31 |
16.57 |
27.84 |
10.87 |
5.984 |
Т71 = |
Т72 = |
Т73 = |
Т74 = |
Т75 = |
Т76 = |
Т77 = |
Т78 = |
Т79 = |
Т80 = |
16.34 |
11.40 |
16.73 |
16.43 |
18.89 |
16.75 |
14.69 |
7.328 |
8.141 |
12.23 |
Т81 = |
Т82 = |
Т83 = |
Т84 = |
Т85 = |
Т86 = |
Т87 = |
Т88 = |
Т89 = |
Т90 = |
13.73 |
18.97 |
11.73 |
27.20 |
22.09 |
28.05 |
27.56 |
13.84 |
7.250 |
12.83 |
19
Таблица 2 – результаты 90 расчетов в режиме realise с одинарной точностью
Т1 = |
Т2 = |
Т3 = |
Т4 = |
Т5 = |
Т6 = |
Т7 = |
Т8 = |
Т9 = |
Т10 = |
25.14 |
13.89 |
19.125 |
19.66 |
21.23 |
20.7 |
25.37 |
22.28 |
24.97 |
24.09 |
Т11 = |
Т12 = |
Т13 = |
Т14 = |
Т15 = |
Т16 = |
Т17 = |
Т18 = |
Т19 = |
Т20 = |
19.40 |
22.17 |
23.09 |
28.54 |
32.00 |
23.93 |
20.62 |
28.50 |
28.09 |
14.79 |
Т21 = |
Т22 = |
Т23 = |
Т24 = |
Т25 = |
Т26 = |
Т27 = |
Т28 = |
Т29 = |
Т30 = |
19.35 |
24.56 |
22.28 |
22.12 |
20.40 |
19.18 |
25.35 |
14.89 |
19.21 |
22.73 |
Т31 = |
Т32 = |
Т33 = |
Т34 = |
Т35 = |
Т36 = |
Т37 = |
Т38 = |
Т39 = |
Т40 = |
21.79 |
18.65 |
16.50 |
26.85 |
24.34 |
25.98 |
24.64 |
25.35 |
23.51 |
25.39 |
Т41 = |
Т42 = |
Т43 = |
Т44 = |
Т45 = |
Т46 = |
Т47 = |
Т48 = |
Т49 = |
Т50 = |
20.04 |
27.09 |
25.20 |
48.04 |
26.03 |
26.31 |
28.48 |
24.43 |
19.51 |
24.37 |
Т51 = |
Т52 = |
Т53 = |
Т54 = |
Т55 = |
Т56 = |
Т57 = |
Т58 = |
Т59 = |
Т60 = |
29.17 |
23.62 |
25.70 |
20.85 |
27.67 |
24.37 |
25.84 |
24.50 |
18.53 |
32.00 |
Т61 = |
Т62 = |
Т63 = |
Т64 = |
Т65 = |
Т66 = |
Т67 = |
Т68 = |
Т69 = |
Т70 = |
25.86 |
23.20 |
28.41 |
31.23 |
30.16 |
21.72 |
21.73 |
34.86 |
28.79 |
31.61 |
Т71 = |
Т72 = |
Т73 = |
Т74 = |
Т75 = |
Т76 = |
Т77 = |
Т78 = |
Т79 = |
Т80 = |
33.86 |
22.86 |
22.54 |
23.14 |
25.95 |
31.39 |
26.41 |
16.35 |
16.98 |
24.98 |
Т81 = |
Т82 = |
Т83 = |
Т84 = |
Т85 = |
Т86 = |
Т87 = |
Т88 = |
Т89 = |
Т90 = |
16.53 |
20.12 |
18.72 |
15.34 |
15.05 |
19.70 |
33.13 |
16.75 |
29.67 |
30.44 |
Таблица 3 – результаты 90 расчетов в режиме realise с двойной точностью
Т1 = |
Т2 = |
Т3 = |
Т4 = |
Т5 = |
Т6 = |
Т7 = |
Т8 = |
Т9 = |
Т10 = |
42.12 |
44.86 |
57.25 |
46.21 |
53.75 |
57.43 |
63.11 |
59.09 |
71.56 |
43.04 |
Т11 = |
Т12 = |
Т13 = |
Т14 = |
Т15 = |
Т16 = |
Т17 = |
Т18 = |
Т19 = |
Т20 = |
48.04 |
54.44 |
49.65 |
51.22 |
56.78 |
64.08 |
54.44 |
58.95 |
59.92 |
51.14 |
Т21 = |
Т22 = |
Т23 = |
Т24 = |
Т25 = |
Т26 = |
Т27 = |
Т28 = |
Т29 = |
Т30 = |
47.63 |
45.06 |
38.21 |
54.82 |
58.23 |
64.61 |
53.73 |
58.42 |
63.63 |
40.27 |
Т31 = |
Т32 = |
Т33 = |
Т34 = |
Т35 = |
Т36 = |
Т37 = |
Т38 = |
Т39 = |
Т40 = |
35.22 |
58.36 |
64.87 |
55.24 |
69.51 |
74.32 |
34.11 |
43.70 |
37.89 |
59.29 |
Т41 = |
Т42 = |
Т43 = |
Т44 = |
Т45 = |
Т46 = |
Т47 = |
Т48 = |
Т49 = |
Т50 = |
32.01 |
58.11 |
58.96 |
64.44 |
46.74 |
56.42 |
31.12 |
45.00 |
62.34 |
38.87 |
Т51 = |
Т52 = |
Т53 = |
Т54 = |
Т55 = |
Т56 = |
Т57 = |
Т58 = |
Т59 = |
Т60 = |
53.24 |
59.37 |
61.98 |
55.64 |
62.43 |
58.41 |
39.31 |
52.60 |
55.75 |
58.80 |
Т61 = |
Т62 = |
Т63 = |
Т64 = |
Т65 = |
Т66 = |
Т67 = |
Т68 = |
Т69 = |
Т70 = |
29.07 |
50.05 |
47.87 |
65.42 |
55.41 |
75.32 |
53.76 |
38.05 |
58.88 |
53.86 |
Т71 = |
Т72 = |
Т73 = |
Т74 = |
Т75 = |
Т76 = |
Т77 = |
Т78 = |
Т79 = |
Т80 = |
46.32 |
46.76 |
45.68 |
69.91 |
45.00 |
53.62 |
46.00 |
44.32 |
58.64 |
70.53 |
Т81 = |
Т82 = |
Т83 = |
Т84 = |
Т85 = |
Т86 = |
Т87 = |
Т88 = |
Т89 = |
Т90 = |
52.22 |
69.98 |
53.76 |
64.32 |
41.18 |
42.76 |
60.02 |
43.34 |
64.56 |
56.01 |
Обработка результатов измерений.
Выполним сортировку результатов с помощью внутренней функции
Mathcad Sort(V):
Таблица 4 – отсортированные данные
Номер измерения |
debug, с |
realise, одинарная |
realise, двойная |
|
точность, с |
точность, с |
|||
|
|
|||
1 |
5.984 |
13.89 |
29.07 |
|
|
|
|
|
|
2 |
7.25 |
14.79 |
31.12 |
|
|
|
|
|
20
