如何使用Gnuplot插值数据以进行进一步计算
我(不知何故)熟悉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
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基本上可以做它没有写过的任何事情