Bonjour,
Suite à la lecture de ce sujet de la FAQ, je voudrais savoir s'il est possible de spécifier à matlab - une bonne fois pour toute - d'arrondir tous les résultats de ses calculs à 10^-10 par exemple ? Et est-ce judicieux d'imposer cet arrondi ou vaut-il mieux traiter nos tests au cas par cas ?
Par exemple, dans le programme suivant (qui définit une représentation d'état quelconque et teste la commandabilité et l'observabilité du système), je m'attends à ce que les produits de ma matrice A par chacun de mes vecteurs propres soient égaux aux produits des valeurs propres associées à chaque vecteur propre par chacun de ces vecteurs propres :
Or, bien évidemment, j'obtiens :
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 function commandabilite_et_observabilite A = blkdiag(0, -2, [-1 1 ; 0 -1], [-4 1 0; 0 -4 1; 0 0 -4], [-4 1; 0 -4], -4 ) B = [ -1 2 1; ... 0 0 0; ... 0 1 0; ... 0 0 0; ... 0 0 0; ... 0 1 0; ... 1 0 -1; ... 1 -2 0; ... 0 1 0; ... 0 0 1] C = [0 1 0 -1 1 0 0 0 1 1; 0 0 0 2 2 1 0 1 -1 -1] dimension = size(A,2) rang_matrice_commandabilite = rank([B A*B A^2*B A^3*B A^4*B A^5*B A^6*B A^7*B A^8*B A^9*B A^10]) rang_matrice_observabilite = rank([C' [C*A]' [C*A^2]' [C*A^3]' [C*A^4]' [C*A^5]' [C*A^6]' [C*A^7]' [C*A^8]' [C*A^9]' [C*A^10]']') [vect, val] = eig(A); A*vect==val*vect end
Je ne détaille pas, mais je m'attendais bien sûr à obtenir des "1" partout. J'ai vérifié les calculs, et effectivement le problème vient de cette précision matlab qui est mal gérée.1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Quelqu'un aurait une solution simple ? Je sais qu'une solution possible est de vérifier que la différence de résultat cellule par cellule soit inférieure à epsilon (qu'on impose)... mais c'est lourd ! Il n'y aurait pas plus simple ?
Cordialement,
[EDIT] : j'ai trouvé une solution provisoire...
... qui me sort mes jolis 1...
Code : Sélectionner tout - Visualiser dans une fenêtre à part abs(A*vect-val*vect)<10^(-10)
Partager