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 :

Problème pour résoudre un système des moindres carrés avec la méthode dgels de LAPACK


Sujet :

Fortran

  1. #1
    cedrix57
    Invité(e)
    Par défaut Problème pour résoudre un système des moindres carrés avec la méthode dgels de LAPACK
    Bonjour,

    J'ai un problème pour utiliser la fonction dgels, qui est censé résoudre un système des moindres carrées. Voici mon code source :
    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
     
          program main
          REAL*8 A(4,3), b(4), res(4)
          integer n_max, n_end, m
     
          integer info, lda, ldb 
    c     LWORK >= 3*min(M,N)*min(M,N) + max(max(M,N),4*min(M,N)*min(M,N)+4*min(M,N)).
          real*8 work(1000)
          lwork=1000
          m = 3 
          lda=m+1
          ldb=m+1
          m = 2 
          A(1,:)=(/ 1, 2, 3 /)
          A(2,:)=(/ 4, 5, 6 /)
          A(3,:)=(/ 7, 8, 9 /)
          A(4,:)=(/ 9, 9, 9 /)
          b = (/ 1, 4, 3, 2 /)
          write(*,*) "A :"
          call printMatrix(A(:m+1,:m), m+1, m)
          write(*,*) "b vaut :"
          write(*,*) (b(i), i=1,m+1)
          call dgels('No transpose',m+1,m,1,A,lda,b,ldb,
         s              work, lwork,info)
          write(*,*) "INFO : dgels end"
          write(*,*) "res vaut :"
          write(*,*) (b(i), i=1,m)
     
          write(*,*) "INFO : end program"
          stop
          end 
     
          subroutine printMatrix(mat, m, n)
          integer i, j, m, n
          real*8 mat(m,n)
          do i =1,m
          >-WRITE(*,*) (mat(i,j), j=1,n)
          end do
          return
          end
    J'essai de trouver un ymin tel que ||A*ymin - b|| soit minimiser. Si je prend A en entier, en mettant m = 3, au lieu de m = 2, ça marche, j'obtiens ce résultat qui semble être cohérent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ~/projet/fortran/test$ gfortran -o miny miny.f -llapack;./miny
     A :
      1.00000000000000000        2.0000000000000000        3.0000000000000000     
       4.0000000000000000        5.0000000000000000        6.0000000000000000     
       7.0000000000000000        8.0000000000000000        9.0000000000000000     
       9.0000000000000000        9.0000000000000000        9.0000000000000000     
     b vaut :
      1.00000000000000000        4.0000000000000000        3.0000000000000000        2.0000000000000000     
     INFO : dgels end
     res vaut :
       306553334728091.56       -613106669456184.75        306553334728093.44     
     INFO : end program
    Par contre, quand je met m = 2, le résultat n'est plus cohérent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ~/projet/fortran/test$ gfortran -o miny miny.f -llapack;./miny
     A :
      1.00000000000000000        2.0000000000000000     
       4.0000000000000000        5.0000000000000000     
       7.0000000000000000        8.0000000000000000     
     b vaut :
      1.00000000000000000        4.0000000000000000        3.0000000000000000     
     INFO : dgels end
     res vaut :
     -0.99999999999999567        1.3333333333333295     
     INFO : end program
    La solution est loin d'être optimale, par exemple le vecteur (0, 0.5) est une bien meilleur solution.

    J'ai trouvé un exemple d'utilisation de cette fonction ici :
    http://www.nag.co.uk/lapack-ex/examples/source/dgels-ex.f
    Il y a aussi quelque infos ici:
    http://www.netlib.org/lapack/lug/node27.html
    http://download.oracle.com/docs/cd/B...a.htm#CIADBIAE


    Auriez vous une idée de ce qui ne va pas ?

    Merci d'avance,

    Cédric

  2. #2
    cedrix57
    Invité(e)
    Par défaut
    Désolé c'est moi que m'étais trompé lors de la vérification des calculs.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/03/2015, 22h40
  2. Réponses: 0
    Dernier message: 20/08/2013, 14h29
  3. [8.5]Problème pour calculer le nombre des personnes d'une liste
    Par Gotch59 dans le forum SAP Crystal Reports
    Réponses: 9
    Dernier message: 21/06/2007, 09h47
  4. problème pour fixer la taille des div dans template
    Par damien40 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 24/05/2007, 11h05
  5. Détermination d'un plan des moindres carrés
    Par bernard6 dans le forum MATLAB
    Réponses: 8
    Dernier message: 05/04/2007, 16h23

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