Code Scilab qui bloque

BlaieBlaie

Code Scilab qui bloque

Message par BlaieBlaie » 13 mai 2017 13:15

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) : http://forum.prepas.org/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...

Messages : 1162

Inscription : 01 juin 2012 22:03

Profil de l'utilisateur : Élève de lycée

Re: Code Scilab qui bloque

Message par Cortez » 13 mai 2017 13:47

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

Re: Code Scilab qui bloque

Message par BlaieBlaie » 13 mai 2017 15:38

Merci ! Oui là ça marche :)

BlaieBlaie

Re: Code Scilab qui bloque

Message par BlaieBlaie » 13 mai 2017 20:53

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

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Code Scilab qui bloque

Message par loupi » 13 mai 2017 21:04

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

Re: Code Scilab qui bloque

Message par BlaieBlaie » 13 mai 2017 21:09

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

Messages : 9679

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: Code Scilab qui bloque

Message par fakbill » 14 mai 2017 10:42

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

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Code Scilab qui bloque

Message par loupi » 14 mai 2017 13:45

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

Re: Code Scilab qui bloque

Message par BlaieBlaie » 14 mai 2017 14:59

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

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Code Scilab qui bloque

Message par loupi » 14 mai 2017 15:38

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.

Répondre