如何使用Gnuplot插值数据以进行进一步计算

如何使用Gnuplot插值数据以进行进一步计算,gnuplot,interpolation,Gnuplot,Interpolation,我(不知何故)熟悉Gnuplot中的平滑/插值技术。在我看来,这些插值仅用于绘制插值。但是,我需要插值进行进一步计算 一个简单的例子可以说明这一点: 假设我们在四天内销售特定商品,并将销售数量存储在input\u number中。dat: # days | number_of_sold_items 1 4 2 70 3 80 4 1 # number_of_sold_items | price_per_item 1 5.00 3 4.10 10

我(不知何故)熟悉Gnuplot中的平滑/插值技术。在我看来,这些插值仅用于绘制插值。但是,我需要插值进行进一步计算

一个简单的例子可以说明这一点: 假设我们在四天内销售特定商品,并将销售数量存储在
input\u number中。dat

# days  |  number_of_sold_items
1   4
2   70
3   80
4   1
# number_of_sold_items  | price_per_item
1      5.00
3      4.10
10     3.80
100    3.00
现在,我想画出我每天的收入。但是,每件商品的价格与售出商品数量之间的关系不是简单的线性关系,而是复杂的关系,这仅为少数几个例子所知–存储在
input\u price.dat

# days  |  number_of_sold_items
1   4
2   70
3   80
4   1
# number_of_sold_items  | price_per_item
1      5.00
3      4.10
10     3.80
100    3.00
我如何做这样的事情(伪代码):

我可以试穿,但这不是我想要的。数据之间的关系太复杂了


注:我知道在这样一个例子中,每件商品的价格与商品的数量更像是一个阶梯式的函数,并不平滑。这只是一些插值的一个例子。

很难证明某些东西的不存在,但我很有信心,这不能仅用Gnuplot来完成,因为:

  • 我幻想着对Gnuplot足够熟悉,如果它存在的话,我会知道它

  • 我找不到关于这种特征的任何信息

  • 它将完全违背Gnuplot的范式,成为绘图的单一用途工具(拟合已经处于临界状态),而不是特征数据处理


线性插值不可用,但这如何:

set xr [0:10]
set sample 21

# define an inline example dataset
$dat << EOD
0 1
2 2
4 4
6 5
8 4
10 3
EOD

# plot interpolated data to another inline dataset
set table $interp
plot $dat us 1:2 with table smooth cspline
unset table

plot $dat w lp, $interp w lp
set xr[0:10]
设置样本21
#定义内联示例数据集

$datGnuplot可以执行以下操作:

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
。可以绘制结果并给出预期的图表:

此行为可用于创建分段插值函数,如下所示:

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
这是生成的插值函数(由
绘图ip(x)
绘制):

这是在另一次计算中使用插值函数的结果图(
使用1:($2*ip($2))绘制“input_numbers.dat”)

我不知道可以嵌套多少个三元运算符,一个字符串或函数定义可以有多长


在Debian Jessie上使用Gnuplot 5.0进行测试。

您可以尝试以下内容:我认为明确定义
$dat
$interp
将改进此答案。@alexis您的意思是这样吗?实际上是的,我相信这对第一次阅读有帮助。谢谢@Karl。你的第三点当然是对的,但我也让它成为我的一项运动,向大家展示gnuplot基本上可以做它没有写过的任何事情