2017-08-19 2 views
0

Je rencontre un comportement erratique sur un script gnuplot ligné lourd.Pour les plantages en boucle dans gnuplot

Le script a l'intention de tracer des limites. Les styles courbe et ligne sont utilisés. Aussi une famille mono-paramétrique de courbes sont affichées via

plot for [i=1:4] f(x,i) title sprintf("f(x,i) i=%d",i) w l dt 2 

Je tweeté un exemple ici https://pbs.twimg.com/media/DHbeEgXXkAAV6aS.jpg:large

Après ce complot, je continuais l'introduction de l'Argentine. Après de nouvelles lignes de codes, les lignes pointillées en bleu ont commencé à se comporter de manière erratique. Deux d'entre eux ont simplement disparu.

J'ai commencé à déboguer le code et finalement utiliser l'utilitaire set table produisant la totalité de l'intrigue dans un seul fichier. J'ai trouvé que la boucle for se comportait de manière erratique. La ligne de titre montre que la variable de boucle i s'exécute correctement du début à la fin. Cependant, la fonction f (x, i) n'a pas été correctement alimentée avec la valeur correcte de i.

Lors de la première itération, la valeur de la boucle a bien fonctionné et le script a tracé f (x, 1). Lors de la deuxième itération, la fonction a été correctement alimentée et affichée f (x, 2). Mais au-delà de la fonction a toujours été alimentée par i = 2 malgré chaîne de titre correctement a montré le changement de i

L'intrigue résultant a été

For-loop plot crashing. There should be four lines

J'apprécierais vraiment un soupçon me aider à trouver le bug.


Je vais maintenant ajouter quelques lignes de code. La parcelle commande

plot for [i=1:words(europa_cet)] countries u ($1+($2<36?1:0)*15):(mercator($2)) index (word(europa_cet,i)+0) w filledcurve lc rgb colorFondoCET,\ 
     for [i=1:words(paises_wet)] countries u ($1+15+dst*word(dst_wet,i)*15):(mercator($2)) index (word(paises_wet,i)+0) w filledcurve lc rgb colorFondoWET,\ 
     for [i=1:words(southAm)] countries u ($1+(4+dst*word(dstSouthAm,i))*15):(mercator(abs($2))) index int(word(southAm,i)) w filledcurve lc rgb colorFondoGET,\ 
     "magallanes.dat" u (new!=2?$1+dst*15:1/0):(mercator($2)) w filledcurve lc rgb colorFondoEET,\ 
    "no_magallanes.dat" u (new!=2?$1:1/0):(mercator($2)) w filledcurve lc rgb colorFondoEET,\ 
