采样数据文件的线性插值

时间:2016-06-24 08:38:35

标签: gnuplot

我有一个带有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的目标界限,但由于已经有一个采样机制,我想知道我是否只是遗漏了一些东西。

2 个答案:

答案 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

enter image description here