begin process at 2008 08 21 21:07:12
1 229 631 membres
443 nouveaux aujourd'hui
14 264 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASSES DE MATRICES (CARRÉES) DYNAMIQUES ET SES UTILISATIONS MATHÉMATIQUES


Information sur la source

Catégorie :Maths & Algorithmes Classé sous : matrice, mathématique, déterminant, héritage Niveau : Débutant Date de création : 20/10/2005 Date de mise à jour : 14/12/2005 10:32:32 Vu / téléchargé: 8 491 / 835

Note :
6,2 / 10 - par 5 personnes
6,20 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Classe complète pour l'utilisation de matrices réelles dynamiques.

Source

  • //voir dans le zip ^_^
//voir dans le zip ^_^

Conclusion

Beaucoup de grammaire.
Il y a quelques algorithmes interessants, qui méritent que je les commente un peu plus à l'occasion...

Je dois encore ajouter la recherche des valeurs propres.
Je pense aussi ajouter une classe héritée "SystemeLineaire".

Je ne pense pas qu'il y ait des bug à proprement parler, mais j'ai remodifier quelques fonctions sans les tester...
Si vous voyez des problèmes, dite-le moi !
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

28 novembre 2005 14:42:26 :
J'ai carrément tout refait, beaucoup plus correctement ! ^^
14 décembre 2005 10:32:33 :
Suivant les conseils de Luthor, j'ai corrigé la petite erreur de la fonction istream& operator >> (istream& entree,Matrice& a); qui était avant istream& operator >> (istream& entree,const Matrice& a); J'ai aussi supprimés les constructeurs de recopies inutiles dans les classes héritées. Et j'ai corrigé une erreur dans mes destructeurs...
  • signaler à un administrateur
    Commentaire de dark_naruto25 le 21/10/2005 09:19:02

    Hypercool.
    L'idée est super bien et surtout tombe à pic étant donnée que je dois aussi faire ma lib pour les cours lol.
    Sinon le code est bien, y a du vécu dans le C++ !!!!
    8/10 --> je ne l'ai pas tester encore

  • signaler à un administrateur
    Commentaire de luhtor le 21/10/2005 09:39:26

    Trois remarques:
    1) ne mélange jamais prototype et définition de fonction.
    Imagine, que deux de tes fichiers .cpp ou .h déclare:
    #include "matrice.h"

    Tu auras comme erreur, "redefinition of etc...", donc incompilable.

    2) tu devrais rendre ta classe générique, comme ca, on pourrait choisir le type de donnée que contient la matrice: ex:
    matrice<int> matrice_d_entier;
    matrice<float> matrice_de_float;

    et dans ce cas, tout les définitions de fonctions sont dans le .h, on ne peut pas les séparer quand on utilise du générique.

    3)tu écris ca:
    "friend void operator += (matrice& a,const matrice& b);"

    l'opérateur "+=" n'est pas symétrique comme le serait "+", (d'après ce que j'ai lu) c'est plus logique que l'opérateur "+=" soit une fonction membre, donc:
    void operator += (const matrice& b);

    mais en fait, l'opérateur doit retourner une référence de la matrice, donc ca devient:
    matrice & operator += (const matrice& b);
    et donc a la fin de ta fonction, t'as ca: "return *this;"

    et enfin l'opérateur = doit aussi retourner une référence sinon tu peux pas faire:
    matrice m;
    if ((m = a*b) = c);
    donc:
    matrice & operator = (const matrice & _which);

    Bon voila les remarques qui feraient que personnellement, je n'utiliserais pas ta class :) de toute facon, un peu comme tout le monde, je l'ai deja faite.

    Bon aller ++

  • signaler à un administrateur
    Commentaire de luhtor le 21/10/2005 09:47:22

    Hm j'ai oublié des choses:
    - le produit extérieur il est ou ? donc pas de "4 * m" possible.
    - pour les fonctions de comparaison de matrice "==" et "!=", tu peux utiliser "memcmp"
    ca donnerait un truc du genre: (au passage, perso, je préfère l'opérateur "==" en fonction membre)

    bool operator == (const matrice & _which)
    {
      // on vérifie qu'elles sont de meme taille.
      return !memcmp(this->p, _which.p, this->NbrL * this->NbrC * sizeof(double));
      // j'ai un doute si c'est return memcmp... ou return !memcmp, faudrait voir la fonction
    }

    bon ca y est, la j'ai fini.

  • signaler à un administrateur
    Commentaire de cosmobob le 21/10/2005 10:22:24

    salut,
    si tu cherches comment faire pour trouver les racines d'un polynomes de degré quelconque: http://www.library.cornell.edu/nr/bookcpdf/c9-5.pdf (algo en C)
    ya plein d'autres choses sur l'algebre lineaire: http://www.library.cornell.edu/nr/bookcpdf.html

    numerical recipes est une bible pour le calcul mathématiques en C (et donc en C++ ca se traduit assez facilement) !!

    a+ ;)


  • signaler à un administrateur
    Commentaire de le_duche le 21/10/2005 12:08:38

    Luthor, le produit extérieur y est: lignes 93 et 651...
    je prend bonne note de vos remarques, de toutes facon c'est loin d'être un produit fini ;)

  • signaler à un administrateur
    Commentaire de le_duche le 21/10/2005 12:11:52

    Merci pour les liens cosmobob, ca a l'air interessant
    (meme au sens mathématique, puis que je suis un vrai matheux ;) )

  • signaler à un administrateur
    Commentaire de Alain Proviste le 22/10/2005 19:03:23 administrateur CS

    tu pourrais calculer le rang, le determinant, l'inverse...

  • signaler à un administrateur
    Commentaire de EMSIEN le 22/10/2005 22:41:14

    moi aussi je travaille sur les matrices carré,je dois réaliser les algo des methodes de GAUSS (simple,pivot partiel et pivot total) dès que possible je vais t'envoyer la source pour que tu l'ajoute sur ta source,seul bémol est que je n'utilise pas les classes, juste le type float mat[][];
    http://ntic.blogspirit.com

  • signaler à un administrateur
    Commentaire de Galmiza le 23/10/2005 17:39:52

    Tu pourrais aussi trouver des approximations de vecteurs x avec A*x = b, avec A et b connu.
    Méthodes de Gauss-Seidel, de Jacobi, de relaxation, calculer le rayon spectral, des normes...  allez allez au boulot :D.

    Bravo, bon début !

    PS: en CP, on devait sauter des lignes pour que la maitresse écrive la correction sous la ligne fausse, mais là c'est pas la peine :-D !

  • signaler à un administrateur
    Commentaire de le_duche le 24/10/2005 10:25:36

    pour l'indentation c'est pas ma faute ! Mon code à moi est tout à fait normal, mais là je sais pas ce qui s'est passé... je crois que c'est à cause de Linux... en fait j'ai Windows (je travaille sous dev) chez moi et je passe pas la fac où il y a Linux, puis je fait un copié-collé (qui lui n'avait pas ces lignes vides...); c'est peut-être pour ca...

    Alain Proviste, le déterminant et l'inverse c'est fait (ouvre tes yeux ;) ligne 959 et 989. c'est dans la classe matrice_carree, car on ne peut pas calculer le detéreminant d'une matrice qui n'est pas carrée...), le rang se fera beaucoup plus facilement quand j'aurai fait la fonction de triangularisation... (calcul immédiat...)

    Emsien, la méthode du pivot je l'ai déjà fait mais en Pascal, et j'ai un peu la flemme de faire la traduction...

    Galmiza, Résoudre AX+b=0 n'est pas dans l'optique ce cette classe mais plutot des utilisation que l'on peut en faire par la suite... (note que ca pourrait peut etre servir pour certaines application que je devrai faire...)
    Qu'est-ce que la méthode de Gauss-Seidel ?
    Qu'est-ce que la méthode de Jacobi ?
    Qu'est-ce que la méthode de relaxation ? (mdr le nom)
    C'est quoi le rayon spectral ?
    La norme de la matrice c'est bien le maximum des normes des éléments de cette matrice ? (ca c'est déjà fait)

    J'ai aussi déjà fait l'exponentielle de matrice, la trace (somme des éléments de la diagonale)
    Je ferai aussi un générateur de matrice de Jordan de paramètre donné, de matrice diagonale à partir d'un vecteur donné,...
    mais faut me laisser un peu de temps :D

    Je suis sur deux autres projets (un scrabble qui me pose pas mal de problème d'interface...) et une classe de fonctions mathématique

  • signaler à un administrateur
    Commentaire de Galmiza le 24/10/2005 12:09:43

    Les méthodes de Jacobi, Gauss-Seidel et de relaxation sont des algorithmes recursifs pour estimer x dans A*x = b.


    Jacobi:
    Tu décompose ta matrice carré en somme d'une matrice diagonale D, une matrice triangulaire supérieure à diagonale nulle  -F et une matrice triangulaire inférieure à diagonale nulle  -E.

    D'ou A = D-(E+F)
    A*x = b
    D*x = (E+F)*x + b
    x = inv(D)*(E+F)*x + inv(D)*b   // recursif
    L'inverse de D est facile à obtenir compte tenu de la nature de D.

    Gauss-Seidel:
    Presque idem en plus rapide avec A = (D-E)-F

    Relaxation:
    A = (D/w - E) - [(1-w)/w * D + F]   // Gauss-Seidel si w==1
    // convergence si w dans ]0,2[


    rayonSpectral(A) = max( | valeurPropre(A) | )

    Il y a plusieurs norme possibles (qui satisfont la définition), en voici quelques unes:
    norme1(A) = max_j(Sum_i(|a_ij|))
    norme2(A) = sqrt(rayonSpectral(A*transpose(A)))
    normeInfinie = max_i(Sum_j(|a_ij|))

    avec sum_i = somme sur i
         max_i = maximum sur i


    En espérant t'avoir appris des trucs, bon appétit.

  • signaler à un administrateur
    Commentaire de JCDjcd le 24/10/2005 13:30:43

    * pour resoudre A.x=B, tu peux utiliser la methode des moindres carres de Gauss, qui minimise l'erreur quadratique moyenne : il suffit de resoudre (At.A).x=At.B avec At la transposee de A (remarque : se systeme est carre...)

    * pour le calcul du determinant : ton algorithme est en n!, ce qui est trop grand, en plus du point de vu stabilite numerique ... bof bof. Une methode moins couteuse consiste a ce mettre dans la cloture algebrique de ton corps choisi (i.e. pour les reels les complexes), puis tu trigonalises ta matrice, et le determinant est le produit des coefficients diagonaux.

  • signaler à un administrateur
    Commentaire de Galmiza le 24/10/2005 15:49:49

    Attention, si des vecteurs propres sont colinéaires, ta matrice n'est plus diagonalisable !

    En parlant de vecteurs propres, tu vas être obligé de résoudre des systemes du type A*x=b pour les trouver.

    PS: je parle, je parle mais les classes prépas sont loin derrière maintenant, il se peut que je raconte des conneries.

  • signaler à un administrateur
    Commentaire de le_duche le 24/10/2005 16:08:53

    non je comptais trouver les vecteurs propres avec le polynome caractéristique...
    Pour le déterminant, je me suis contenté de la définition algébrique. Je compte faire toutes mes fonctions et optimiser après ! Comme ca je sais ou je vais...

    JCDjcd le problème c'est que pour diagonaliser, il faut que le déterminant soit non nul il me semble...

  • signaler à un administrateur
    Commentaire de Galmiza le 24/10/2005 16:21:53

    Si mes souvenirs sont bons, la résolution de det(A-lambda*Id)=0 donne les valeurs propres lambda.
    Les vecteurs propres sont obtenus par résolution de (A-lambda*Id)*x = 0.

    "Pour diagonaliser, il faut que le déterminant soit non nul il me semble..."
    Non car une matrice diagonale peut avoir un déterminant nul.
    Une matrice diagonale n'est pas forcement bijective.

  • signaler à un administrateur
    Commentaire de Alain Proviste le 24/10/2005 17:57:42 administrateur CS

    pour que A soit diagonalisable il faut que les sous espaces propres associées à lamba ( engendré par les valeurs x tel que (A-lamba*Id)*x = 0 ) ait la même dimension que la multiplicité des lambas dans le déterminant det(A-lamba*Id)

    <:

  • signaler à un administrateur
    Commentaire de JCDjcd le 24/10/2005 17:58:00

    Je ne parle pas de diagonaliser, mais de trigonaliser, c'est a dire de trouver une matrice semblable a une matrice triangulaire superieur dont le determinant est le produit des coefficients diagonaux.
    Une condition necessaire et suffisante pour d'une matrice soit trigonalisable est que son polynome minimal soit scinde, donc dans les complexes c'est toujours le cas grace au theoreme de Alembert.
    Remarque : si son polynome caracteristique est scinde, alors comme le minimal divise le caracterisitque, le mininal est aussi scinde, donc la matrice est trigonalisable.

  • signaler à un administrateur
    Commentaire de le_duche le 28/11/2005 14:59:45

    Je rajoute juste un p'tit comm pour que vous soyez averti par mail...

Ajouter un commentaire

Discussions en rapport avec ce code source

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS