[FORTRAN] Macierze

enigma571
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 22 wrz 2010, o 00:27
Płeć: Mężczyzna
Lokalizacja: Toruń

[FORTRAN] Macierze

Post autor: enigma571 »

Obecnie piszę program [ i język fortran jest jeszcze nadal dla mnie dość obcym ] będący formą kalkulatora macierzowego. z 9 opcji, pozostał mi najgorsze 3 algorytmy które wiem jak w teorii - książkowo wyglądają nawet jak w c++ ale nie w fortranie - potrzebuję pomocy z liczeniem wyznacznika, diagonalizacją (podejrzewam gaussa-jordana) i odwróceniem macierzy. Kolejne elementy programu umieszczame jako case a macierze są wczytywane z pliku o specyficznej budowie
x
n1 m1
n2 m2
...
x11 x12 x13 ...
x21 x22 x23...
.....
y11 y12 y13...
y21 y22 y23...
...
x ilość macierzy
n1 m1 ilość kolumn i wierszy macierzy
x11... kolejne wyrazy 1 macierzy
y11... kolejne wyrazy 2 macierzy kieruję się z prośbą o pomoc jak się za t zabrać podejrzewam, że trzeba będzie korzystać z wyniku wyznacznika do obliczenia innego elementu czyli w case trzeba będzie wrzucić cały algorytm bo nie używam procedury.
makan
Użytkownik
Użytkownik
Posty: 429
Rejestracja: 13 gru 2009, o 11:45
Płeć: Mężczyzna
Lokalizacja: Takla Makan
Pomógł: 92 razy

[FORTRAN] Macierze

Post autor: makan »

Nie napisałeś o który fortran Ci Chodzi, ale zakładam, że o 90. Rzuć okiem na te kawałki kodu, może to pomoże :



[url]http://rsc.anu.edu.au/~harry/COURSES/MATHMETH/node70.html[/url]
enigma571
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 22 wrz 2010, o 00:27
Płeć: Mężczyzna
Lokalizacja: Toruń

[FORTRAN] Macierze

Post autor: enigma571 »

Właśnie zaczynam dopasowywać kod dzięki bardzo:) mam pytanie o poprawność wczytywania danych z początku programu:

plik programy: macierze.f
plik wsadowy o postaci jak w pierwszym poście: dane.txt

Kod: Zaznacz cały

program kalkulator

       !///////////////DEKLARACJA ZMIENNYCH/////////////////////
      
       implicit none
                                                  
       real, dimension (1:10, 1:10, 1:10) :: macierz
       integer, dimension (1:10, 1:2) :: wymiar
       real, dimension (1:10, 1:10) :: wynik
       real, dimension (1:10, 1:10) :: pomoc
       integer, dimension (1:2) :: wynik_wymiar
       integer, dimension (1:2) :: pomoc_wymiar
       real::skal
       integer::i,j,k,t,m1,m2,liczba_macierzy
       logical::komutuja

       !///////////////OPCJE PROGRAMU///////////////////////////
                                                               
       print*,"     Opcje pogramu:    "                         
       print*," "                                              
       print*," 1 - Mnozenie macierzy przez skalar"            
       print*," 2 - Mnozenie dwoch macierzy"                   
       print*," 3 - Dodawanie dwoch macierzy"                   
       print*," 4 - Obliczanie wyznacznika macierzy"          
       print*," 5 - Diagonalizacja macierzy"                   
       print*," 6 - Sprawdzanie komutacji macierzy"            
       print*," 7 - Macierz odwrotna"                          
       print*," 8 - Transponowanie macierzy"                  
       print*," 9 - Wyjscie z programu"                        
                                                               
       !////////////////////////////////////////////////////////
      
       write(*,*) " Prosze o podanie numeru akcji programu : "
       read(*,*)t
       !///////////////////////////////////////////
       open(11,file="dane.txt",status="old")      
       read(11,*)liczba_macierzy                  
       do i=1 ,liczba_macierzy                    
	   read(11,*)wymiar(i,1),wymiar(i,2)       
       enddo                                      
       !///////////////////////////////////////////
       do i=1 ,liczba_macierzy                    
	   do j=1 ,wymiar(i,1)                     
	      do k=1 ,wymiar(i,2)                  
	         read(11,*)macierz(i,j,k)          
             enddo                                      
          enddo                                      
       enddo                                       
       !///////////////////////////////////////////
       do i=1 ,liczba_macierzy                    
	   do j=1 ,wymiar(i,1)                     
	      do k=1 ,wymiar(i,2)                  
	         write(*,*)macierz(i,j,k)          
             enddo                                      
          enddo                                      
       enddo                                      
       !///////////////////////////////////////////
       do i=1, 10                                 
          do j=1, 10                              
             wynik(i,j)=0                         
          enddo                                      
       enddo                                      
                                                  
       do i=1, 10                                  
          do j=1, 10                              
             pomoc(i,j)=0                          
          enddo                                     
       enddo                                       
       !///////////////////////////////////////////

