Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / FORTRAN неправильно работает с матрицами! / 17 сообщений из 17, страница 1 из 1
26.05.2014, 13:15
    #38651970
simpler.method
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
Провел разными способами расчет обращения матрицы,
Результаты - не совпадают!
Чему верить?

Входная матрица
|1.0|7.|11.|
|7.0|3.|9.0|
|11.|9.|5.0|

1. Расчет на сайте http://matrixcalc.org/

Определитель = 712.000

Обратная матрица (-1)
|-0.093|00.090|00.042|
|00.090|-0.163|00.096|
|00.042|00.096|-0.065|

2. Расчет на Fortran п/п MINV
(см. код ниже)

Определитель = 316.364

Обратная матрица (-1)
|000.043|-0.153|00.644|
|-00.095|00.237|-0.392|
|-10.545|-0.009|00.056|

!==============================
! Обращение матрицы (общего вида)
! A - входная матрица, заменяется обратной
! N - порядок матрицы A
! D - вычисляемый определитель
! L,M - рабочие векторы размерности (N)
SUBROUTINE MINV(A,N,D,L,M)
DIMENSION A(1),L(1),M(1)
D=1.0
NK=-N
DO 80 K=1,N
NK=NK+N
L(K)=K
M(K)=K
KK=NK+K
BIGA=A(KK)
DO 20 J=K,N
IZ=N*(J-1)
DO 20 I=K,N
IJ=IZ+I
10 IF( ABS(BIGA)- ABS(A(IJ))) 15,20,20
15 BIGA=A(IJ)
L(K)=I
M(K)=J
20 CONTINUE
J=L(K)
IF(J-K) 35,35,25
25 KI=K-N
DO 30 I=1,N
KI=KI+N
HOLD=-A(KI)
JI=KI-K+J
A(KI)=A(JI)
30 A(JI) =HOLD
35 I=M(K)
IF(I-K) 45,45,38
38 JP=N*(I-1)
DO 40 J=1,N
JK=NK+J
JI=JP+J
HOLD=-A(JK)
A(JK)=A(JI)
40 A(JI) =HOLD
45 IF(BIGA) 48,46,48
46 D=0.0
RETURN
48 DO 55 I=1,N
IF(I-K) 50,55,50
50 IK=NK+I
A(IK)=A(IK)/(-BIGA)
55 CONTINUE
DO 65 I=1,N
IK=NK+I
HOLD=A(IK)
IJ=I-N
DO 65 J=1,N
IJ=IJ+N
IF(I-K) 60,65,60
60 IF(J-K) 62,65,62
62 KJ=IJ-I+K
A(IJ)=HOLD*A(KJ)+A(IJ)
65 CONTINUE
KJ=K-N
DO 75 J=1,N
KJ=KJ+N
IF(J-K) 70,75,70
70 A(KJ)=A(KJ)/BIGA
75 CONTINUE
D=D*BIGA
A(KK)=1.0/BIGA
80 CONTINUE
K=N
100 K=(K-1)
IF(K) 150,150,105
105 I=L(K)
IF(I-K) 120,120,108
108 JQ=N*(K-1)
JR=N*(I-1)
DO 110 J=1,N
JK=JQ+J
HOLD=A(JK)
JI=JR+J
A(JK)=-A(JI)
110 A(JI)=HOLD
120 J=M(K)
IF(J-K) 100,100,125
125 KI=K-N
DO 130 I=1,N
KI=KI+N
HOLD=A(KI)
JI=KI-K+J
A(KI)=-A(JI)
130 A(JI)=HOLD
GO TO 100
150 RETURN
END
!==============================
program test_f
dimension OMI(9),OM(3,3)
! Cчитывание из файла "input.txt" линейного массива OMI(9)
open(11,file='C:\test_f\input.txt',status='old')
read(11,*)OMI
close(11)
! Преобразование линейного массива OMI(9) в массив OM(3,3)
II=0
DO 21 I1=1,3
DO 21 J1=1,3
II=II+1
21 OM(I1,J1)=OMI(II)
N=3
L=N
M=N
! Вывод в файл входных данных
open(12, file='C:\test_f\output.txt')
print 53,N,L,M
write (12,53)N,L,M
DO 22 I1=1,3
! Печать входной матрицы OM(3,3)
write (12,55)(OM(I1,J1),J1=1,3)
22 print 55,(OM(I1,J1),J1=1,3)
! Вызов п/п обращения матрицы OM(3,3)
CALL MINV(OM,N,DD,L,M)
! Обращение матрицы (общего вида)
print 54,N,L,M,DD
write (12,54)N,L,M,DD
! Печать обратной матрицы OM(3,3)
DO 23 I1=1,3
print 55,(OM(I1,J1),J1=1,3)
23 write (12,55)(OM(I1,J1),J1=1,3)
close(12)
53 format ('N,L,M=',3i3)
54 format ('N,L,M,D=',3i3,f9.3)
55 format ('OM:',99f8.3)
end program test_f
...
Рейтинг: 0 / 0
26.05.2014, 14:48
    #38652120
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
simpler.methodПровел разными способами расчет обращения матрицы,
Результаты - не совпадают!
Чему верить?
Более чем лень смотреть Вашу тусклую портянку, но сходу мне помнится, что в Фортране был какой-то прикол с индексацией многомерных массивов. То ли индексы в необычном порядке, то ли что-то подобное. Посмотрите, не путаются ли у вас иксы с игреками.
...
Рейтинг: 0 / 0
26.05.2014, 14:56
    #38652130
