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
|
c **********************************************************
c Résolution d'un système matriciel par la méthode de Gauss-Seidel
c **********************************************************
PROGRAM Gauss seidel
c en F77 pas de :: pour les déclarations, et tableaux déclarés par
cA(n,m)
c IMPLICIT NONE
parameter(n=50)
parameter(m=20)
integer i, j, k
real A(n,m), b(n), T(m), TE(m), Somav, Somap, eps
c ca je connais pas... peut-être des virgules plutot que des '/' ?
common i,j,k,A,T,TE,bSomav,Somap,eps
c idem
c DATA k/0/n/9/m/9/
c plutôt que des do 100... utilises do ... enddo
Subroutine EntrerA
do i=1,n
Write(*,*)"Faites entrer",i,"ligne"
do j=1,m
c ton '5' n'est pas défini, si tu veux lire ce qu'écrit un utilisateur
c dans le terminal c'est read(*,*), ou read(*,"format")
Read(*,*) a(i,j)
enddo
enddo
Return
End
Subroutine EntrerB
Write(*,*)"Faites entrer les valeur de b"
do i=1,n
Read(*,*) b(i)
enddo
Return
End
Subroutine EntrerTemp
Write(*,*)"Entrer les valeur initiales de T°"
do j=1,m
read(*,*) T(j)
TE(j)=0.00
enddo
write(*,*)"entrer la valeur de epsilon"
read(*,*) eps
return
End
c Type function test-arrêt:logical
c déclarer préférentiellement au début.
Real Somme
Test_arret=false
Somme=0.0
c de plus si tu mets plusieurs points '100', ca va planter
c raison de plus pour utiliser do ... enddo
do i=1,n
Somme=Somme+abs(TE(i)-T(i))
enddo
if(Somme<eps)then
Test_arret=True
Endif
Return
End
C Debut Programme Principal
C ************************
Call EntrerA
Call EntrerB
Call EntrerTemp
if (Test_arret) then
k=k+1
Do i=1,n
Do j=1,m
Somav=Somav+a(i,j)*TE(j)
enddo
Do j=i+1,n
Somap=Somap+a(i,j)*T(j)
enddo
Te(i)=(b(i)-Somav-Somap)/a(i,i)
enddo
else
Write(*,*)"Aprés la",k,"ième itération, voici les résultats"
Do i=1,n
Write(*,50) TE(i)
50 Format (F9,2)
enddo
endif
End |