for [k=1:5:1] mercator(orto(x,real(b1)+real(k)*real(15.0))) tit sprintf("orto a %02d signo %d",k,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+1*15)) tit sprintf("no loop orto a %02d signo %d",1,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+2*15)) tit sprintf("no loop orto a %02d signo %d",2,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+3*15)) tit sprintf("no loop orto a %02d signo %d",3,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+4*15)) tit sprintf("no loop orto a %02d signo %d",4,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+5*15)) tit sprintf("no loop orto a %02d signo %d",5,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+0*15)) tit sprintf("no loop orto a %02d signo %d",0,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 

La for-loop (ligne 6) ne fonctionnent pas. Les appels ligne par ligne (lignes 7-12) fonctionnent.

et la sortie obtenue à partir set table, premières lignes de chaque itération

# Curve 43 of 104, 100 points FIRST iteration 
# Curve title: "orto a 01 signo 1" 
# x y type 
-22.5 0.874361° i 
-21.9697 0.887919° i 
-21.4394 0.901287° i 
-20.9091 0.914467° i 

# Curve 44 of 104, 100 points SECOND iter 
# Curve title: "orto a 02 signo 1" 
# x y type 
-22.5 0.407722° i 
-21.9697 0.426936° i 
-21.4394 0.445968° i 
-20.9091 0.464814° i 

# Curve 45 of 104, 100 points THIRD iter (REPEATS 2nd) 
# Curve title: "orto a 03 signo 1" 
# x y type 
-22.5 0.407722° i 
-21.9697 0.426936° i 
-21.4394 0.445968° i 
-20.9091 0.464814° i 

# Curve 46 of 104, 100 points FOURTH iter (repeats 2nd) 
# Curve title: "orto a 04 signo 1" 
# x y type 
-22.5 0.407722° i 
-21.9697 0.426936° i 
-21.4394 0.445968° i 
-20.9091 0.464814° i 

# Curve 47 of 104, 100 points FIFTH iter (repeats 2nd) 
# Curve title: "orto a 05 signo 1" 
# x y type 
-22.5 0.407722° i 
-21.9697 0.426936° i 
-21.4394 0.445968° i 
-20.9091 0.464814° i 
+0

peut être lié au fait que 'i' est un nombre entier, donc si la fonction' f' effectue des opérations arithmétiques telles que la division, etc., le résultat pourrait ne pas être ce qui est prévu - pourriez-vous essayer 'f (x, real (i)) 'à la place afin de lancer' i' explicitement pour flotter? – ewcz

+0

Nice. J'aurais aimé que ça marche. Mais ça a échoué. J'ai même transformé en réels tous les entiers à l'intérieur de f. Cela n'a pas fonctionné non plus. – jmmo

+0

pourriez-vous poster la fonction en question et/ou un exemple plus complet? sinon, il est difficile de dire ce qui pourrait être faux ... – ewcz

Répondre

0

Maintenant, j'ai isolé le problème.

Je colle de nouveau la ligne (multi). La ligne de tracé est exécutée deux fois pour la sous-placette gauche (sunrise), la seconde pour la sous-placette droite (sunset) dans un environnement multiplot. Ils diffèrent dans la définition de la fonction orto et la valeur pour b1.

plot "usa.dat" u (usaBool?($1+6*15):1/0):(mercator($2)) w filledcurve lc rgb colorFondoFET,\ 
for [i=1:words(europa_cet)] countries u ($1+($2<36?1:0)*15):(mercator($2)) index (word(europa_cet,i)+0) w filledcurve lc rgb colorFondoCET,\ 
     for [i=1:words(paises_wet)] countries u ($1+15+dst*word(dst_wet,i)*15):(mercator($2)) index (word(paises_wet,i)+0) w filledcurve lc rgb colorFondoWET,\ 
     for [i=1:words(southAm)] countries u ($1+(4+dst*word(dstSouthAm,i))*15):(mercator(abs($2))) index int(word(southAm,i)) w filledcurve lc rgb colorFondoGET,\ 
     "magallanes.dat" u (new!=2?$1+dst*15:1/0):(mercator($2)) w filledcurve lc rgb colorFondoEET,\ 
    "no_magallanes.dat" u (new!=2?$1:1/0):(mercator($2)) w filledcurve lc rgb colorFondoEET,\ 
mercator(orto(x,b1+1*15)) tit sprintf("no loop orto a %02d signo %d",1,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+2*15)) tit sprintf("no loop orto a %02d signo %d",2,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+3*15)) tit sprintf("no loop orto a %02d signo %d",3,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+4*15)) tit sprintf("no loop orto a %02d signo %d",4,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+5*15)) tit sprintf("no loop orto a %02d signo %d",5,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
mercator(orto(x,b1+0*15)) tit sprintf("no loop orto a %02d signo %d",0,Signo) w l lc rgb 'blue' dt 2 lw 3,\ 
for [i=1:words(europa_cet)] countries u ($1+($2<36?1:0)*15):(mercator($2)) index (word(europa_cet,i)+0) w l lt 1 lc rgb colorLinea,\ 
     for [i=1:words(paises_wet)] countries u ($1+15*(1+dst*word(dst_wet,i))):(mercator($2)) index (word(paises_wet,i)+0) w l lt 1 lc rgb colorLinea,\ 
     for [i=1:words(southAm)] countries u ($1+(4+dst*word(dstSouthAm,i))*15):(mercator(abs($2))) index int(word(southAm,i)) w l lt 1 lc rgb colorLinea,\ 
     "magallanes.dat" u (new!=2?$1+dst*15:1/0):(mercator($2)) w l lt 1 lc rgb colorLinea,\ 
    "no_magallanes.dat" u (new!=2?$1:1/0):(mercator($2)) w l lt 1 lc rgb colorLinea,\ 
    "usa.dat" u (usaBool?($1+6*15):1/0):(mercator($2)) w l lt 1 lc rgb 'gray50',\ 
    for [i=0:2] "ciudadesChile.dat" u ($2-($6-1+((new==0&i==2)?-1:((new==2&i==1)?1:0))-dst*word(dstSouthAm,i+1))*15):(mercator(abs($1))) index i w p pt 7 lc 1 ps 1.5,\ 
    "ciudadesUsa.dat" u (usaBool?($2+6*15):1/0):(mercator(abs($1))) w p pt 7 lc rgb 'blue' ps 1.5,\ 
for [k=1:5:1] mercator(orto(x,real(b1)+real(k)*real(15.0))) tit sprintf("orto a %02d signo %d",k,Signo) w l lc rgb 'green' dt 2 lw 10,\ 
for [i=0:2] "ciudadesChile.dat" u ($2-($6-1+((new==0&i==2)?-1:((new==2&i==1)?1:0))-dst*real(word(dstSouthAm,i+1)+0))*15-$4*.5):(mercator(abs($1+$5*1.1))):(stringcolumn($3)) index i w labels font "Arial-Bold,10" tc rgb word(corporativa,1),\ 
    "ciudadesUsa.dat" u (usaBool?($2+6*15-$4*.5):1/0):(mercator(abs($1+$5*1.1))):3 w labels font "Arial-Bold,10" tc rgb 'blue',\ 
for [i=1:words(Coastlines)] coastline u 1:(mercator($2)) index (word(Coastlines,i)+0) w l lt 1 lc rgb 'gray50',\ 

Le problème est avec la 3ème ligne à partir du bas, celle commençant par for [i=0:2].

Si cette ligne est supprimée; la boucle for [k=1:5:1] fonctionne bien.

Si for [k=1:5:1] est placé après la 3ème ligne à partir du bas, le script fonctionne correctement.

Si for [k=1:5:1] est placé avant la troisième ligne à partir du bas, la boucle ne fonctionne pas correctement.

Image produced in failure modeImage OK

Les noms for [i=0:2] imprime des villes du Chili et d'Argentine. Colonne $1 est la latitude, $2 est la longitude. Ils sont déplacés du centre à $4 et $5. La variable i à index contrôle le pays: Argentina=0Chile=1RegionMagallanes (Chile)=2. La variable new contrôle le fuseau horaire au Chili new=0 est avant 2015; new=1 est l'état actuel, new=2 se réfère à 2015. La colonne $6 fait référence à un fuseau horaire de référence (-3 Argentine et Magallanes, -4 Chili).

Le script contrôle également les conditions d'hiver (dst=0) ou d'été (dst=1).

J'ai essayé et enlevé des morceaux (monomères) de la ligne for [i=0:2] un par un. Sans succès. Même j'ai édité le fichier ciudadesChile.dat et changé un onglet séparant $1 et $2 dans un espace. Sans succès.

+0

Cela semble assez étrange. Quelle version de gnuplot utilisez-vous? Vous pouvez contacter les experts sur l'une des [listes de diffusion gnuplot] (https://sourceforge.net/p/gnuplot/mailman/?source=navbar). – user8153

+0

Ouais assez étrange. C'est pourquoi j'ai posté. Je vais essayer une liste de diffusion. Je ne suis pas habitué, cependant. – jmmo