Code Scilab qui bloque

Modérateur : Michel Quercia

BlaieBlaie
Messages : 42
Enregistré le : lun. janv. 11, 2016 11:10 pm
Classe : Autodidacte

Code Scilab qui bloque

Message par BlaieBlaie » sam. mai 13, 2017 1:15 pm

Bonjour,

J'ai une ébauche de code sur Scilab, cependant ça ne compile pas, en effet le "and" semble poser problème :

function y=croissZ2(n)
A0=[0 0]
for i=1:n-1
e=2*rand()-1
f=2*rand()-1
if ((e<0) and (f<0)):
A0=[[(A0(1,1)-1),A(1,2)];A0];
elseif ((e<0) and (f>0)):
A0=[[(A0(1,1)+1),A(1,2)];A0];
elseif ((e>0) and (f<0)):
A0=[A0;[A0(i,1),(A0(i,2)-1)]];
else
A0=[A0;[A0(i,1),(A0(i,2)+1)]];
end
end
y=A0
endfunction

J'ai remplacé ce "and" par un "&", et toujours impossible de compiler... Comment faire pour que ça marche ?
Le code n'est pas terminé bien sûr. J'ai mes idées mais ce "and" me bloque... Pour info j'essaie de simuler An pour cet exercice (en dimension 2) : viewtopic.php?f=3&t=62564

Voici le message d'erreur :
Message d’erreur :
--> if ((e<0)and(f<0)):
!--error 276
Opérateur, virgule ou point-virgule manquant.
at line 6 of function croissZ2 called by :
endfunction
at line 52 of exec file called by :
nts\croiss.sci', -1

Quelqu'un pourrait me dire ce qui bloque ? Merci beaucoup d'avance...

Avatar du membre
Cortez
Messages : 1724
Enregistré le : ven. juin 01, 2012 10:03 pm

Re: Code Scilab qui bloque

Message par Cortez » sam. mai 13, 2017 1:47 pm

Chez moi sous cette forme, pas de message d'erreur :

function y=croissZ2(n)
A0=[0 0]
for i=1:n-1
e=2*rand()-1
f=2*rand()-1
if ((e<0) & (f<0))
A0=[[(A0(1,1)-1),A(1,2)];A0];
elseif e<0 & f>0
A0=[[(A0(1,1)+1),A(1,2)];A0];
elseif ((e>0) & (f<0))
A0=[A0;[A0(i,1),(A0(i,2)-1)]];
else
A0=[A0;[A0(i,1),(A0(i,2)+1)]];
end
end
y=A0
endfunction

BlaieBlaie
Messages : 42
Enregistré le : lun. janv. 11, 2016 11:10 pm
Classe : Autodidacte

Re: Code Scilab qui bloque

Message par BlaieBlaie » sam. mai 13, 2017 3:38 pm

Merci ! Oui là ça marche :)

BlaieBlaie
Messages : 42
Enregistré le : lun. janv. 11, 2016 11:10 pm
Classe : Autodidacte

Re: Code Scilab qui bloque

Message par BlaieBlaie » sam. mai 13, 2017 8:53 pm

Re!

