powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / FORTRAN неправильно работает с матрицами!
17 сообщений из 17, страница 1 из 1
FORTRAN неправильно работает с матрицами!
    #38651970
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

Обратная матрица (-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
FORTRAN неправильно работает с матрицами!
    #38652120
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
simpler.methodПровел разными способами расчет обращения матрицы,
Результаты - не совпадают!
Чему верить?
Более чем лень смотреть Вашу тусклую портянку, но сходу мне помнится, что в Фортране был какой-то прикол с индексацией многомерных массивов. То ли индексы в необычном порядке, то ли что-то подобное. Посмотрите, не путаются ли у вас иксы с игреками.
...
Рейтинг: 0 / 0
FORTRAN неправильно работает с матрицами!
    #38652130
simpler.method
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходники 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
FORTRAN неправильно работает с матрицами!
    #38652133
simpler.method
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"разноцветный" код можно посмотреть здесь:
http://dxdy.ru/topic84682.html
...
Рейтинг: 0 / 0
FORTRAN неправильно работает с матрицами!
    #38652163
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Разноцветный" код можно и тут показать.
Используй кнопку 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
FORTRAN неправильно работает с матрицами!
    #38652250
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.05.2014 15:48, softwarer wrote:


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

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

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



В fortran-е матрицы храняться по столбцам .
...
Рейтинг: 0 / 0
FORTRAN неправильно работает с матрицами!
    #38652259
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВ fortran-е матрицы храняться по строкам.
Точно, спасибо.
...
Рейтинг: 0 / 0
FORTRAN неправильно работает с матрицами!
    #38652758
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
FORTRAN неправильно работает с матрицами!
    #38653077
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы в топик зашёл настоящий Фортранщик - он бы скрежетал зубами
топал ногами, прочтя только одно название.

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

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

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

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

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

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

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

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

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

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

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

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


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