AccueilPortailFAQRechercherS'enregistrerConnexion


Partagez | 
 

 Etudiant demande aide en fortran

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
justtrue
Ultra Utilisateurs
Ultra Utilisateurs
avatar

Masculin
Nombre de messages : 505
Age : 30
Localisation : La Rochelle (17) ou Marne la Vallée (77)

Date d'inscription : 13/01/2008

MessageSujet: Etudiant demande aide en fortran Jeu 21 Fév 2008, 18:14

Bonjour à tous,

Je dois réaliser deux programmes utilisant le language FORTRAN.

Le but du programme1 est de résoudre un système AX=B par la méthode de Gauss-Seidel et le but du programme2 est de résoudre un système AX=B par la méthode de la relaxation (qui n'est pas d'ailleurs absolument pas relaxante...).

Voici l'énoncé du programme1:
Construire un programme composé de sous-programmes qui :
- lit une matrice A et un vecteur B sur un fichier de données
- vérifie si le système à résoudre est à diagonale dominante
- écrit le vecteur X, solution du système ainsi que le nombre d'itérations nécessaires pour atteindre la convergence sur un fichier de résultats différents du fichier de données.

J'ai réussi à réaliser ce programme, le voici et il fonctionne :

Programme1 a écrit:
real*8 A(10,10), B(10), X(10), D(10,10), R(10,10), L(10,10), D1(10,10), prec
real*8 X_init(10), X_fin(10), somme1, somme2, dif, iter, kmax
integer n
print*, 'donner la valeur de n'
read*, n
write (*,*) 'la valeur de n est', n

do 1 i=1,n
do 2 j=1,n
print*, 'Donner la valeur de la matrice A.', i,j
read*,A(i,j)
2 continue
1 continue
call affiche_mat(n,A)

do 3 k=1,n
print*, 'Donner la valeur du vecteur B.', k
read*, B(k)
3 continue
call affiche_vect(n,B)

call diag(n,A)

call resol(A,D,R,L,n)

call matinv(D,D1,n)

call gauss(X_init, X_fin, n, prec, somme1, somme2, dif, iter, kmax, A, B)

end

!sous programme qui affiche la matrice
subroutine affiche_mat(n,A)
integer n
real*8 A(10,10)

do 4 i=1,n
do 5 j=1,n
write(*,*) i,j,A(i,j)
5 continue
4 continue
end

!sous programme qui affiche le vecteur
subroutine affiche_vect(n,B)
integer n
real*8 B(10)

do 6 k=1,n
write(*,*) k,B(k)
6 continue
end

!sous programme qui verifie si la diagonale est dominante
subroutine diag(n,A)
integer n
real*8 A(10,10), somme

do 7 i=1,n
somme=0.D0
do 8 j=1,n
if (j.ne.i) then
somme = somme + abs(A(i,j))
end if
8 continue
if (somme.ge.abs(A(i,i))) then
write(*,*) 'Le systeme n est pas a diagonale dominante;'
else
write(*,*) 'Le systeme est a diagonale dominante.'
end if
7 continue
end


!sous programme pour A, D, R, L
subroutine resol(A,D,R,L,n)
integer n
real*8 A(10,10), D(10,10), R(10,10), L(10,10)

do 10 i=1,n
do 11 j=1,n
if (i.eq.j) then
D(i,j)=A(i,i)
else
D(i,j)=0
end if
if (i.gt.j) then
L(i,j)=-A(i,j)
else
L(i,j)=0
end if
if (i.lt.j) then
R(i,j)=-A(i,j)
else
R(i,j)=0
end if
11 continue
10 continue
write(*,*) 'la matrice D est :'
call affiche_mat(n,D)
write(*,*) 'la matrice R est :'
call affiche_mat(n,R)
write(*,*) 'la matrice L est :'
call affiche_mat(n,L)
end

!sous programme pour D-1
subroutine matinv(D,D1,n)
integer n
real*8 D(10,10), D1(10,10)

