2015-10-20 39 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