Gnuplot 从文件中读取函数系数
假设我有以下文件:Gnuplot 从文件中读取函数系数,gnuplot,Gnuplot,假设我有以下文件: 1,2,3 4,5,6 7,8,9 我想让gnuplot使用文件值作为系数,绘制3个形式为ax^2+bx+c的多项式。如果直接执行此操作,我将执行以下操作: plot x**2+2*x+3, 4*x**2+5*x+6, 7*x**2+8*x+9 但是我想通过编程的方式来实现这一点,对于输入文件中任意数量的行 我想我可能会接近以下代码的灵感: n=“'awk'END{print NR}'
1,2,3
4,5,6
7,8,9
我想让gnuplot使用文件值作为系数,绘制3个形式为ax^2+bx+c的多项式。如果直接执行此操作,我将执行以下操作:
plot x**2+2*x+3, 4*x**2+5*x+6, 7*x**2+8*x+9
但是我想通过编程的方式来实现这一点,对于输入文件中任意数量的行
我想我可能会接近以下代码的灵感:
n=“'awk'END{print NR}' 虽然我多年来一直有同样的问题,但最终我设法找到了解决办法。
它需要创造性地使用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
我知道它不是特别优雅,我特别不喜欢使用临时文件,如果有人知道如何执行字符串变量,我很乐意知道。但是,嘿,它工作(即使在窗户下)
编辑:忘记为输入评分。这是一个旧线程,但由于前面的回答,我可以使用字符串而不是临时文件来建议升级版本。这一个,没有必要麻烦删除无用的临时文件后
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)
可能需要进行一些设置xrange
和设置yrange
调优,以查看您感兴趣的内容。使用语法绘制'test.dat'…
绘制的是数据文件,而不是x的函数。所以变量x没有定义。你也可以看看。无论如何,没有一个简单的解决方案。
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)