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.
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

La variable i est fixée, c'est une autre variable (i0 par exemple) qui doit prendre les valeurs de i+1 à n : n'oublie pas que l'on combine avec la ligne i (i est donc fixé à cette étape).
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

Je n'arrive pas à faire la disctinction :
i0 et i+1

que tu met dans la boucle.
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

La ligne i contient le pivot non nul. Donc, il faut combiner toutes les lignes de i+1 à n avec la ligne i, ce qui donne :

Code : Tout sélectionner

FOR k FROM i+1 TO n DO addrow(A,k,i,-A[k,j]/A[i,j]) ;
(je ne connais pas la syntaxe exacte de addrow).
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

The call addrow(A, r1, r2, m) returns a copy of the matrix A in which row r2 is replaced by m*row(A, r1) + row(A, r2).
Visiblement, m doit être un scalaire !
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Donc :

Code : Tout sélectionner

FOR k FROM i+1 TO n DO addrow(A,i,k,-A[k,j]/A[i,j]) ;
(j'ai permuté k et i).
Je ne vois pas ce qui pose problème avec -A[k,j]/A[i,j] (à moins que ce ne soit pas la syntaxe pour désigner le coefficient d'une matrice).
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

guiguiche a écrit :Je ne vois pas ce qui pose problème avec -A[k,j]/A[i,j] (à moins que ce ne soit pas la syntaxe pour désigner le coefficient d'une matrice).
Je ne sais pas s'il en existe vraiment une, en tout cas ca ne fonctionne pas à cause de ceci!
(quand je fais tourner la procédure, le curseur revient exactement ici)
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Tu n'as pas moyen de rechercher dans l'aide la réponse à l'extraction des coefficients ?
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

L'aide est en anglais!
Sinon j'ai mis :

Code : Tout sélectionner

m1:=-A[k,j]; m2:=A[i,j];
Désormais dans

Code : Tout sélectionner

addrow(A,k,i,m1/m2) ;
le curseur se positionne derriere le i, j'y comprend plus rien!
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

et si tu poses m=-A[k,j]/A[i,j] ?
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

Désormais, le curseur est derrière la A dans

Code : Tout sélectionner

addrow(A,k,i,m) ;
!!
Kazik

Message non lu par Kazik »

Voila ce que j'ai pour l'instant :

Code : Tout sélectionner

pivot:=proc(A)
local i,j,k;

i:=1; j:=1;
while i<=rowdim(A) and j<=coldim(A) do
i0:=i;
while A[i0,j]=0 and i0<n do
i0:=i0+1;
end do;
if i0<>i then swaprow(A,i,i0);
end if;
if A[i,j]<>0 then 
for k from i+1 to rowdim(A) do 
m:=-A[k,j]/A[i,j];
addrow(A,k,i,m);
end if;
end do;
end do;
end proc;
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

i0 est aussi une variable locale (mais tu peux la renommer k).
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

Code : Tout sélectionner

pivot:=proc(A)
local i,j,i0,m,n,p;
n:=RowDimension(A);
p:=ColumnDimension(A);
i:=1;j:=1;
while i<=n and j<=p do
i0:=i;
while A[i0,j]=0 do i0:=i0+1; end do;
if i0<>i then swaprow(A,i,i0); end if;
if A[i,j]<>0 then
for i0 from i+1 to n do
m:=-A[i0,j]/A[i,j];
addrow(A,i0,i,m);
end do;
end if;
end do;
end proc;
ça tourne sans retourner de résultat !
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Si tu ne fait rien afficher, la machine ne prend pas d'initiative !
Fait afficher la matrice A pour voir si la réduction est correcte.
Il faudra peut-être une variable locale supplémentaire pour calculer le rang de la matrice (c'est bien ce que tu voulais au départ ?).
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

guiguiche a écrit :Si tu ne fait rien afficher, la machine ne prend pas d'initiative !
Fait afficher la matrice A pour voir si la réduction est correcte.
j'ai rajouter un

Code : Tout sélectionner

return A;
sans succès.
guiguiche a écrit :Il faudra peut-être une variable locale supplémentaire pour calculer le rang de la matrice (c'est bien ce que tu voulais au départ ?).
C'est sur!
Mais dejà, si cela ne tourne pas comme ceci !!
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Tu ne peux pas faire afficher A à la main après avoir fait tourner la procédure ?
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

Le problème c'est que la procédure tourne certes mais ne s'arrête pas. Donc oui, on peut le faire afficher à la main :

Code : Tout sélectionner

pivot(A);
Mais comme la procédure tourne mais ne s'arrête pas, cela ne fait rien!
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Si elle ne s'arrête pas, c'est que la condition d'arrêt d'une boucle while est mise en échec.
Tu lui as donné quelle matrice A pour fonctionner ?
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
Kazik

Message non lu par Kazik »

J'ai donner cette matrice 2x2

Code : Tout sélectionner

A := Matrix(2, 2, [[1, 1], [1, 1]])
Je pense moi que c'est sur la boucle for qu'il y a un bug!
guiguiche
Modérateur général
Modérateur général
Messages : 8149
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

Message non lu par guiguiche »

Il doit manquer un BEGIN/END autour des deux instructions à réaliser par cette boucle FOR.
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.