gnuplot线性拟合for循环

时间:2014-06-23 13:25:34

标签: gnuplot

我有一个脚本可以正确绘制100个单独的数据文件。现在我想做一个线性的 在 for 循环中拟合每个图。但是,当我的脚本到达 fit 命令并且消息“跳过不可读的文件”f(x)= a100 * x + b%d“时,我的脚本崩溃。任何人都可以帮助使用正确的语法吗?谢谢你。

plotfile = "graph.eps"
set output plotfile
n=100
filename(n) = sprintf("%d_mod.int", n)
fstr(n) = sprintf('f(x) = a%d*x + b%d ' , n)
plot for [i = 1:n] filename(i) u 1:2 title sprintf("%d", i) w lp
fit for  [i = 1:n] fstr(i) filename(i) u 1:2 via a, b

1 个答案:

答案 0 :(得分:4)

fit不支持迭代。这是你如何做到的,但它需要一些摆弄;)

# define the functions depending on the current number
fstr(N) = sprintf("f%d(x) = a%d*x + b%d", N, N, N)

# The fitting string for a specific file and the related function
fitstr(N) = sprintf("fit f%d(x) 'file%d.dat' via a%d,b%d", N, N, N, N)

n = 2

# Do all the fits
do for [i=1:n] {
    eval(fstr(i))
    eval(fitstr(i))
}

# construct the complete plotting string
plotstr = "plot "
do for [i=1:n] {
    plotstr = plotstr . sprintf("f%d(x), 'file%d.dat'%s ", i, i, (i == n) ? "" : ", ")
}

eval(plotstr)

如果我使用以下两个测试文件,这对我来说很好用:

档案file1.dat

1 1
2 2.1
3 3

file2.dat

1 1.5
2 2.7
3 4

4.6.5的结果是:

enter image description here

要使键中显示拟合的实际结果,必须按如下方式构建绘图字符串plotstr

plotstr = "plot "
do for [i=1:n] {
    t = sprintf("f%d(x) = %.2f*x + %.2f", i, value(sprintf('a%d', i)), value(sprintf('b%d', i)))
    plotstr = plotstr . sprintf("f%d(x) lt %d t '%s', ", i, i, t).\
                        sprintf(" 'file%d.dat' lt %d %s ", i, i, (i == n) ? "" : ", ")
}

结果

enter image description here