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 :
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
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
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
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
La solution est loin d'être optimale, par exemple le vecteur (0, 0.5) est une bien meilleur solution.
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
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
Partager