从文件中读取函数系数

时间:2014-10-31 17:53:05

标签: gnuplot

说我有以下文件:

1,2,3
4,5,6
7,8,9

我想让gnuplot绘制形式为 x ^ 2 + b x + c的3个多项式,使用文件值作为系数。直接执行此操作,我会这样做:

plot x**2+2*x+3, 4*x**2+5*x+6, 7*x**2+8*x+9

但我想以编程方式对输入文件中的任意行数进行此操作。

我想我可能会受到this answer启发的代码的接近:

n= "`awk 'END {print NR}' < test.dat`"
i=0
while i<n{
f(a,b,c,x)=a*x**2+b*x+c
plot 'test.dat' every ::i::i using f($1,$2,$3,x)
}

但是undefined variable: x

失败了

2 个答案:

答案 0 :(得分:1)

我多年来一直有同样的问题,最后我设法找到了解决方案。 它需要创造性地使用stats函数将文件中的值分配给变量,并需要一些do for [...]循环来将某些命令存储在临时文件中

filename = "InputFileName.dat"
stats filename nooutput
nlines = STATS_records-1
set print "temp.gnuplot"
do for [i=0:nlines] {\
  print sprintf("stats filename every ::%i::%i using (a%i=$1,b%i=$2,c%i=$3,0):(0) nooutput",i,i,i,i,i)}
set print
load "temp.gnuplot"
set print "temp.gnuplot"
do for [i=1:nlines] {print sprintf("replot  a%i*x**2 + b%i*x + c%i",i,i,i)}
plot a0*x**2 + b0*x +c0
load "temp.gnuplot"
set print

根据需要更改filename变量。完成系统调用(例如! rm temp.gnuplot

后,您可以删除临时文件

我知道不是特别优雅,我特别喜欢使用临时文件,如果有人知道如何执行字符串变量,我很高兴知道。但是,嘿,它有效(即使在Windows下)!

修改:忘记将thse归功于输入。

答案 1 :(得分:0)

这是一个旧线程但是由于之前的回答,我可以使用字符串而不是临时文件来提出升级版本。那个,之后没有必要打扰删除无用的临时文件。

filename = "InputFileName.dat"
stats filename nooutput

nlines = STATS_records-1

paramstr(N) = sprintf("stats filename every ::%i::%i using (a%i=$1,b%i=$2,c%i=$3,0):(0) nooutput",N,N,N,N,N)
do for [i=0:nlines] {
    eval(paramstr(i))
}

plotstr = "p "
do for [i=0:nlines] {
    plotstr = plotstr . sprintf("a%i*x**2 + b%i*x + c%i%s",i,i,i,(i == nlines) ? "" : ", ")
}

eval(plotstr)

可能需要进行一些set xrangeset yrange调整才能查看您感兴趣的内容。