gnuplot for循环内的线性拟合

gnuplot for循环内的线性拟合,gnuplot,Gnuplot,我有一个脚本,可以正确地绘制100个单独的数据文件。现在我想做一个线性规划 在for循环中拟合每个曲线图。但是,当我的脚本到达带有消息“跳过不可读文件”f(x)=a100*x+b%d的fit命令时,它会崩溃。有人可以帮助我了解正确的语法吗?谢谢 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 '

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

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

fit
不支持迭代。以下是您可以实现的方法,但它需要一些修改;)

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

文件
file1.dat

1 1
2 2.1
3 3
1 1.5
2 2.7
3 4
file2.dat

1 1
2 2.1
3 3
1 1.5
2 2.7
3 4
4.6.5的结果是:

要在键中显示拟合的实际结果,必须按如下方式构造打印字符串
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) ? "" : ", ")
}
结果


这对我来说非常合适(也使用4.6.5版)。我只需更改文件名——这正是我要查找的文件名——非常感谢!我可以再问一个问题吗?如何更改绘图字符串,以便绘制整个拟合函数f1(x)=a1*x+b1,而不仅仅是f1(x)?如果我将当前表达式扩展为“f%d”(x) =a%d*x+b%d“我收到错误消息“f_sprintf:尝试以数字格式打印字符串值”
f1(x)
是绘制的整个拟合函数。或者您希望将
f1(x)=a1*x+b1
放在图例中(甚至可能用实际数字替换
a1
b1
)?抱歉不准确:(是的,我的意思是如何在图例中打印整个拟合函数(实际数字为a1和b1)?我仍在学习语法规则…您的评论不完整。请注意,
do for…{plot…
plot for…
不同,请参阅示例。