Procédure sous Maple

Tout ce qui concerne notamment les outils de calcul numérique, de calcul formel ou de géométrie.
[participation réservée aux membres inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
Kazik

Procédure sous Maple

Message non lu par Kazik »

Bonjour,

je commence a étudier le logiciel maple. En ce qui concerne les 'formules' je m'en sors pas trop mal. Mais je ne comprend rien au procédure.
J'ai un exercice dans lequel on prend une matrice $A\in M_{(n,m)}(\mathbb{R})$ (n lignes, m colonnes).
Il faut trouver une procédure qui renvoie le rang de $A$.

:?

Pouvez vous m'aider ?
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Je ne connais pas Maple mais j'imagine qu'il y a une fonction préprogrammée pour cela : rank(A) ?
Une petite googlelisation me donne :
http://www.grappa.univ-lille3.fr/polys/ ... lin03.html
Alphonse BC

Message non lu par Alphonse BC »

Il te suffit de créer un programme qui reduit ta matrice grace à l'algorithme de Gauss (par exemple) et ensuite tu compte le nombre de ligne de ta matrice qui possède au moins un élément non nul. C'est enfantin. Il faut juste connaitre le langage de programmation de Maple et il n'est pas très compliqué!!!

Sinon je pense également que Maple possède déjà une fonction qui calcul le rang d'une matrice.

Alphonse \$BC\$
Kazik

Message non lu par Kazik »

Alphonse BC a écrit :Il te suffit de créer un programme qui reduit ta matrice grace à l'algorithme de Gauss (par exemple) et ensuite tu compte le nombre de ligne de ta matrice qui possède au moins un élément non nul. C'est enfantin. Il faut juste connaitre le langage de programmation de Maple et il n'est pas très compliqué!!!

Sinon je pense également que Maple possède déjà une fonction qui calcul le rang d'une matrice.

Alphonse \$BC\$
Oui c'est bien cela Alphonse :
la procéduire doit renvoyer $PAQ=B$
où $Q\in Gl_n(\mathbb{R})$, $P\in Gl_m(\mathbb{R})$ et $B\in M_{(n,m)}(\mathbb{R})$
C'est enfantin, mais pas pour moi :(
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Dans ce cas:
http://www.grappa.univ-lille3.fr/polys/ ... ire01.html
ou bien
http://www.velvia.org/documents/fayard- ... _gauss.pdf
ou encore
http://www.apsq.org/sautquantique/Activ ... Etapes.pdf

Ce ne sont pas les réponses qui manquent sous google (requête=maple+matrice+pivot+Gauss)
Kazik

Message non lu par Kazik »

Est-ce que vous pouvez m'expliquer sur un exemple ?
Si
A=
1 2 3
4 5 6
7 8 9

Comment trouver le rang de A avec une telle procédure ?
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Je note $L_i$ la ligne $i$ d'une matrice.
Etape 1 : avoir un coefficient non nul en haut à gauche (on permute des lignes si nécessaire) appelé pivot puis on combine les lignes 2 à $n$ avec la ligne 1 pour obtenir des 0 dessous ce pivot. Ici :
$L_2\;\leftarrow\;L_2 - 4L_1$ et $L_3\;\leftarrow\;L_3 - 7L_1$
Etape 2 : avoir un coefficient non nul en place (2,2) (permuter si nécessaire) puis obtenir des 0 en dessous de ce nouveau pivot en combinant les lignes 3 à $n$ avec la ligne 2. Ici :
$L_3\;\leftarrow\;L_3 - \alpha L_2$ (je n'ai pas fait les calculs).
Etape 3 : on itère ce processus jusqu'à épuisement des lignes ou bien jusqu'à abtenir un "pivot" nul (même après permutations).
Le rang de la matrice est alors le nombre de pivots (non nuls bien sûr).
Dernière modification par guiguiche le vendredi 13 octobre 2006, 21:25, modifié 1 fois.
Kazik

Message non lu par Kazik »

//On choisit la ligne 1.

Ligne 1, 1 2 3 (est le premier pivot).
Ligne 2, 0 -3 -6 (on fait $L_2-4L_1$).
Ligne 3, 0 -6 -12 (on fait $L_3-7L_1$).

Je suis Ok : c'est pour obtenir des 0 sur la première colonne ?
Le problème c'est qu'ici la matrice est donnée, mais dans le cas général comment on fait ?
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Je crois que Maple manipule les lignes des matrices (va voir les liens que je t'ai donné).
Kazik

Message non lu par Kazik »

guiguiche a écrit :Je crois que Maple manipule les lignes des matrices (va voir les liens que je t'ai donné).
Ok,

moi j'ai réfléchis je vois quelque chose comme ça :

on entre la matrice avec n et m
on prend deux varibles l et c
tant que l<n et c<m on cherche le pivot

j'ai donc deux fonctions, une pivot_de_gauss et l'autre cherche_le_pivot.
mais je ne vois pas que faire dans cherche_le_pivot.

Mais je vois pas le rapport avec PAQ=B aussi, décidement je crois que j'ai rien compris
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Kazik a écrit :mais je ne vois pas que faire dans cherche_le_pivot.
Une procédure du genre:

Code : Tout sélectionner

j := i ;
TANT QUE coef(i,i) = 0 FAIRE
    j := j+1 ;
    SI coef(j,i) = 0 ALORS permuter les lignes i et j ;
    FIN FAIRE
SI coef(i,i) est nul
     ALORS rang := i-1
     SINON on combine ;
Kazik

Message non lu par Kazik »

guiguiche a écrit : Une procédure du genre:

Code : Tout sélectionner

j := i ;
TANT QUE coef(i,i) = 0 FAIRE
    j := j+1 ;
    SI coef(j,i) = 0 ALORS permuter les lignes i et j ;
    FIN FAIRE
SI coef(i,i) est nul
     ALORS rang := i-1
     SINON on combine ;
J'essaie de comprendre votre raisonement, je raisonne sur un exemple :
On prend la matrice :
1 2 3
4 5 6

On a donc n=2, m=3.
Tant que l<2 et c<3 on cherche le pivot.

on fait l=c=1 (tout le temps 1 ?)
le coef de (1,1)=1
le coef de (2,2)=5

Je vois pas la suite, on ne pourra pas rentrer dans la boucle while car (i,i) différent de 0 non ?
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Le principe est d'obtenir une matrice "triangulaire" (avec des 0 dessous la "diagonale") donc le pivot est en (1,1) à la première étape, en (2,2) à la deuxième étape, ...
Dans ton exemple initial :
1 2 3
4 5 6
7 8 9
Etape 1 donne : (pivot=1)
1 2 3
0 -3 -6
0 -6 -12
Etape 2 donne : (pivot=-3)
1 2 3
0 -3 -6
0 0 0
Etape 3 donne : pas de pivot non nul donc la triangularisation est achevée et le rang de la matrice vaut 2.
Kazik

Message non lu par Kazik »

J'ai bien compris ceci,
mais ce que je n'est pas compris c'est pourquoi une telle procédure permet de cherche le pivot ?

Code : Tout sélectionner

j := i ;
TANT QUE coef(i,i) = 0 FAIRE
    j := j+1 ;
    SI coef(j,i) = 0 ALORS permuter les lignes i et j ;
    FIN FAIRE
SI coef(i,i) est nul
     ALORS rang := i-1
     SINON on combine ; 
Je n'arrive pas à 'faire tourner sur papier' cette procédure sur une matrice comme exemple :
1 2 3
4 5 6
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Essais avec :
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
Ce que je propose n'a d'intérêt que si on tombe sur un "pivot" nul : sauf erreur de ma part, l'algorithme proposé doit permuter les lignes 1 et 4 (le coefficient (1,1) est nul donc on regarde le coef (2,1) qui est nul donc en regarde le coef (3,1) qui est encore nul donc on regarde le coef (4,1) qui n'est pas nul donc on permute).
Kazik

Message non lu par Kazik »

Ok,

mais ça ne marche pas sur
1 2 3
4 5 6

alors ? comment faire dans le cas de cette matrice pour chercher le pivot ?
J'en reviens a ce que j'ai dit :
J'essaie de comprendre votre raisonement, je raisonne sur un exemple :
On prend la matrice :
1 2 3
4 5 6

On a donc n=2, m=3.
Tant que l<2 et c<3 on cherche le pivot.
Il faut faire intervenir d'autres fonctions ?
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Kazik a écrit :mais ça ne marche pas sur
1 2 3
4 5 6
Normallement si, mais comme le premier pivot vaut 1, on n'a pas besoin d'utiliser la procédure de recherche puis, comme le second pivot vaut -3, on n'a toujours pas besoin d'utiliser la procédure (on ne rentre pas dans la boucle puisque coef(i,i) n'est pas nul aussi bien pour i=1 à l'étape 1 que pour i=2 à l'étape 2).
Kazik

Message non lu par Kazik »

Ah d'accord!!
On ne rentre dans cette boucle que si coef(i,i)=0.
Ce qui n'est pas le cas ici, maintenant on doit faire les opérations sur les lignes.

Si on appel k:=cherche_le_pivot, k:=0 ? (toujours dans le même exemple)
guiguiche
Modérateur général
Modérateur général
Messages : 8150
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Kazik a écrit :Si on appel k:=cherche_le_pivot, k:=0 ? (toujours dans le même exemple)
Je n'ai pas bien compris ta question. Peux-tu la préciser ?
Kazik

Message non lu par Kazik »

Code : Tout sélectionner

rang_de_matrice:= proc (matrice)
local M, n, m, l, c, k;
M := Copy (matrice);
n := RowDimension (M);
m := ColumnDimension (M);
c := 1;
l := 1;
while l <= n and c <= m do
k := cherche_le_pivot (M, l, c);
que vaut k si la matrice est
1 2 3
4 5 6

?