Bonjour,

Je suis sur un projet assez conséquent pour réaliser un programme qui fait diverses actions et calculs, dont des manipulations de matrices.

J'utilise donc dans mon programme des matrices, avec des calculs de base (transposée, produit) et des inversions. J'avais choisis BOOST pour faire tout ce dont j'ai besoin à ce niveau, mais je suis maintenant bloqué sur un problème d'inversion. Toute la documentation que j'ai pu trouver aussi bien sur les forums et sur BOOST concernant les inversions de matrices m'a envoyé ici, j'utilise donc InvertMatrix pour mes inversions.

je ne comprends pas la ligne:
// REMEMBER to update "lu.hpp" header includes from boost-CVS
Pour utiliser cette fonction InvertMatrix, il faudrait que je bidouille le lu de BOOST?

Cette fonction me renvoie de bonnes choses à certains endroits, et fait complètement planter l'application à d'autres... Mais je ne comprends pas pourquoi.

Par exemple, pour la matrice:
0.127213 -0.00600185 -0.000149287 0.587534
-0.00600185 0.00553831 -0.00593579 -0.0335789
-0.000149287 -0.00593579 0.0298501 0
0.587534 -0.0335789 0 3
La fonction me renvoie:
82.8377 -11.3315 -1.83901 -16.3502
-11.3315 252.673 50.1882 5.04737
-1.83901 50.1882 43.4716 0.921916
-16.3502 5.04737 0.921916 3.59192
Par contre, Excel me donne:
82.8339694 -11.33084355 -1.83890416 -16.34941688
-11.33084355 252.6730142 50.18818708 5.047245904
-1.83890416 50.18818708 43.47161365 0.921894277
-16.34941688 5.047245904 0.921894277 3.591773088
Ce qui fait une différence de:
0.003730597 -0.000656448 -0.00010584 -0.000783119
-0.000656448 -1.41645E-05 1.29217E-05 0.000124096
-0.00010584 1.29217E-05 -1.36459E-05 2.17228E-05
-0.000783119 0.000124096 2.17228E-05 0.000146912
Bon, au moins l'inversion fonctionne.
mais d'où peut venir la différence? Mes matrices sont en double, ce qui devrait être suffisant pour conserver la précision... non? Faudrait-il que je passe en long double? Y a-t-il plus grand encore? ^^

Cependant, pour la matrice:
29.1694 145.914 2.9161 0.0291432
145.914 729.909 14.5872 0.145783
2.9161 14.5872 0.291527 0.00291348
0.0291432 0.145783 0.00291348 2.91E-05
Le programme bug et renvoie:
Check failed in file c:\qtsdk\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../include/boost/numeric/ublas/lu.hpp at line 299:
detail::expression_type_check (prod (triangular_adaptor<const_matrix_type, upper> (m), e), cm2)
terminate called after throwing an instance of 'boost::numeric::ublas::internal_logic'
what(): internal logic

...c'est-à-dire au niveau du lu_substitute de InvertMatrix...

Une idée sur le problème?

Excel me renvoie:
29583.05966 -1036.301438 -110716.8234 -13342628.25
-1036.301438 263.7012475 -687.1073365 -214312.0502
-110716.8234 -687.1073363 1034457.92 10747589.39
-13342628.25 -214312.0502 10747589.4 13352224310
La matrice est donc bien inversible, par contre, on voit que l'étendue est très importante, +/- 10^10... Mais ce qui devrait largement tenir dans du double...

Encore une idée?


Merci!