wcięcia tylko tu znikły w kodzie są

-- 25 wrz 2010, o 19:28 --

Kod: Zaznacz cały

!/////////POCZATEK CASE//////////////////////////
         
       select case(t)
       !/////////////////SKALAR///////////////////////////
             case(1)
             open(12,file="wynik.txt",status="new")
             
             write(*,*)"Przez jaka liczbe pomnozyc: "
             read(*,*)skal
             
             print*,"Oblicz iloczyn skalara z macierza dla macierzy nr:"
             read(*,*)m1
             
             do i = 1, wymiar(m1,1)                 
                do j = 1, wymiar(m1,2)              
                  write(12,'(A)',ADVANCE="NO")macierz(m1,i,j), " "       
                enddo
                write(12,*)
             enddo
             
             wynik_wymiar(1)=wymiar(m1,1)
             wynik_wymiar(2)=wymiar(m1,2)
             
             do i = 1, wynik_wymiar(1)
                do j = 1, wynik_wymiar(2)
                   wynik(i,j)=macierz(m1,i,j)*skal
                enddo
             enddo 
             
             do i = 1, wynik_wymiar(1)
                do j = 1,wynik_wymiar(2)
                  write(12,'(A)',ADVANCE="NO")wynik(i,j), " "
                enddo
                write(12,*)
             enddo
                
             close(12)
             
       !/////////////////ILOCZYN/////////////////////////////
             case(2)
             open(12,file="wynik.txt",status="new")

             print*,"Policz iloczyn dla macierzy: "
             read(*,*) m1, m2

             do i = 1, wymiar(m1,1)                 
                do j = 1, wymiar(m1,2)              
                  write(12,'(A)',ADVANCE="NO")macierz(m1,i,j), " "       
                enddo
                write(12,*)
             enddo

             do i = 1, wymiar(m2,1)                 
                do j = 1, wymiar(m2,2)              
                  write(12,'(A)',ADVANCE="NO")macierz(m2,i,j), " "       
                enddo
                write(12,*)
             enddo

             wynik_wymiar(1)=wymiar(m1,1)
             wynik_wymiar(2)=wymiar(m2,2)
             
             if (wymiar(m2,1).EQ.wymiar(m1,2)) then
             do i=1,wynik_wymiar(1)
                do j=1,wynik_wymiar(2)
                   do k=1,wymiar(m2,1)
                   wynik(i,j)=macierz(m2,k,j)*macierz(m1,i,k)+wynik(i,j)  
                   enddo
                enddo
             enddo
             
             else
                 print*," Niezgodnosc wymiarow macierzy "
             end if 
             
             do i = 1, wynik_wymiar(1)
                do j = 1,wynik_wymiar(2)
                  write(12,'(A)',ADVANCE="NO")wynik(i,j), " "
                enddo
                write(12,*)
             enddo 
             
             close(12)

       !///////////////////SUMA//////////////////////////////
             case(3)
             open(12,file="wynik",status="new")

             print*,"Policz sume dla macierzy nr:  "
             read(*,*), m1, m2
             
             do i = 1, wymiar(m1,1)                 
                do j = 1, wymiar(m1,2)              
                  write(12,'(A)',ADVANCE="NO")macierz(m1,i,j), " "       
                enddo
                write(12,*)
             enddo
             
             do i = 1, wymiar(m2,1)                 
                do j = 1, wymiar(m2,2)              
                  write(12,'(A)',ADVANCE="NO")macierz(m2,i,j), " "       
                enddo
                write(12,*)
             enddo
             
             wynik_wymiar(1)=wymiar(m1,1)
             wynik_wymiar(2)=wymiar(m1,2)
                    
             if ((wymiar(m1,1).EQ.wymiar(m2,1)).AND.
     &        (wymiar(m1,2).EQ.wymiar(m2,2))) then
             do i=1,wynik_wymiar(1)
                do j=1,wynik_wymiar(2)
                   wynik(i,j)=macierz(m1,i,j)+macierz(m2,i,j)  
                enddo
             enddo
             
             else
                 print*," Niezgodnosc wymiarow macierzy "
             end if 

             do i = 1, wynik_wymiar(1)
                do j = 1,wynik_wymiar(2)
                  write(12,'(A)',ADVANCE="NO")wynik(i,j), " "
                enddo
                write(12,*)
             enddo 

             close(12)
             
       !////////////////////WYZNACZNIK/////////////////////
             case(4)
             open(12,file="wynik.txt",status="new")

             print*,"Policz wyznacznik dla macierzy nr: "
             read(*,*)m1
             
             if ((wymiar(m1,1).EQ.wymiar(m2,1)).AND.
     &       (wymiar(m1,2).EQ.wymiar(m2,2))) then
             
             
             
             
             else
                 print*," Niezgodnosc wymiarow macierzy "
             end if 


                 close(12)
             
       !/////////////////////DIAGONALIZACJA///////////////////
             case(5)
                    open(12,file="wynik.txt",status="new")


                    close(12)
             
       !/////////////////KOMUTACJA//////////////////////////////
             case(6)
                    open(12,file="wynik.txt",status="new")

                    print*,"Sprawdz komutcje dla macierzy nr:  "
                    read(*,*), m1, m2

                     do i = 1, wymiar(m1,1)                 
                        do j = 1, wymiar(m1,2)              
                           write(12,"(A)",ADVANCE="NO")macierz(m1,i,j)
     &                     , " "       
                        enddo
                     write(12,*)
                     enddo
             
                     do i = 1, wymiar(m2,1)                 
                        do j = 1, wymiar(m2,2)              
                           write(12,"(A)",ADVANCE="NO")macierz(m2,i,j)
     &                     , " "       
                        enddo
                     write(12,*)
                     enddo

                     wynik_wymiar(1)=wymiar(m1,1)
                     wynik_wymiar(2)=wymiar(m2,2)

                     if ((wymiar(m1,1).EQ.wymiar(m1,2)).AND.
     &                (wymiar(m1,1).EQ.wymiar(m2,1)).AND.
     &                (wymiar(m1,2).EQ.wymiar(m2,2))) then
                     do i=1,wynik_wymiar(1)
                        do j=1,wynik_wymiar(2)
                           do k=1,wymiar(m2,1)
                              wynik(i,j)=macierz(m2,k,j)*
     &                        macierz(m1,i,k)+wynik(i,j)  
                           enddo
                        enddo
                     enddo
              
                     do i=1,wynik_wymiar(1)
                        do j=1,wynik_wymiar(2)
                           do k=1,wymiar(m2,1)
                              pomoc(i,j)=macierz(m1,k,j)*
     &                        macierz(m2,i,k)+pomoc(i,j)  
                           enddo
                        enddo
                     enddo
                     else
                         print*," Niezgodnosc wymiarow macierzy "
                     end if 
             
                     komutuja = .TRUE.
                     do i=1, wynik_wymiar(1)
                        do j = 1,wynik_wymiar(2)
                           if (wynik(i,j).NE.pomoc(i,j)) then
                           komutuja = .FALSE.
                           end if     
                        enddo
                     enddo
                     
             
                     do i = 1, wynik_wymiar(1)
                        do j = 1,wynik_wymiar(2)
                           write(12,"(A20F10,2)",ADVANCE="NO")wynik(i,j)
     &                     , " "
                        enddo
                     write(12,*)
                     enddo
             
                     do i = 1, wynik_wymiar(1)
                        do j = 1,wynik_wymiar(2)
                           write(12,'(A)',ADVANCE="NO")pomoc(i,j), " "
                        enddo
                     write(12,*)
                     enddo

                     close(12)
             
       !//////////////ODWROTNA///////////////////////
             case(7)
                    open(12,file="wynik.txt",status="new")


                    close(12)
       !///////////////TRANSPOZYCJA////////////////////////
             case(8)
                    open(12,file="wynik.txt",status="new")
                    print*,"Sprawdz komutcje dla macierzy nr:  "
                    read(*,*) m1
             
                    do i=1,wymiar(m1,1),1
                       do j=1,wymiar(m1,2),1
                          wynik(j,i)=macierz(m1,i,j)
                       enddo      
                    enddo
                    
                    do i=1,wymiar(m1,1),1
                       do j=1,wymiar(m1,2),1
                          write(12,'(A)',ADVANCE="NO")wynik(j,i), " "
                       enddo      
                    enddo
                    close(12)
       !/////////////////KONIEC//////////////////////////
             case(9)
                    stop
             
       !//////////////////INNE////////////////////////////////       
             case default
                  
                    print*," Wybrano niezdefiniowana opcje programu "
       !////////////////END SELECT//////////////////////////
       end select
      
       !///////////////KONIEC CASE//////////////////////
       close(11)


       end
To jest kod bez diagonalizacji, odwracania i wyznacznika , czy jest jakiś gruby błąd bądź jakieś składniowa w pozostałym kodzie?

-- 28 wrz 2010, o 20:52 --

Już skończyłem , post nieaktualny dzięki za pomoc !!!
Ostatnio zmieniony 25 wrz 2010, o 17:18 przez Crizz, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości. Kod programu warto umiesczać wewnątrz [code][/code].
ODPOWIEDZ