2017-08-25 34 views
0

所以我一直在學習GNUplot,並且一直在困擾着我的是樣本和等速率(尤其是在計算阿克曼函數時)。我知道isosample率應該控制等值線的數量,而另一個對每個等值線採樣也是一樣的。GNUplot阿克曼函數的樣本和等樣本

此代碼繪製了ackermann函數(來源:gnuplot sourceforge)。爲什麼只有樣本和樣本的某些特定值會生成該圖? (4,2)和(2,4)的唯一的其他值。對於其餘的值,我得到了堆棧溢出或遞歸深度限制超出。

ack(m,n) = (m == 0) ? n + 1 : (n == 0) ? ack(m-1,1) : ack(m-1,ack(m,n-1)) 
set xrange [0:3] 
set yrange [0:3] 
set isosamples 4 
set samples 4 
set title "Plot of the ackermann function" 
splot ack(x, y) 

有人能解釋爲什麼只有(4,4),(4,2),(2,4)工作?

+0

它與我爲x和y設置的範圍有關嗎? – Akshit

+0

因爲該函數僅爲其參數的整數值定義? – user8153

+0

如果您的範圍是[[0:3]]比2或4個採樣點位於整數值(但您可能希望強制顯式轉換爲函數定義中的整數,因爲我非常確定gnuplot將使用浮點(x,y)的點值來評估函數)。 – user8153

回答

0

這裏有兩個問題:

  1. 正如評論上面提到的,你不能評估非整數值阿克曼功能。如果您的samples/isosamples值與您的xrange/yrange的長度不完全匹配,那麼gnuplot將嘗試在非整數值處評估該函數。那麼就可以避免通過顯式轉換爲整數:

    ack(m,n) = (m == 0) ? n + 1 : (n == 0) ? ack(m-1,1) : ack(m-1,ack(m,n-1)) 
    ack_protected(x,y) = ack(int(x),int(y)) 
    set xrange [0:3] 
    set yrange [0:3] 
    set isosamples 50 
    set samples 50 
    set title "Plot of the ackermann function" 
    splot ack_protected(x, y) 
    

給出

enter image description here

  • 也不能評價的整數值的阿克曼函數(m,n)將超過gnuplot的遞歸限制,即250。組合m = 4,n = 3已經超過了該限制。