simpler.method
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
Исходники MINV взял из 2-х мест (см. ниже) - считают одинаково.
1) http://www.cyberforum.ru/fortran/thread168070.html
2) Сборник научных программ на Фортране http://mirknig.com/knigi/programming/1181545162-sbornik-nauchnyh-programm-na-fortrane.html

Вот входной файл "input.txt"
1.,7.,11.,7.,3.,9.,11.,9.,5.

"output.txt"
Вот так сформировалась входная матрица:
N,L,M= 3 3 3
OM: 1.000 7.000 11.000
OM: 7.000 3.000 9.000
OM: 11.000 9.000 5.000

Вот результаты расчета:
N,L,M,D= 3 2 1 316.364
OM: 0.043 -0.153 0.644
OM: -0.095 0.237 -0.392
OM: -10.545 -0.009 0.056
...
Рейтинг: 0 / 0
26.05.2014, 14:58
    #38652133
simpler.method
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
"разноцветный" код можно посмотреть здесь:
http://dxdy.ru/topic84682.html
...
Рейтинг: 0 / 0
26.05.2014, 15:13
    #38652163
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
"Разноцветный" код можно и тут показать.
Используй кнопку SRC
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
!==============================
! Обращение матрицы (общего вида)
! A - входная матрица, заменяется обратной 
! N - порядок матрицы A
! D - вычисляемый определитель
! L,M - рабочие векторы размерности (N)
      SUBROUTINE MINV(A,N,D,L,M)
      DIMENSION A(1),L(1),M(1)
      D=1.0
      NK=-N
      DO 80 K=1,N
      NK=NK+N
      L(K)=K
      M(K)=K
      KK=NK+K
      BIGA=A(KK)
      DO 20 J=K,N
      IZ=N*(J-1)
      DO 20 I=K,N
      IJ=IZ+I
   10 IF( ABS(BIGA)- ABS(A(IJ))) 15,20,20
   15 BIGA=A(IJ)
      L(K)=I
      M(K)=J
   20 CONTINUE
      J=L(K)
      IF(J-K) 35,35,25
   25 KI=K-N
      DO 30 I=1,N
      KI=KI+N
      HOLD=-A(KI)
      JI=KI-K+J
      A(KI)=A(JI)
   30 A(JI) =HOLD
   35 I=M(K)
      IF(I-K) 45,45,38
   38 JP=N*(I-1)
      DO 40 J=1,N
      JK=NK+J
      JI=JP+J
      HOLD=-A(JK)
      A(JK)=A(JI)
   40 A(JI) =HOLD
   45 IF(BIGA) 48,46,48
   46 D=0.0
      RETURN
   48 DO 55 I=1,N
      IF(I-K) 50,55,50
   50 IK=NK+I
      A(IK)=A(IK)/(-BIGA)
   55 CONTINUE
      DO 65 I=1,N
      IK=NK+I
      HOLD=A(IK)
      IJ=I-N
      DO 65 J=1,N
      IJ=IJ+N
      IF(I-K) 60,65,60
   60 IF(J-K) 62,65,62
   62 KJ=IJ-I+K
      A(IJ)=HOLD*A(KJ)+A(IJ)
   65 CONTINUE
      KJ=K-N
      DO 75 J=1,N
      KJ=KJ+N
      IF(J-K) 70,75,70
   70 A(KJ)=A(KJ)/BIGA
   75 CONTINUE
      D=D*BIGA
      A(KK)=1.0/BIGA
   80 CONTINUE
      K=N
  100 K=(K-1)
      IF(K) 150,150,105
  105 I=L(K)
      IF(I-K) 120,120,108
  108 JQ=N*(K-1)
      JR=N*(I-1)
      DO 110 J=1,N
      JK=JQ+J
      HOLD=A(JK)
      JI=JR+J
      A(JK)=-A(JI)
  110 A(JI)=HOLD
  120 J=M(K)
      IF(J-K) 100,100,125
  125 KI=K-N
      DO 130 I=1,N
      KI=KI+N
      HOLD=A(KI)
      JI=KI-K+J
      A(KI)=-A(JI)
  130 A(JI)=HOLD
      GO TO 100
  150 RETURN
      END
