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.
[FORTRAN] Macierze
-
- Użytkownik
- Posty: 429
- Rejestracja: 13 gru 2009, o 11:45
- Płeć: Mężczyzna
- Lokalizacja: Takla Makan
- Pomógł: 92 razy
[FORTRAN] Macierze
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]
[url]http://rsc.anu.edu.au/~harry/COURSES/MATHMETH/node70.html[/url]
[FORTRAN] Macierze
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
wcięcia tylko tu znikły w kodzie są
-- 25 wrz 2010, o 19:28 --
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 !!!
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
-- 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].
Powód: Poprawa wiadomości. Kod programu warto umiesczać wewnątrz [code][/code].