Bonjour tout le monde

j'ai un système linéaire AX=b à résoudre et on m'a imposé la méthode du gradient conjugué ma matrice elle n'est pas symétrique et c une matrice par bloc

1 * * * * * ...* * * ... *
* 1 * * * * ...* * * ... *
* * 1 * * * ...* * * ... *
*
.
.
.
* * * * * ... 1 * * * ... *
* 5 -4 * * 4 2 -3 * ... *
-5 * 5 -4 * . ..* -3 2 -3 * * ... *
4 -5 * 5 -4 * * * -3 2 -3 * ... *
*
* -4
* 5 * * -3
-4 * * 4 -5 * * * -3 2


et pour la rendre symétrique je dois multiplier ma matrice par sa transposée et pour être sûr je dois vérifier la relation (tA.A.X,Y) = (AX,AY)
j'ai fait un petit programme mais le problème c que pour n >=10 ça marche pas pour n'importe quel vecteur X,Y sauf s'ils sont = 1.
Encore une autre chose pour les conditions aux bords périodiques comment je fais pour les codé je pensais que c x(0) = x(n+1) mais apparemment j'ai tord!!
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
program test
  implicit none
 
 
  integer, dimension( : , : ), allocatable :: mat1, tmat
  integer, dimension( : ), allocatable :: u,y, pmv,z,w
  integer :: i,n,ps,ps1
 
  print*,'entrer une valeur de n: '
  read*,n
 
  allocate(mat1(1:7,2*n), tmat(1:7, 2*n), u(2*n), y(2*n), pmv(2*n),z(2*n), w(2*n) ) 
  print*,'=================pmv= mat*u====================='
  !affichage de a
  mat1(:,:) = 0
 
  mat1(1,n+3:2*n) = 5
  mat1(2,n+2:2*n) = -4
  mat1(3,n+1:2*n-1) = 4
  mat1(4,n+1:2*n-2) = -5
  mat1(6,1:n)=1
  mat1(6,n+1:2*n)=2
  mat1(5,n+2:2*n)=-3
  mat1(7,n+1:2*n-1)=-3
 
  print*, mat1
 
  print*,'entrer un vacteur u de taille',2*n,': '
  read*,u
 
  do i =1,n
     pmv(i) = mat1(6,i)*u(i)
  end do
  pmv(n+1) = mat1(1,n+3)*u(2) + mat1(2,n+2)*u(3) + 4*u(n) + mat1(6,n+1)*u(n+1) + mat1(7,n+1)*u(n+2)
  pmv(n+2) = mat1(4,n+2)*u(1) + mat1(1,n+3)*u(3) + mat1(2,n+2)*u(4) + mat1(5,n+2)*u(n+1) + mat1(6,n+2)*u(n+2) + mat1(7,n+2)*u(n+3)
  do i = n+3, 2*n-2
     pmv(i) = mat1(3,i)*u(i-n-2) + mat1(4,i)*u(i-n-1) + mat1(1,i)*u(i-n+1) + mat1(2,i)*u(i-n+2) + mat1(5,i)*u(i-1)&
          & + mat1(6,i)*u(i) + mat1(7,i)*u(i+1)
  end do
  pmv(2*n-1) = mat1(3,2*n-1)*u(n-3) + mat1(4,2*n-2)*u(n-2) + mat1(1,2*n-1)*u(n) + mat1(7,2*n-1)*u(2*n-2)&
       & + mat1(6,2*n-1)*u(2*n-1) + mat1(5,2*n-1)*u(2*n)
  pmv(2*n) = (-4)*u(1) + mat1(3,2*n-1)*u(n-2) + mat1(4,2*n-2)*u(n-1) + mat1(5,2*n) * u(2*n-1) + mat1(6,2*n)*u(2*n)
 
  print*,'produit = ', pmv
  print*,'===================matrice transposee======================'
  tmat(:,:) = 0
 
  tmat(1,1:n) = 1
  tmat(1,n+1:2*n) = 2
  tmat(2,2:n) = 4
  tmat(3,3:n) = -5
  tmat(4,1:n-1) = -4
  tmat(5,1:n-2) = 5
  tmat(6,n+1:2*n-1) = -3
  tmat(7,n+2:2*n) = -3
 
  print*,tmat
  print*,'==================y=tmat*pmv============='
 
  y(1) = tmat(1,1)*pmv(1)+ tmat(3,n)*pmv(n+2) + tmat(2,n)*pmv(n+3) + (-4)*pmv(2*n)
 
  y(2) = tmat(1,2)*pmv(2) + tmat(5,n-2)*pmv(n+1) + tmat(3,n)*pmv(n+3) + tmat(2,n)*pmv(n+4)
 
  do i = 3,n-2
     y(i) = tmat(1,i)*pmv(i) + tmat(4,n-1)*pmv(n+i-2) + tmat(5,n-2)*pmv(n+i-1) + tmat(3,n)*pmv(n+i+1)&
          & + tmat(2,n)*pmv(n+i+2)
  end do
 
  y(n-1) = tmat(1,n-1)*pmv(n-1) + tmat(4,n-1)*pmv(n+3) + tmat(5,n-2)*pmv(n+4) + tmat(3,n-1)*pmv(2*n)
 
 
  y(n) = tmat(1,n)*pmv(n) + 4*pmv(n+1) + tmat(4,n-1)*pmv(2*n-2) + tmat(5,n-2)*pmv(2*n-1)
 
  y(n+1) = tmat(1,n+1)*pmv(n+1) + tmat(6,n+2)*pmv(n+2)
 
  do i = n+2, 2*n-1
     y(i) = tmat(6,i-1)*pmv(i-1) + tmat(1,i)*pmv(i) + tmat(7,i+1)*pmv(i+1)
  end do
 
 
  y(2*n) = tmat(6,2*n-1)*pmv(2*n-1) + tmat(1,2*n)*pmv(2*n)
 
  print*,'y =',y
  print*,'==================ps=y*z============='
  print*,'entrer un vecteur z de taille',2*n,': '
  read*,z
  ps = 0
  do i =1,2*n
     ps = ps+y(i)*z(i)
  end do
  print*,'produit scalaire = ', ps
  print*,'==================w= mat*z============='
  do i =1,n
     w(i) = mat1(6,i)*z(i)
  end do
  w(n+1) = mat1(1,n+3)*z(2) + mat1(2,n+2)*z(3) + 4*z(n) + mat1(6,n+1)*z(n+1) + mat1(7,n+1)*z(n+2)
  w(n+2) = mat1(4,n+2)*z(1) + mat1(1,n+3)*z(3) + mat1(2,n+2)*z(4) + mat1(5,n+2)*z(n+1) + mat1(6,n+2)*z(n+2) + mat1(7,n+2)*z(n+3)
  do i = n+3, 2*n-2
     w(i) = mat1(3,i)*z(i-n-2) + mat1(4,i)*z(i-n-1) + mat1(1,i)*z(i-n+1) + mat1(2,i)*z(i-n+2) + mat1(5,i)*z(i-1)&
          & + mat1(6,i)*z(i) + mat1(7,i)*z(i+1)
  end do
  w(2*n-1) = mat1(3,2*n-1)*z(n-3) + mat1(4,2*n-2)*z(n-2) + mat1(1,2*n-1)*z(n) + mat1(7,2*n-1)*z(2*n-2)&
       & + mat1(6,2*n-1)*z(2*n-1) + mat1(5,2*n-1)*z(2*n)
  w(2*n) = (-4)*z(1) + mat1(3,2*n-1)*z(n-2) + mat1(4,2*n-2)*z(n-1) + mat1(5,2*n) * z(2*n-1) + mat1(6,2*n)*z(2*n)
 
  print*,'produit = ', w
  print*,'===========ps1=pmv*w================================'
  ps1 = 0
  do i =1,2*n
     ps1 = ps1+pmv(i)*w(i)
  end do
  print*,'produit scalaire1 = ', ps1
end program test
merci d'avance