!==============================
   program test_f
   dimension OMI(9),OM(3,3)
! Cчитывание из файла "input.txt" линейного массива OMI(9)
   open(11,file='C:\test_f\input.txt',status='old')
   read(11,*)OMI
   close(11)
! Преобразование линейного массива OMI(9) в массив OM(3,3)
      II=0
   DO 21 I1=1,3
      DO 21 J1=1,3
      II=II+1
   21 OM(I1,J1)=OMI(II)
  N=3 
  L=N
  M=N
! Вывод в файл входных данных
  open(12, file='C:\test_f\output.txt')
print 53,N,L,M
write (12,53)N,L,M
   DO 22 I1=1,3
! Печать входной матрицы OM(3,3)
write (12,55)(OM(I1,J1),J1=1,3)
22 print 55,(OM(I1,J1),J1=1,3)
! Вызов п/п обращения матрицы OM(3,3)
   CALL MINV(OM,N,DD,L,M)
! Обращение матрицы (общего вида)
print 54,N,L,M,DD
write (12,54)N,L,M,DD
! Печать обратной матрицы OM(3,3)
   DO 23 I1=1,3
print 55,(OM(I1,J1),J1=1,3)
23 write (12,55)(OM(I1,J1),J1=1,3)
   close(12)
53 format ('N,L,M=',3i3)
54 format ('N,L,M,D=',3i3,f9.3)
55 format ('OM:',99f8.3)
   end program test_f

...
Рейтинг: 0 / 0
26.05.2014, 16:15
    #38652250
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
On 26.05.2014 15:48, softwarer wrote:


> Более чем лень смотреть Вашу тусклую портянку, но сходу мне помнится,
> что в Фортране был какой-то прикол с индексацией многомерных массивов.
> То ли индексы в необычном порядке, то ли что-то подобное. Посмотрите, не

В fortran-е матрицы храняться по строкам. Это значит, что соседние в
строке элементы матрицы храняться в смежных адресах памяти. А соседные в
столбце -- не в смежных.
В С наоборот. Но это имеет значение только тогда, когда программа
написна на смеси языков, например, C & Fortran. Если всё написано на
Fortran-е, то это всё не важно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.05.2014, 16:19
    #38652258
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
Сори,

MasterZivВ fortran-е матрицы храняться по строкам.



В fortran-е матрицы храняться по столбцам .
...
Рейтинг: 0 / 0
26.05.2014, 16:20
    #38652259
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
MasterZivВ fortran-е матрицы храняться по строкам.
Точно, спасибо.
...
Рейтинг: 0 / 0
27.05.2014, 09:37
    #38652758
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
simpler.method Чему верить?

Входная матрица
|1.0|7.|11.|
|7.0|3.|9.0|
|11.|9.|5.0|

1. Расчет на сайте http://matrixcalc.org/

Определитель = 712.000

Обратная матрица (-1)
|-0.093|00.090|00.042|
|00.090|-0.163|00.096|
|00.042|00.096|-0.065|

2. Расчет на Fortran п/п MINV
(см. код ниже)

Определитель = 316.364

Себе верить, ручками посчитайте. Матрица не 10 на 10 чтобы программы писать. 712.

Второе выделение-детерминант не целый, очевидно недоработка в программе, у матрицы с целыми числами, очевидно будет целый определитель.


авторВ fortran-е матрицы храняться по строкам. Это значит, что соседние в
строке элементы матрицы храняться в смежных адресах памяти. А соседные в
столбце -- не в смежных.
В С наоборот. Но это имеет значение только тогда, когда программа
написна на смеси языков, например, C & Fortran. Если всё написано на
Fortran-е, то это всё не важно.

в любом случае определитель транспонированной матрицы равен определителю обычной.



