我有一个带有xy值的数据文件example.dat
,例如
0 10
1 40
5 20
如何在gnuplot
中对这些点的线性插值进行采样?我想使用output.dat
将该抽样存储在另一个文件set table
中。使用三次样条平滑我可以做到
set table "output.dat"
set samples 10
plot "example.dat" smooth csplines
产生10个点的三次样条插值的等距采样。但是我发现没有办法用线性插值进行这样的等距采样:只是忽略了采样率(gnuplot 5.0)。
我尝试了没有任何选项和线性插值"平滑",如smooth unique
,希望这会使gnuplot将数据集视为可以采样的函数,但无济于事
我的应用程序在公共网格上采样不同的数据文件,以便以后进行比较。我知道这正在推动gnuplot的目标界限,但由于已经有一个采样机制,我想知道我是否只是遗漏了一些东西。
答案 0 :(得分:0)
希望我能正确理解这个问题。您在0到5之间进行了等距采样,在这种情况下,给出了5/9 = 0.555556的步长。为了使您的样本之间的距离达到0.5,假设您为xrange[0:5]
,则应该set samples 11
。
但是,如果您想要坚持10个样本并且所有步骤都是0.5,那么您可以调整xrange[0.5:5.0]
,这将创建9个步骤0.5。
答案 1 :(得分:0)
如果仍然有兴趣的话,下面是“仅gnuplot”解决方案。不是很优雅,但是似乎可以。
### "gnuplot only" linear interpolation of data
reset session
$Data <<EOD
0 10
1 40
5 20
EOD
stats $Data u 1 nooutput
min = STATS_min
max = STATS_max
Samples=10
Interpolate(x0,y0,x1,y1,xi) = y0 + (y1-y0)/(x1-x0)*(xi-x0)
set print $Interpol
set table $Nowhere
do for [i=1:Samples] {
xi = min + (i-1)*(max-min)/(Samples-1)
do for [j=0:STATS_records-1] {
plot $Data u (a=$1,$1):(b=$2,$2) every ::j::j with table
plot $Data u (c=$1,$1):(d=$2,$2) every ::j+1::j+1 with table
if ( xi>=a && xi<=c) {
print sprintf("%g\t%g",xi,Interpolate(a,b,c,d,xi))
break
}
}
}
unset table
set print
set colorsequence classic
plot $Data u 1:2 w lp t "original data",\
$Data u 1:2 w lp smooth cspline t "smooth cspline",\
$Interpol u 1:2 w p pt 6 t "linear interpolation"
### end code