2017-09-13 55 views
2

我(在某種程度上)熟悉Gnuplot中的平滑/插值技術。在我看來,這些內插僅適用於繪製內插值。但是,我需要插值來進一步計算。如何使用Gnuplot插值數據以進行進一步計算

一個簡單的例子可以說明這一點: 比方說,我們在四天銷售的具體項目,並有存儲在input_numbers.dat銷售數量:

# days | number_of_sold_items 
1 4 
2 70 
3 80 
4 1 

現在,我要畫出我的每股收益天。但每個項目的價格和銷售項目的數量之間的關係不是簡單的線性關係,但一些複雜這是唯一已知的幾個例子 - 存儲在input_price.dat

# number_of_sold_items | price_per_item 
1  5.00 
3  4.10 
10  3.80 
100 3.00 

我怎麼可以這樣做這(僞代碼):

make INTERPOLATED_PRICE(x) using "input_price.dat" 
plot "input_numbers.dat" using 1:($2*INTERPOLATED_PRICE($2)) 

我可以通過擬合,但它不是我想要的。數據的關係太複雜了。

P.S .:我知道每個項目的價格與這個例子中的項目數量更像是一個階梯式的功能,並不平滑。這只是一般插值的例子。

回答

1

這是很難證明的東西不存在,但我非常有信心,這不能與gnuplot的獨自完成,如:

  • 我的誤解,有足夠的熟悉的Gnuplot我如果它存在就會知道它。

  • 我找不到任何有關此功能的信息。

  • 這完全違背了Gnuplot的範例,成爲繪製(擬合已經是邊界)的單一目的工具而不是特徵數據處理。

0

直線插補不可用,但這個怎麼樣:

set xr [0:10] 
set sample 21 

$dat << EOD 
0 1 
2 2 
4 4 
6 5 
8 4 
10 3 
EOD 
set table $interp 
plot $dat us 1:2 with table smooth cspline 
unset table 
plot $dat w lp, $interp w lp 
0

的Gnuplot可以做這樣的事情:

text = "%f*x + %f" 

a = 2 
b = 10 

eval("f(x) = ".sprintf(text,a,b)) 

set grid x y 
plot f(x) 

這基本上意味着複雜的功能,可以動態定義: sprintf命令將文本「%f * x +%f」轉換爲「2.0 * x + 10」,點運算符.將字符串「f(x)=」和「2.0 * x + 10」連接起來,eval命令定義了功能f(x) = 2.0*x + 10。結果可以被繪製並給出了預期圖:

linear diagram

此行爲可用於創建一個分段插值函數如下:

ip_file = "input_price.dat" 
stats ip_file nooutput 

n = STATS_records - 1 
xmin = STATS_min_x 
xmax = STATS_max_x 

ip_f = sprintf("x < %f ? NaN : ", xmin) 

f(x) = a*x + b # Make a linear interpolation from point to point. 

do for [i=0:n-1] { 

    set xrange [xmin:xmax] 
    stats ip_file every ::i::(i+1) nooutput 

    xmintemp = STATS_min_x 
    xmaxtemp = STATS_max_x 

    set xrange [xmintemp:xmaxtemp] 

    a = 1 
    b = 1 
    fit f(x) ip_file every ::i::(i+1) via a, b 

    ip_f = ip_f.sprintf("x < %f ? %f * x + %f : ", xmaxtemp, a, b) 

} 

ip_f = ip_f."NaN" 

print ip_f # The analytical form of the interpolation function. 

eval("ip(x) = ".ip_f) 

set samples 1000 

#set xrange [xmin:xmax] 
#plot ip(x) # Plot the interpolation function. 

unset xrange 
plot "input_numbers.dat" using 1:($2*ip($2)) w lp 

在組合的everystatsfit限制範圍爲兩個連續的數據點,請參見help statshelp every。三元運算符?:分段定義了插值函數,請參閱help ternary

這是內插函數的所產生的解析形式(某些格式後):

x < 1.000000 ? NaN 
    : x < 3.000000 ? -0.450000 * x + 5.450000 
    : x < 10.000000 ? -0.042857 * x + 4.228571 
    : x < 100.000000 ? -0.008889 * x + 3.888889 
    : NaN 

這是所得到的內插函數(由plot ip(x)繪製):

interpolation function

這是在另一個計算中使用插值函數生成的繪圖(plot "input_numbers.dat" using 1:($2*ip($2))):

use interpolation function

我不知道有多少三元運營商可以嵌套和字符串或函數定義多久能的限制,...

測試用的Gnuplot 5.0 Debian的傑西。