增量小于1的循环的Gnuplot

增量小于1的循环的Gnuplot,gnuplot,Gnuplot,我正试图策划以下几点 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 "str

我正试图策划以下几点

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"]
这是一个bug还是应该这样工作?我的意思是,为什么它不接受小于1的增量

我正在使用以下版本的gnuplot

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

Gnuplot只支持整数值的迭代(参见文档部分“绘图命令中的循环”,第98页)。小于
1
的值被转换为
0
的整数,这是不允许的。使用例如

plot for [h=0:3:1.5] sin(x*h) title sprintf('%.1f', h)
用值为
0、1、2、3的
h
绘制四条曲线。要使用较小的值,必须在以后缩放迭代值:

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

除了Christoph的答案之外,不需要在函数中进行缩放就可以执行任意增量循环的另一种方法是定义一个值列表,其中包含要循环的所有元素。这可以通过系统调用
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)

如果
seq
不可用,则等效的仅gnuplot解决方案(由Karl在评论中提出)也将起作用,如下所示:

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)
start=0。;结束=1。;inc=0.1

列表=”;a=启动公司;while(aI问这个问题,因为我在作者使用这个命令的地方发现了这个:
plot for[angle=360:0:-2.5]
。那么这是错误的吗?是的,这在某种意义上是错误的,实际增量是
-2
,这仍然可以为这里显示的示例提供合理的结果。很高兴知道。我将尝试在该问题的警告页面中发表评论。没有错误消息(或至少警告)有意义吗如果将非整数输入迭代器结构,则会发出吗?@Karl我想有太多的地方会以静默方式执行此类强制转换或转换,例如string->float,float->int等:
使用(列(1.1)):2
为[I=0:2:“1.3”]I*x进行绘图,
绘图x*“1.1”
.Gnuplot也有整数除法,这不是一些人所期望的,
print 5/2
->
2
。我只知道一些运算符在不与整数一起使用时会出错:
print 1.2我想指出,由于
seq
是一个系统调用,它可能不适用于所有平台。
seq
是在Windows中不可用(当然没有一些unix环境)默认情况下。但这是一种实现我在问题中提出的方法。@McLeary你完全正确。然而,仅涉及gnuplot的解决方案,例如
do for
和递归打印到变量,虽然可行,但比Christoph的解决方案更麻烦(因此我甚至不想麻烦发布它)。我不熟悉Windows下的gnuplot,但可能有类似于上述解决方案的替代方案。
list=“”;a=start inc;而(a@Karl感谢您的建议,我忘记了新的gnuplot版本可以访问
循环。我将把它添加到答案中。虽然它不像定义后可以随时调用的函数那样灵活,但它是一个只支持gnuplot的解决方案,可以在任何平台下工作。
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)