2015-10-20 64 views
4

我试图绘制以下gnuplot的与增量越小则1

plot for [h=0:2:0.1] sin(h*x) 

但它提供了以下错误

gnuplot> plot for [h=0:2:0.1] sin(x*h) 
        ^
     Expecting iterator  for [<var> = <start> : <end> {: <incr>}] 
     or for [<var> in "string of words"] 

但以下行工作只是正常循环

plot for [h=0:2:1.1] sin(x*h) 

这是一个错误还是它应该以这种方式工作?我的意思是,为什么它不接受小于1的增量?

我使用的gnuplot

G N U P L O T 
Version 5.0 patchlevel 1 last modified 2015-06-07 

回答

3

以下版本的Gnuplot仅支持与整数值(参见文档部分“对于在绘图命令回路”,第98页)迭代。值小于1的数值将作为整数转换为0,这是不允许的。使用例如

plot for [h=0:3:1.5] sin(x*h) title sprintf('%.1f', h) 

曲线与具有值0, 1, 2, 3h四条曲线。要使用较小的值必须在迭代值后规模:

plot for [h=0:20:1] sin(0.1*h*x) 
+1

我问这是因为我发现这个[link](http://www.gnuplotting.org/tag/iteration/)作者使用这个命令:'plot for [angle = 360:0:-2.5]' 。那么这是错误的? – McLeary

+0

是的,从某种意义上说这是错误的,他的实际增量是'-2',它仍然给你在那里显示的例子的合理结果。 – Christoph

+0

很高兴知道。我会尝试在页面警告中针对此问题发表评论。 – McLeary

1

除了克里斯托夫的答案,另一种方法做任意的增量循环,而不需要做函数中的比例是界定值的列表包含所有要循环的元素。这可以很容易地用一个系统调用来完成,以seq

list(start,end,increment)=system(sprintf("seq %g %g %g", start, increment, end)) 
plot for [i in list(0.,1.,0.1)] sin(i*x) 

enter image description here

一个只相当于gnuplot的解决方案(在评论由Karl建议),也将工作,如果seq不可用如下:

start=0.; end=1.; inc=0.1 
list = ""; a=start-inc; while (a<end) {list=list.sprintf(" %.3f",a=a+inc)} 
plot for [i in list] sin(i*x) 

请注意,while循环只有自gnuplot 4.6以来才可用。

+0

我想指出,因为'seq'是一个系统调用,它可能不适用于所有平台。 'seq'在Windows中不可用(当然没有一些unix环境)。但这是一种完成我在这个问题中提出的方法。 – McLeary

+0

@McLeary你是对的。然而,一个仅涉及gnuplot的解决方案,例如“do for”和递归打印到变量,虽然可行,但会比Christoph的解决方案更麻烦(所以我甚至不打算发布它)。我不熟悉Windows下的gnuplot,但可能有一些类似于上面的替代解决方案。 – Miguel

+1

'list =“”;一个=起动-INC; while(a Karl