我有一个数据文件'file.dat'。因为很短,我会说它包含以下数据
x y1(x) y2(x)
0 -41.2462 -41.1297
0.1 -42.6114 -39.7339
0.2 -43.7644 -38.2653
0.3 -45.0846 -36.8728
0.4 -46.2912 -35.4905
0.5 -47.3873 -34.1428
0.6 -48.3437 -32.8365
函数y1(x)和y2(x)应该是形式为二次的函数
y1(x) = a - b*x + c*x^2,
y2(x) = a + b*x + c*x^2.
两者之间的唯一区别是线性项b在第二个方程式中被反转(本质上它们是抛物线,并且是沿y轴的反射)。
我正在尝试进行多分支匹配。为了简化起见,变量a是一个已知常数,应该表示它们在x = 0处相交的点。由于一些小错误,它们不太匹配,因此我将a定义为
a = (y1(0) + y2(0))/2 = (-41.2462 - 41.1297)/2 = -41.1879.
所以我将gnuplot函数定义为
y1(x) = -41.1879 - b*x + c*x**2
y2(x) = -41.1879 + b*x + c*x**2
对于试身功能,我已经尝试
f(x,y) = (y==0) ? y1(x):y2(x)
fit f(x,y) 'file.dat' using 1:2:3 via b, c
这给了我
的值b = 14.8708
c = -1.57747
生成此plot of file.dat。
拟合的上分支看起来非常接近,但是下分支在x值较高时向下倾斜。我希望找到同时接近y1(x)和y2(x)的b和c值。我可以自己动手做,但是我要处理800个类似的文件,我希望以后可以使用c ++脚本自动执行此过程。
我认为我缺少一些重要的步骤,或者某个地方的语法有误。谁能帮忙吗?
答案 0 :(得分:0)
您必须重新格式化数据文件,以便每一行仅包含一个数据点。例如,如果您将其写为
# y1 dataset
0 -41.2462
0.1 -42.6114
0.2 -43.7644
0.3 -45.0846
0.4 -46.2912
0.5 -47.3873
0.6 -48.3437
# y2 dataset (separated by a single blank line)
0 -41.1297
0.1 -39.7339
0.2 -38.2653
0.3 -36.8728
0.4 -35.4905
0.5 -34.1428
0.6 -32.8365
然后您可以使用以下gnuplot脚本:
set key left
a = -41.1879
y1(x) = a - b*x + c*x**2
y2(x) = a + b*x + c*x**2
f(x,y) = (y == 0 ? y1(x) : y2(x))
fit f(x,y) "file.dat" u 1:-1:2 via b,c
plot y1(x), y2(x), "file.dat" u 1:2 w p
它使用伪列-1
在fit
命令中分隔两个数据集。