Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

procédure: rang de matrice

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en algèbre linéaire
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
mouss33



Inscrit le: 09 Oct 2006
Messages: 7

MessagePosté le: 09 Oct 2006 20:30    Sujet du message: procédure: rang de matrice Répondre en citant

bonjour tout le monde
je vous écris ce message car j'ai un gros probleme sur une procédure.
En fait, j'ai une matrice A de M(n,m) de R qui est une matrice rectangulaire à n lignes et m colonnes.
et moi je doit déterminer une procédure qui prend comme argument la matrice A et qui renvoie le rang de A et des matrices P appartenant à GL(n) de R,Q appartenant à GL(m) de R, B appartenant à M(n,m) de R telles que P*A*Q=B, avec B une matrice telle que si r est son rang, on ait b(1,1)....,b(r,r) non nuls et b(i,j)=0 si i>r ou si (j<=r et j<i)

j'ai créé une procédure pour la multiplication des matrices mais en fait elle ne me sert a rien!
et la je suis complètement bloqué!
aidez moi s'il vous plait!
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 10 Oct 2006 10:11    Sujet du message: Répondre en citant

Bonjour mouss33,
Ceci utilise la méthode de Gauss mais vue matriciellement. Chaque opération élémentaire sur les lignes ou les colonnes peut être vue comme un produit par une matrice bien choisie.
Exemple, échanger 2 lignes i et j revient à multiplier par une matrice de permutation n*n à gauche. Echanger 2 colonnes i et j revient à multiplier par une matrice de permutation m*m à droite. Faire apparaitre des 0 en utilisant un pivot en ligne i colonne j revient à multiplier par une matrice "d'élimination". Pour multiplier une ligne par un coeff mu: j'ai écrit une procédure mult rendant une matrice permettant de multiplier la ligne i par mu.

Voir sur un exemple ci-dessous. Dans le cas général, il vous faudra construire un algorithme basé sur ces procédures:

Code:

> with(linalg):
> perm:=proc(i::posint,j::posint,n::posint)
> local P,u,v;
> P:=matrix(n,n);
> for u to n do
>   for v to n do
>     P[u,v]:=0;
>     if u=v then
>        if u<>i and u<>j then P[u,v]:=1 end if;
>     else
>        if (u=i and v=j) or (u=j and v=i) then                                                                                                                                                                                                                                     P[u,v]:=1 end if;
>     end if;
>    end do;
> end do;
> evalm(P)
> end proc:
>     
> A:=matrix([[2,-1,3,9],[3,1,-1,7],[5,-2,1,5]]);

                           [2    -1     3    9]
                           [                  ]
                      A := [3     1    -1    7]
                           [                  ]
                           [5    -2     1    5]

> evalm(perm(1,2,3)&*A);  # permuter les lignes 1 et 2 de A
> evalm(A&* perm(2,4,4)); # permuter les colonnes 2 et 4 de A

                         [3     1    -1    7]
                         [                  ]
                         [2    -1     3    9]
                         [                  ]
                         [5    -2     1    5]


                         [2    9     3    -1]
                         [                  ]
                         [3    7    -1     1]
                         [                  ]
                         [5    5     1    -2]

> elim:=proc(A::matrix,i::posint,j::posint,n::posint)
> local M,u,v;
> M:=matrix(n,n);
> for u to n do
>   for v to n do
>     M[u,v]:=0;
>     if u=v then M[u,v]:=1 end if;
>     if u>i and v=i then M[u,v]:=-A[u,j]/A[i,j] end if;
>   end do
> end do;
> evalm(M)
> end proc:
>
> P:=elim(A,1,1,3); B:=evalm(elim(A,1,1,3) &* A);

                             [ 1      0    0]
                             [              ]
                        P := [-3/2    1    0]
                             [              ]
                             [-5/2    0    1]


                       [2    -1       3        9  ]
                       [                          ]
                  B := [0    5/2    -11/2    -13/2]
                       [                          ]
                       [0    1/2    -13/2    -35/2]

