IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

matrice symétrique et conditions aux bords périodiques


Sujet :

Fortran

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 26
    Points
    26
    Par défaut matrice symétrique et conditions aux bords périodiques
    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

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut the_reward.

    Sans parler de la mise en œuvre de la méthode de résolution, j'observe des erreurs dans ton code.

    Le produit matriciel mat1 [7x2n] par u [2n] doit retourner un tableau de taille 7. Or tu as déclaré pmv de taille 2n. J'ai fait le calcul à la main pour n=1, la valeur de pmv retournée est n'importe quoi.

    Même remarque pour le calcul de la transposée : tmat est déclarée comme [7x2n] et pas [2nx7]. Les résultats sont faux.

    Tu devrais utiliser - pendant la période de développement au moins - les fonctions intrinsèques matmul et transpose.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 37
    Points : 26
    Points
    26
    Par défaut matrice symétrique et conditions aux bords périodiques
    merci __dardanos__ j'ai suivi tes conseils et ça marche mnt pour n'importe quel n.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/07/2015, 12h51
  2. Boucle for, problème aux bords
    Par dword2add dans le forum C
    Réponses: 16
    Dernier message: 21/10/2006, 18h18
  3. rebond d'une balle aux bords de l'écran
    Par The_Duck dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 11/05/2006, 23h47
  4. [CSS] - une div aux bords arrondis ?
    Par 10-nice dans le forum Mise en page CSS
    Réponses: 12
    Dernier message: 23/09/2005, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo