在gnuplot中拟合和绘制序列

在gnuplot中拟合和绘制序列,plot,gnuplot,Plot,Gnuplot,这与此类似,但我的问题是,我有数百个文件需要同时拟合并绘制在一个图形上。与发布的其他问题不同,我正在寻找每个文件的最佳匹配,而不是全局数据集,因此cat不起作用 我希望使用fit。。对于,就像我对绘图所做的那样,但效果不太好。以下是到目前为止我得到的信息: f(x) = 1+d*exp(-(x-f)**2/(2*(g**2)))+a*exp((-(x-b)**2)/(2*(c**2))) filename(n) = sprintf("rheosaxs_saxs_%005d_0001_var_r

这与此类似,但我的问题是,我有数百个文件需要同时拟合并绘制在一个图形上。与发布的其他问题不同,我正在寻找每个文件的最佳匹配,而不是全局数据集,因此
cat
不起作用

我希望使用
fit。。对于
,就像我对
绘图所做的那样,但效果不太好。以下是到目前为止我得到的信息:

f(x) = 1+d*exp(-(x-f)**2/(2*(g**2)))+a*exp((-(x-b)**2)/(2*(c**2)))

filename(n) = sprintf("rheosaxs_saxs_%005d_0001_var_rebin_div.dat", n)
fit f(x) for [n=575:584] filename(n) u 1:2 via a,b,c,d,f,g
plot for [n=575:584] filename(n) using 1:2, f(x)
我得到的错误是:
第60行:未定义变量:for
对应于[n=a:b]的拟合f(x)

我知道我的起始参数是合理的,因为我可以在没有fit命令的情况下绘制它们,而且它们看起来很合理。类似地,的
绘图工作正常


有什么想法吗?谢谢:)

在5.2版gnuplot中引入了数组,它允许您保存每次拟合的结果,并在以后绘制这些结果

一个简化的示例脚本是

file(n) = sprintf('myfile_%d.dat', n)
f(a, x) = a*x

array A[10]
do for [i=1:10] {
    tmpA = 1
    fit f(tmpA, x) file(i) via tmpA
    A[i] = tmpA
}

plot for [i=1:10] file(i),\
     for [i=1:10] f(A[i], x)
虽然gnuplots数组是作为用户变量的链表实现的,但是不可能直接使用
A[i]
来进行匹配,但是我必须使用临时变量才能正确地使用它

一个完整的工作示例,包括使用gnuplot中的python生成随机数据,uargh;):


顺便说一句:没有
适合
,因为这相当于
适合{fit}
。但在绘图时,
plot for
生成具有多个功能的单个绘图,而
do for{plot}
生成多个绘图,如果
适合,则应与
multiplot

一起使用。。。因为
可以工作,所以您将始终覆盖上一次迭代的估计拟合参数。我在年发布了这样一个szenario的可能解决方案,不确定现在是否有更好的方法使用array,这是5.2版中引入的。我认为这不会起作用,因为gnuplot中对
的定义与标准定义不同。您指的是什么,这不起作用?我链接到的答案是这样的。对于数组,我的意思是类似于
do for[I=1:10]{fit…via;array[I]=a;}
我以后在家里看,如果可以的话。啊,好的,我想我明白了:)我会试试
# generate some random data
system("python3 -c 'import random\nfor i in range(1, 11):\n\twith open(\"output_{0}.dat\".format(i), \"w\") as f:\n\t\tf.write(chr(10).join([str(i*100 + i* x * (1 + 0.1*(random.random()-0.5))) for x in range(0,100)]))'")


file(n) = sprintf('output_%d.dat', n)

f(a, b, x) = a*x + b
array A[10]
array B[10]
do for [i=1:10] {
    tmpA = 1
    tmpB = 1
    fit f(tmpA, tmpB, x) file(i) u 0:1 via tmpA, tmpB
    A[i] = tmpA
    B[i] = tmpB
}

plot for [i = 1:10] file(i) u 0:1 with points lt i notitle, \
     for [i=1:10] f(A[i], B[i], x) with lines lt i notitle