Gnuplot多分支拟合

时间:2018-07-16 22:17:04

标签: gnuplot

我有一个数据文件'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 ++脚本自动执行此过程。

我认为我缺少一些重要的步骤,或者某个地方的语法有误。谁能帮忙吗?

1 个答案:

答案 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

它使用伪列-1fit命令中分隔两个数据集。

enter image description here