 |
Apprendre Maple Site dédié au logiciel de calcul formel Maple
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
mouss33
Inscrit le: 09 Oct 2006 Messages: 7
|
Posté le: 09 Oct 2006 20:30 Sujet du message: procédure: rang de matrice |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 10 Oct 2006 10:11 Sujet du message: |
|
|
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 |
|
 |
mouss33
Inscrit le: 09 Oct 2006 Messages: 7
|
Posté le: 01 Nov 2006 11:30 Sujet du message: procedure |
|
|
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 |
|
 |
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 01 Nov 2006 13:22 Sujet du message: |
|
|
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 |
|
 |
|
|
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
|

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.
|