Не вникая в код, у вас вероятно проблема в алгоритме, тип данных вероятно, ибо при операция с целыми числами (если у вас нет деления, те я не говорю про обратную матрицу), вы не получили бы такой определитель.
Код ужасный. Изучите лучше Си.
...
Рейтинг: 0 / 0
27.05.2014, 12:38
    #38653077
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
Если бы в топик зашёл настоящий Фортранщик - он бы скрежетал зубами
топал ногами, прочтя только одно название.

Самый математичный ЯП на котором написаны самые лучшие библиотеки
для математики, оказывается "неправильно работает с матрицами"!
...
Рейтинг: 0 / 0
28.05.2014, 09:12
    #38654069
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
так кто же работает неправильно - фортран или топикстартер?

simpler.method http://dxdy.ru/topic84682.html Судя по тому топику, фортран-таки правильно работает с матрицами ;)
...
Рейтинг: 0 / 0
28.05.2014, 12:43
    #38654350
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
On 27.05.2014 13:38, mayton wrote:

> Самый математичный ЯП на котором написаны самые лучшие библиотеки
> для математики, оказывается "неправильно работает с матрицами"!

НЕправда. Самый математичный язык -- лисп.
В fortran нет дробей (недесятичных). В Common Lisp -- есть.
1/3 в лиспе считается без погрешности, в отличие от fortran-а.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.05.2014, 13:32
    #38654415
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
Моё мнение заимствовано от коллег которые в старые мохнатые времена работали
в НИИ и КБ с фортраном. Вики также плюсует.

wikiОдно из преимуществ современного Фортрана — большое количество написанных на нём программ и библиотек подпрограмм[1]. Среди учёных, например, ходит такая присказка, что любая математическая задача уже имеет решение на Фортране, и, действительно, можно найти среди тысяч фортрановских пакетов и пакет для перемножения матриц, и пакет для решения сложных интегральных уравнений, и многие, многие другие. Ряд таких пакетов создавался на протяжении десятилетий и популярен в научной среде по сей день, например — IMSL (англ.).

Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны. Поэтому изменять, а тем более переписывать их на других языках программирования накладно, несмотря на то, что регулярно производятся попытки автоматического конвертирования FORTRAN-кода на современные языки программирования.
...
Рейтинг: 0 / 0
28.05.2014, 18:35
    #38654920
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
On 28.05.2014 14:32, mayton wrote:

> Одно из преимуществ современного Фортрана — большое количество
> написанных на нём программ и библиотек подпрограмм[1]. Среди учёных,

На самом деле, это -- единственное достоинство этого замечательного
языка программирования.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.05.2014, 03:19
    #38656560
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
В fortran-е матрицы храняться по строкам. Это значит, что соседние в
строке элементы матрицы храняться в смежных адресах памяти. А соседные в
столбце -- не в смежных.
В С наоборот. Но это имеет значение только тогда, когда программа
написна на смеси языков, например, C & Fortran. Если всё написано на
Fortran-е, то это всё не важно.
Это откель такое? Что в фортране, что в С, матрицы хранятся в том порядке в каком программист положит их в массив. Не составляет никакого труда хранить матрицу в программе написанной на фортране по строкам и по столбцам в программе написанной на С. Не стоит отождествлять математическую абстракцию "матрица" и двумерный массив в ЯП.

в любом случае определитель транспонированной матрицы равен определителю обычной
ТС считал определители прямой и обратной матриц. Обратная матрица и транспонированная матрица совпадают только для очень узкого класса ортогональных матриц. Не знаю как вам, мне навскидку не очевидно что прямая матрица у ТС ортогональна.
...
Рейтинг: 0 / 0
30.05.2014, 04:31
    #38656565
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
mikhail_nSSв любом случае определитель транспонированной матрицы равен определителю обычной

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

мда. я прекрасно понял что и кто имел ввиду. Внимательней читайте по какому поводу был тот комментарий.
...
Рейтинг: 0 / 0
30.05.2014, 11:02
    #38656768
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FORTRAN неправильно работает с матрицами!
Раз уж тема все еще жива, добавлю что в случае симметричных матриц (а в примере ТС именно симметричная), есть более эффективные алгоритмы для обращения, чем алгоритмы общего вида. Эффективные - значит более быстрые, а также с меньшей потерей точности при вычислениях.
При этом, матрица записывается в виде одномерного массива (очевидно, достаточны данные от главной диагонали и ниже/выше).
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / FORTRAN неправильно работает с матрицами! / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]