7

有没有办法根据文本文件中的值绘制函数?

我知道如何在 gnuplot 中定义一个函数然后绘制它,但这不是我需要的。我有一个表,其中包含定期更新的函数的常量。当这个更新发生时,我希望能够运行一个用这条新曲线绘制图形的脚本。由于要绘制的数字很少,我想使该过程自动化。

这是一个带有常量的示例表:

location a  b  c
1        1  3  4
2

我看到有两种方法可以解决问题,但我不知道它们是否以及如何实施。

  1. 然后我可以使用 awk 生成字符串:f(x)=1(x)**2+3(x)+4,将其写入文件并以某种方式让 gnuplot 读取这个新文件并在一定x范围内绘图。
  2. 或者在 gnuplot 中使用 awk 之类的东西f(x) = awk /1/ {print "f(x)="$2,或者直接在 plot 命令中使用 awk。

无论如何,我被卡住了,还没有在网上找到解决这个问题的方法,你有什么建议吗?

4

3 回答 3

3

另一种可能为此提供一些通用版本,您可以执行以下操作:

假设,参数存储在一个文件parameters.dat中,第一行包含变量名称,其他所有参数集,如

location a b c
1        1 3 4

脚本文件如下所示:

file = 'parameters.dat'
par_names = system('head -1 '.file)
par_cnt = words(par_names)

# which parameter set to choose
par_line_num = 2
# select the respective string
par_line = system(sprintf('head -%d ', par_line_num).file.' | tail -1')
par_string = ''
do for [i=1:par_cnt] {
  eval(word(par_names, i).' = '.word(par_line, i))
}
f(x) = a*x**2 + b*x + c

plot f(x) title sprintf('location = %d', location)
于 2013-08-14T13:03:52.210 回答
1

这个问题(gnuplot 将一个数字从数据文件存储到变量中)在第一个答案中对我有一些提示。

就我而言,我有一个包含抛物线参数的文件。我已将参数保存在 gnuplot 变量中。然后我绘制包含每个时间步的参数变量的函数。

#!/usr/bin/gnuplot

datafile = "parabola.txt"

set terminal pngcairo size 1000,500
set xrange [-100:100]
set yrange [-100:100]
titletext(timepar, apar, cpar) = sprintf("In timestep %d we have parameter a = %f, parameter c = %f", timepar, apar, cpar)

do for [step=1:400] {
  set output sprintf("parabola%04d.png", step)

  # read parameters from file, where the first line is the header, thus the +1
  a=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $1}' " . datafile)
  c=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $2}' " . datafile)

  # convert parameters to numeric format
  a=a+0.
  c=c+0.

  set title titletext(step, a, c)

  plot   c+a*x**2
}

这给出了一系列名为 parabola0001.png、parabola0002.png、parabola0003.png、...的 png 文件,每个文件都显示一个抛物线,其中包含从名为 .png 的文件中读取的参数parabola.txt。标题包含给定时间步的参数。

要了解 gnuplotsystem()函数,您必须知道:

  • gnuplot 不解析双引号内的内容
  • 点用于连接 gnuplot 中的字符串
  • 必须对 awkprintf命令的双引号进行转义,以将它们隐藏在 gnuplot 解析器中

要测试这个 gnuplot 脚本,请将其保存到具有任意名称的文件中,例如parabolaplot.gplot并使其可执行 ( chmad a+x parabolaplot.gplot)。该parabola.txt文件可以创建

awk 'BEGIN {for (i=1; i<=1000; i++) printf "%f\t%f\n", i/200, i/100}' > parabola.txt

于 2013-07-24T17:43:25.400 回答
0
awk '/1/ {print "plot "$2"*x**2+"$3"*x+"$4}' | gnuplot -persist

将选择线并绘制它

于 2013-03-27T13:45:46.140 回答