我想在 gnuplot 中执行以下操作: 读取我的文件,这些文件被方便地标记为“filenameN.txt”,其中 N 是第 N 个文件。
使用 aN、bN、... 将一些多项式 fN(x) 拟合到数据中 并使用 multiplot 将所有这些绘制在单个图形(多个图)中
但是,我无法使用 gnuplot 中可用的循环来使其工作。 有效的方法是创建一个文件,它可以完成我想要的 N,然后运行一个传递 N=1...M 的外部循环。
这会产生 M 个图,但不会产生单个多重图。
为此,我需要为拟合分配具有变量名称(f1,f2,... a1,a2,...,...)的变量(因为我可能想以某种方式将它们全部一起使用) )
我还希望绘图循环在多重图中生成简单的绘图(每个绘图包含数据及其拟合,M次,而不是第一个绘图包含所有行,其余绘图为空的多重绘图。
所以我有两个问题:
- 如何分配变量变量名
- 如何在多图布局中使用循环
最佳答案
您可以根据 N 定义函数,例如:
fstr(N) = sprintf('f%d(x) = a%d*x**2 + b%d*x + c%d', N, N, N, N)
eval(fstr(1))
这定义了函数f1(x) = a1*x**2 + b1*x + c1
。对于拟合函数,您必须执行相同的操作:
fitstr(N) = sprintf('fit ''filename%d.txt'' f%d(x) via a%d,b%d,c%d', N, N, N, N, N)
然后你首先进行所有拟合:
do for [i=0:N] {
eval(fstr(i))
eval(fitstr(i))
}
然后绘制每个数据文件的点
和相应的拟合线
。为了将所有图绘制在一张图中,您必须使用单个 plot
命令并用逗号分隔图。
但是为了将拟合和数据分组到键中,您可以使用replot
来添加绘图。并且您必须使用宏
来获取图中的正确函数,eval
在这里不起作用:
set style data points
set style func lines
plot 'filename0.txt' lt 1, f0(x) lt 1
set macros
do for [i=1:N] {
f = sprintf('f%d(x)', i)
replot sprintf('filename%d.txt', i) lt (i+1), @f lt (i+1)
}
只需将所有内容放在一个文件中并使用它运行 gnuplot。
关于loops - Gnuplot 工作流程涉及多重绘图的拟合循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20263039/