Du coup j'ai le code quasi complet
function y=croissZ2(n)
A0=[0 0]
B0=[0 0]
for i=1:n-1
e=2*rand()-1
f=2*rand()-1
if ((e<0) & (f<0))
A0=[[(A0(1,1)-1),0];A0];
elseif e<0 & f>0
A0=[A0;[(A0(i,1)+1),0];
elseif ((e>0) & (f<0))
B0=[[0,(B0(1,2)-1)];B0];
else
B0=[B0;[0,(B0(i,2)+1)]];
end
end
for i=1:length(A0)
if (A0(i,1)==A0(i,2))
[A0(i,1),A0(i,2)]=null()
end
end
y=[A0;B0]
endfunction

Sauf que j'ai encore un message d'erreur... :(
Le voici :
!--error 47
end ou else est manquant...
at line 23 of function croissZ2 called by :
endfunction
at line 23 of exec file called by :

Je n'arrive absolument pas à déceler le else ou end manquant... Quelqu'un pourrait encore m'aider ? Merci d'avance...

loupi
Messages : 336
Enregistré le : mer. févr. 27, 2013 5:45 pm
Classe : ENVT

Re: Code Scilab qui bloque

Message par loupi » sam. mai 13, 2017 9:04 pm

Je ne connais pas scilab, mais vu le reste de la syntaxe, j'ai l'impression qu'il te manque un ; à la 5ème ligne en partant de la fin.

BlaieBlaie
Messages : 42
Enregistré le : lun. janv. 11, 2016 11:10 pm
Classe : Autodidacte

Re: Code Scilab qui bloque

Message par BlaieBlaie » sam. mai 13, 2017 9:09 pm

Merci, malheureusement le message d'erreur apparaît toujours...

Avatar du membre
fakbill
Messages : 11078
Enregistré le : mer. juil. 30, 2008 4:59 pm
Classe : Dr.-Ing

Re: Code Scilab qui bloque

Message par fakbill » dim. mai 14, 2017 10:42 am

Comme toujours quand on ne comprend plus rien à son code alors on le simplifie jusqu'à ce qui fonctionne (on commente presque tout) puis on dé-commente petit à petit les lignes jusqu'à tomber sur le problème.
Ca c'est la méthode "désespoir". Le plus souvent, on va prendre un café et, en revenant, tout est plus clair;

ps : que tentes tu de faire avec ce code? Je ne connais pas la syntaxe de scilab (et je ne veux pas entendre parler de cette daube pour faire du code sérieux) mais ça me semble un peu étrange...
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

loupi
Messages : 336
Enregistré le : mer. févr. 27, 2013 5:45 pm
Classe : ENVT

Re: Code Scilab qui bloque

Message par loupi » dim. mai 14, 2017 1:45 pm

Vérifie le nb de parenthèses et crochets ouvrants/fermants à la 10ème ligne...

Aussi, cette instruction me semble étrange : [A0(i,1),A0(i,2)]=null()
C'est sensé faire quoi ?

Plus généralement, vérifie la syntaxe de tout ton code. Il est court : c'est facile.

BlaieBlaie
Messages : 42
Enregistré le : lun. janv. 11, 2016 11:10 pm
Classe : Autodidacte

Re: Code Scilab qui bloque

Message par BlaieBlaie » dim. mai 14, 2017 2:59 pm

Rebonjour,
J'ai trouvé mon erreur précédente : j'avais simplement oublié un crochet fermé à la ligne 10.
Mais de toute façon, même s'il fonctionne, mon code ne donne pas DU TOUT de bons résultats.

Je vous explique ce que je cherche exactement à faire (j'ai enlevé le latex, ça marchait pas) :
On considère une suite An de sous-ensembles de Z² qui croît selon la règle suivante : à l'étape n, une particule est lancée à l'origine et se déplace jusqu'à ce qu'elle sorte de An par un point X. Elle se déplace suivant une marche aléatoire simple : soit au Nord, au Sud, à l'Est ou à l'Ouest avec une probabilité 1/4.
On commence avec A1 = {(0,0)}. On note A(n+1) = An U X.

Pour être plus clair, à l'étape 1, la particule se promène dans A1 = {(0,0)}.
- Si elle sort de A1 par le point (0,1) (Nord), alors A2 = {(0,0),(0,1)}.
- Si elle sort de A1 par le point (0,-1) (Sud), alors A2 = {(0,0),(0,-1)}.
- Si elle sort de A1 par le point (1,0) (Est), alors A2 = {(0,0),(1,0)}.
- Si elle sort de A1 par le point (-1,0) (Ouest), alors A2 = {(0,0),(-1,0)}.

Ensuite la particule se promène dans l'un des ensembles A2, puis en sort, etc.

On cherche à représenter graphiquement An pour n = 10, 1000, 10000...
Lorsque n est grand, la forme limite de An est censée être un "rond". Voici un exemple de A(1000) : Image

Et voici mon code, vous pouvez le tester, ça compile mais ça ne donne pas de bons résultats. En fait, pour le "null", j'avais cru comprendre que la particule avait 4 directions (Nord, Sud, Est, Ouest) et comme elle est lancée à l'origine, chaque point du sous-ensemble avait soit une abscisse, soit une ordonnée nulle. Sauf qu'à la vue du graphique au-dessus, ce n'est pas le cas. D'après ce que je comprends, la particule a 4 directions uniquement à l'étape 1, c'est bien ça ?

Si le nombre de directions de la particule augmente à chaque étape, je vois pas comment coder ça...

function y=croissZ2(n)
A0=[0 0]
B0=[0 0]
i=1;j=1
while (i+j)<n
e=2*rand()-1
f=2*rand()-1
if ((e<0) & (f<0))
A0=[[(A0(1,1)-1),0];A0];
i=i+1
elseif ((e<0) & (f>0))
A0=[A0;[(A0(i,1)+1),0]];
i=i+1
elseif ((e>0) & (f<0))
B0=[[0,(B0(1,2)-1)];B0];
j=j+1
else
B0=[B0;[0,(B0(j,2)+1)]];
j=j+1
end

end
y=[A0;B0]
plot2d(y)
endfunction

disp(croissZ2(1000))

loupi
Messages : 336
Enregistré le : mer. févr. 27, 2013 5:45 pm
Classe : ENVT

Re: Code Scilab qui bloque

Message par loupi » dim. mai 14, 2017 3:38 pm

Je ne vois pas du tout, dans ton code, ce qui va circonscrire le déplacement à un cercle ?!?
D'autre part, ta façon de d'obtenir un nb aléatoire pour gérer 4 valeurs n'est pas terrible du tout.

BlaieBlaie
Messages : 42
Enregistré le : lun. janv. 11, 2016 11:10 pm
Classe : Autodidacte

Re: Code Scilab qui bloque

Message par BlaieBlaie » dim. mai 14, 2017 3:54 pm

Ben justement..
Moi j'avais cru comprendre que la particule se déplaçait suivant les axes abscisses OU ordonnées puisqu'elle va soit au Nord, Sud, Est ou Ouest.
A vrai dire, je ne comprends pas pourquoi An a une forme de "cercle" si n est grand... Ca veut dire que la particule a plus de 4 directions aux étapes supérieures à 1... Et dans ce cas mon code est complètement faux en effet.

loupi
Messages : 336
Enregistré le : mer. févr. 27, 2013 5:45 pm
Classe : ENVT

Re: Code Scilab qui bloque

Message par loupi » dim. mai 14, 2017 4:01 pm

Ouais, ben là avec une seule particule et incrémentation (N,S,E,O) sans aucun test de sortie de la trajectoire, ça ne risque pas de faire un disque. Ca doit pouvoir commencer à ressembler à un disque si tu lances n (avec n grand) fois la particule pour m déplacements à partir de la même origine. Par exemple, si tu te déplaces de m pas à partir d'une même origine un grand nombre de fois, tu finiras par fouler tout un disque de rayon m pas (genre une chèvre attachée à un piquet dans un pré qui a un nb de pas limité dans une direction donnée, laisse la attachée une semaine, tu verras le résultat).

Pour obtenir 4 entiers aléatoires 1,2,3 ou 4, il suffit de faire i=ceil(4*rand()).
Le mieux serait même d'obtenir une matrice aléatoire qui te donnerait directement [0 1], [0,-1], [1 0] ou [-1 0] si tu ne veux gérer que les 4 directions, puis d'appliquer l'opération qui va bien à ta coordonnée courante pour obtenir la coordonnée suivante.

Avatar du membre
fakbill
Messages : 11078
Enregistré le : mer. juil. 30, 2008 4:59 pm
Classe : Dr.-Ing

Re: Code Scilab qui bloque

Message par fakbill » lun. mai 15, 2017 10:19 pm

"J'ai trouvé mon erreur précédente : j'avais simplement oublié un crochet fermé à la ligne 10."
Comment est ce possible???? Tout éditeur pas trop nul hurle et mets les parenthèses fautives en rouge.

Pour ce qui est du problème:
Comme les 4 directions sont équiprobables il serait étonnant que ça ne fasse pas un cercle.
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

BlaieBlaie
Messages : 42
Enregistré le : lun. janv. 11, 2016 11:10 pm
Classe : Autodidacte

Re: Code Scilab qui bloque

Message par BlaieBlaie » mar. mai 16, 2017 2:07 pm

Bonjour,

Désolé du temps de réponse. Scilab ne met pas les crochets manquants en avant. On a par contre un message d'erreur "else ou end manquant".

Merci loubi pour ces conseils ! Du coup je pense mieux comprendre. En fait, on commence avec A1 = {(0,0)}. Ensuite on a 4 ensembles potentiels pour A2, et ensuite, on a 6 possibilités de A3 (pour chaque A2), puis 8 pour A4, etc... Dans mon code précédent, j'avais très mal compris, d'où le résultat pas net du tout.

Bon, je vais essayer de mettre tout ça en application alors...

Avatar du membre
Cortez
Messages : 1724
Enregistré le : ven. juin 01, 2012 10:03 pm

Re: Code Scilab qui bloque

Message par Cortez » mar. mai 16, 2017 3:24 pm

BlaieBlaie a écrit :
mar. mai 16, 2017 2:07 pm
Scilab ne met pas les crochets manquants en avant
Non mais qd tu en ouvres un il te met automatiquement celui qui ferme, c'est donc que tu l'avais effacé toi même ;)

Répondre

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité