Code Scilab qui bloque
Code Scilab qui bloque
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...
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...
Re: Code Scilab qui bloque
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
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
Re: Code Scilab qui bloque
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...
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...
Re: Code Scilab qui bloque
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.
Re: Code Scilab qui bloque
Merci, malheureusement le message d'erreur apparaît toujours...
Re: Code Scilab qui bloque
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...
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é.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.
Re: Code Scilab qui bloque
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.
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.
Re: Code Scilab qui bloque
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) :
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))
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) :
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))
Re: Code Scilab qui bloque
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.
D'autre part, ta façon de d'obtenir un nb aléatoire pour gérer 4 valeurs n'est pas terrible du tout.