do 13 i=1,n
do 14 j=1,n
if (i.eq.j) then
D1(i,j)=1.D0/(D(i,j))
else
D1(i,j)=0
end if
14 continue
13 continue
write(*,*) 'la matrice D-1 est:'
call affiche_mat(n,D1)
end

!sous programme qui resoud le systeme par la methode de Gauss-Seidel
subroutine gauss(X_init, X_fin, n, prec, somme1, somme2, dif, iter, kmax, A, B)
integer n
real*8 X_init(10), X_fin(10), prec, somme1, somme2, dif, kmax, A(10,10), B(10)

do 10 i=1,n
X_init=0
10 continue

print*, 'Donner la valeur de la precision.'
read*, prec
write(*,*) 'La precision est :', prec

print*, 'Donner la valeur du nombre d iterations maximum.'
read*, kmax
write(*,*) 'Le nombre d iterations maximum est :', kmax

iter = 1
20 do 15 i=1,n
X_init(i)=X_fin(i)
15 continue

do 11 i=1,n
somme1=0.D0
somme2=0.D0
do 12 j=1,i-1
somme1 = somme1 + A(i,j)*X_fin(j)
12 continue
do 13 j=i+1,n
somme2 = somme2 + A(i,j)*X_init(j)
13 continue
X_fin(i)=(B(i)-somme1-somme2)/A(i,i)
11 continue
iter = iter + 1


do 14 i=1,n
dif = abs(X_fin(i) - X_init(i))
if (dif.gt.prec) then
if (iter.lt.kmax) then
goto 20
end if
end if
if (dif.lt.prec) then
goto 21
end if
14 continue

21 write(*,*) 'Le nombre d iterations est :', iter
call affiche_vect(n,X_fin)
end

Le programme2 est quasiment identique au programme1, seul le sous-programme permettant de résoudre le système est différent puisqu'on utilise la méthode de la relaxation. Ce que j'ai écrit en gras sur le programme1 est, d'après moi, la seule partie du programme1 a modifié pour résoudre le système en utilisant la méthode de la relaxation. Voici donc ce par quoi a été remplacé la partie du programme1 qui était en gras :

Programme2 a écrit:
do 11 i=1,n
somme1=0.D0
somme2=0.D0
if (i.eq.1) then
do 12 j=i,n
somme1 = somme1 + A(i,j)*X_fin(j)
12 continue
x_init(i)=X_fin(i)
X_fin(i)=X_init(i) + w*(B(i) - somme1)/A(i,i)
else
do 13 j=i,n
somme1 = somme1 + A(i,j)*X_fin(j)
13 continue
do 14 j=1,i-1
somme2 = somme2 + A(i,j)*X_fin(j)
14 continue
X_init(i)=X_fin(i)

X_fin(i)=X_init(i) + w*(B(i) - somme1 - somme)/A(i,i)
end if
11 continue
iter = iter + 1

Pourtant, mon programme ne fonctionne toujours pas car si je souhaite résoudre le système suivant:

X1 - 0,25X3 - 0,25X4 = 0,5
X2 - 0,25X3 - 0,25X4 = 0,5
- 0,25X1 - 0,25X2+ X3 = 0,5
- 0,25X1 - 0,25X2 + X4 = 0,5

J'obtiens en résultat:

X1 = 0,00
X2 = 0,00
X3 = 0,00
X4 = 0,00

Or, la solution réelle est:

X1 = 1,00
X2 = 1,00
X3 = 1,00
X4 = 1,00


Bref, j'aimerais savoir si certains d'entres vous connaissent ce language et s'il leur est possible de m'aider.

Merci d'avance!

PS : J'espère avoir posté au bon endroit, je ne savais pas vraiment dans quelle rubrique écrire.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
 

Etudiant demande aide en fortran

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
PC Land :: Le coin dépannage :: Dépannage Logiciels :: Archives :: Archives 2008-