> mult:=proc(A::matrix,i::posint,mu::numeric,n::posint)
> local M,u,v;
> M:=matrix(n,n);
> for u to n do
>   for v to n do
>     M[u,v]:=0;
>     if u=v then
>        if u=i then M[u,v]:=mu else M[u,v]:=1 end if
>     end if;
>    end do
> end do;
> evalm(M)
> end proc:
>
> P:=evalm(mult(A,1,1/2,3) &*P); B:=evalm( mult(B,1,1/2,3) &* B);

                             [1/2     0    0]
                             [              ]
                        P := [-3/2    1    0]
                             [              ]
                             [-5/2    0    1]


                       [1    -1/2     3/2      9/2 ]
                       [                           ]
                  B := [0    5/2     -11/2    -13/2]
                       [                           ]
                       [0    1/2     -13/2    -35/2]

> B:=evalm( P &* A);

                       [1    -1/2     3/2      9/2 ]
                       [                           ]
                  B := [0    5/2     -11/2    -13/2]
                       [                           ]
                       [0    1/2     -13/2    -35/2]

> evalm(P); P:=evalm( mult(B,2,2/5,3) &* elim(B,2,2,3) &* P); B:=evalm( mult(B,2,2/5,3) &* elim(B,2,2,3) &* B);

                           [1/2     0    0]
                           [              ]
                           [-3/2    1    0]
                           [              ]
                           [-5/2    0    1]


                           [ 1/2      0      0]
                           [                  ]
                      P := [-3/5     2/5     0]
                           [                  ]
                           [-11/5    -1/5    1]


                       [1    -1/2     3/2      9/2 ]
                       [                           ]
                  B := [0     1      -11/5    -13/5]
                       [                           ]
                       [0     0      -27/5    -81/5]

> P:=evalm(mult(B,3,-5/27,3) &*P);  B:=evalm( mult(B,3,-5/27,3) &* B);

                           [1/2      0      0 ]
                           [                  ]
                           [-3/5    2/5     0 ]
                      P := [                  ]
                           [ 11             -5]
                           [ --     1/27    --]
                           [ 27             27]


                       [1    -1/2     3/2      9/2 ]
                       [                           ]
                  B := [0     1      -11/5    -13/5]
                       [                           ]
                       [0     0        1        3  ]

En multipliant à gauche A par P, on trouve B=PAQ avec ici Q=Id.
Quand on aura besoin d'échanger des colonnes on aura une matrice Q produit des différentes matrices de permutation
ayant agi sur les colonnes.

> evalm(P &*A);

                    [1    -1/2     3/2      9/2 ]
                    [                           ]
                    [0     1      -11/5    -13/5]
                    [                           ]
                    [0     0        1        3  ]

3 éléments diagonaux non nuls, donc rang 3.

Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
mouss33



Inscrit le: 09 Oct 2006
Messages: 7

MessagePosté le: 01 Nov 2006 11:30    Sujet du message: procedure Répondre en citant

bonjour ALS,
j'ai demandé a mon prof s'il était possible de rendre plusieurs procédure pour ce probleme mais il m'a spécifié que normalement tout devait rentrer dans une seul procédure.
c'est pour ca que j'ai fait quelque recherche et j'ai trouver que pour multiplié une ligne par un scalaire, il suffit d'utiliser RowOperation ce qui enleve deja une procédure;
et en fait je voudrais savoir s'il était possible de rentré vos 2 premiere procédure dans une seul? j'espere que oui car on ne doit faire qu'une seul procédure pour répondre a tout le probleme!
sinon, n'existe-t-il pas une commande pour echanger des lignes sans faire de procédure?(je n'en ai pas trouvé)
merci d'avance !
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 01 Nov 2006 13:22    Sujet du message: Répondre en citant

Bonjour,
Dans le package linalg, il existe plusieurs fonctions intéressantes:

swapcol et swaprow pour échanger des colonnes ou des lignes.
addcol et addrow pour effectuer certaines opérations sur les colonnes ou les lignes.

En utilisant ces fonctions, vous pourrez je pense en effet tout faire tenir dans une seule procédure.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Maple en algèbre linéaire Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.