Bonjour,
Mon binome et moi sommes sur un projet (écrit en fortran 90). Le but est de résoudre Ax=b, tout en fesant varier b afin de trouver le minimum et le maximum d'un vecteur égal aux 15 premières valeurs du vecteur x.
Le programme compile mais à l'execution le résultat est incohérent (Tmin > Tmax) en particulier lors que j varie de -50 à 50...
De plus, une erreur de segmentation ne cesse de s'afficher à la fin de l'execution (alors que l'allocation et la désallocation ont réussi).
Pouvez vous nous aidez? C'est assez urgent, voici le programme et le module:
Merci d'avance en tout cas!
Bonne journée


Programme:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
Program etude_libre
use grue_mod
	Implicit none
 
	integer:: n=18,h=15, m=7
	real::c,N1,N2,N3,N4,N5,N6,N7,N8,N9, Fx,Fy,Ry,Sx,Sy, omega, eps=1.E-4, Nmax, Nmin
	integer:: i,j,k,kmax=10, p
	real, dimension(:,:), allocatable ::A,L,U
	real, dimension(:), allocatable::b,x,y,r,e,tension, Tmax, Tmin
 
 
	allocate (A(n,n), L(n,n),U(n,n),b(n),y(n),x(n),tension(n),Tmax(n),Tmin(n), r(n), e(n))
	b=(/Fx,Fy,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0./)
	c=sqrt(2.)/2.	
	!Fy
	b(2)=-1000	
 
!Affichage de A
	!print*
	!print*,'Matrice A'
	A=0
	A(1,1)=1; A(3,3)=1; A(4,4)=1; A(5,3)=1; A(6,6)=1; A(9,9)=1; A(11,11)=1; A(13,11)=1; 
	A(12,12)=1; A(16,12)=1; A(14,14)=1; A(18,14)=1; A(15,15)=1
	A(17,15)=1; A(16,16)=1; A(17,17)=1; A(18,18)=1;
 
	A(12,9)=-1; A(6,1)=-1; A(7,4)=-1; A(10,6)=-1;
 
	A(1,2)=c; A(2,2)=c; A(3,2)=c; A(5,5)=c; A(6,5)=c; A(7,7)=c; A(9,7)=c; A(7,8)=c; 
	A(8,8)=c; A(9,10)=c; A(10,10)=c; A(13,13)=c; A(14,13)=c;
	A(15,13)=c; A(16,13)=c; A(13,10)=c
 
	A(4,2)=-c; A(7,5)=-c; A(8,5)=-c; A(8,7)=-c; A(10,7)=-c; A(11,8)=-c; A(12,8)=-c; A(14,10)=-c
 
	!do i=1,n
		!write(*,fmt='(20f8.2)') (A(i,j),j=1,n)
		!print*
	!end do
 
 
 
	do j=-50,50
 
		b(1)=j
 
!Décomposition
		!print*, "----------Décomposition LU----------"
 
		CALL DECOMPOSITION(n,A,L,U)
		!print*, 'Matrice L'
		!do i=1,n 
			!write(*,fmt='(20f8.2)')(L(i,p),p=1,n)
			!print*
		!end do
 
 
		!print*	
		!print*, 'Matrice U'
		!do i=1,n
			!write(*,fmt='(20f8.2)')(U(i,j),j=1,n)
			!print*
		!end do
 
!Descente
		!print*, "----------Descente pour obtenir le vecteur de passage----------"		
		CALL DESCENTE(n,L,b,y)
		!print*, 'vecteur y=(', y, ')' 
		!print*
		!print*
 
 
!Remontée
 
		!print*,"----------Remontée pour obtenir le vecteur cherché----------"
		CALL REMONTEE(n,U,Y,x)
		!print*, 'On obtient le vecteur x:'
		!print*
 
 
 
		do i=1,n
			print*, x(i)
		end do
 
		print*
		print*, 'VECTEUR TENSION'
 
		do i=1,15
			tension(i)=x(i)
			print*, tension(i)
		end do
 
		Tmax(j)= maxval(x)
		Tmin(j)= minval(x)
		print*
		print*, "valeurs tmax(" ,j,")", Tmax(j)
		print*, "valeurs tmin(" ,j,")",Tmin(j)
 
	end do
 
 
	print*, "Tmax"
	do i=1,n
		write(*,fmt='(20f8.2)')(Tmax(i))
	end do
 
	print*
	print*, "Tmin"
	do i=1,n
		write(*,fmt='(20f8.2)')(Tmin(i))
	end do
 
	print*
	Nmax=maxval(Tmax)
	Nmin=minval(Tmin)
 
	print*, 'Nmax=', Nmax
	print*, 'Nmin=', Nmin
 
 
	deallocate(A,L,U)
	deallocate(b, y, x, r, tension, Tmax, Tmin, r, e)	
 
end program etude_libre

MODULE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
MODULE grue_mod
 
	IMPLICIT NONE
	CONTAINS
 
	SUBROUTINE DECOMPOSITION(n,A,L,U)
		INTEGER, INTENT(IN)::n
		REAL, DIMENSION(n,n),INTENT(IN)::A
		REAL, DIMENSION(n,n),INTENT(OUT)::L
		REAL, DIMENSION(n,n),INTENT(OUT)::U
		REAL::s
		INTEGER::i,j,k
 
			DO j=1,n
			L(j,j)=1.
				DO i=1,j
					s=0.
					DO k=1,i-1
						s=s+L(i,k)*U(k,j)
					END DO
					U(i,j)=A(i,j)-s
				END DO
 
				DO i=j+1,n
					s=0.
					DO k=1,j-1
						s=s+L(i,k)*U(k,j)
					END DO
					L(i,j)=(A(i,j)-s)/U(j,j)
				END DO
			END DO
	END SUBROUTINE DECOMPOSITION
 
 
	SUBROUTINE DESCENTE(n,L,b,y)
		INTEGER, INTENT(IN)::n
		REAL, DIMENSION(n,n),INTENT(IN)::L
		REAL, DIMENSION(n), INTENT(IN)::b
		REAL, DIMENSION(n), INTENT(OUT)::y
		REAL::s
		INTEGER::i,j
 
			DO i=1,n
				s=0.
				DO j=1,i-1
					s=s+L(i,j)*y(j)
				END DO
				y(i)=(b(i)-s)/L(i,i)
			END DO
	END SUBROUTINE DESCENTE
 
 
	SUBROUTINE REMONTEE(n,U,y,x)
		INTEGER, INTENT(IN)::n
		REAL, DIMENSION(n,n),INTENT(IN)::U
		REAL, DIMENSION(n), INTENT(IN)::y
		REAL, DIMENSION(n), INTENT(OUT)::x
		REAL::s
		INTEGER::i,j
 
			DO i=n,1,-1
				s=0.
				DO j=i+1,n
					s=s+U(i,j)*x(j)
				END DO
				x(i)=(y(i)-s)/U(i,i)
			END DO
	END SUBROUTINE REMONTEE
 
 
 
 
	real function norme1(r)
		real,dimension(:),intent(in)::r
 
		norme1=sum(abs(r))
 
	end function norme1
 
 
 
	SUBROUTINE SOR(omega,A,r,e)
		REAL,INTENT(IN) ::omega
		REAL,DIMENSION(:,:), INTENT(IN) ::A
		REAL,DIMENSION(:), INTENT(IN) :: r
		REAL,DIMENSION(:), INTENT(OUT) :: e
 
		REAL:: s
		INTEGER:: i,j,n
 
		n=SIZE(A,1)
		DO I=1,N
			s=0.
			DO j=1,i-1
				s=s+A(i,j)*e(j)
			END DO
		e(i)=omega*(r(i)-s)/A(i,i)
		END DO
	END SUBROUTINE SOR
 
 
 
 
 
 
END MODULE grue_mod

EXECUTION:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
valeurs tmax( 50 ) 2600.
 valeurs tmin( 50 ) -2550.
 Tmax
 2502.00
 2504.00
 2506.00
 2508.00
 2510.00
 2512.00
 2514.00
 2516.00
 2518.00
 2520.00
 2522.00
 2524.00
 2526.00
 2528.00
 2530.00
 2532.00
 2534.00
 2536.00
 
 Tmin
 2550.00
 2552.00
 2554.00
 2556.00
 2558.00
 2560.00
 2562.00
 2564.00
 2566.00
 2568.00
 2570.00
 2572.00
 2574.00
 2576.00
 2578.00
 2580.00
 2582.00
 2584.00
 
 Nmax= 2536.
 Nmin= 2550.
Erreur de segmentation