Gnuplot(椭圆拟合)

时间:2017-03-20 02:29:59

标签: gnuplot ellipse

我试图使用gnuplot来拟合椭圆。

然而,当我定义我的等式时

f(x,y) = a*x*x + b*x*y + c*y*y + d*x + e*y + f

然后继续命令图:

plot f(x,y) lw 3 lc rgb 'black', 'text.dat' w l lc rgb 'black'

我得到undefined variable: y。我该如何解决? text.dat有3列:x,y和z坐标。

1 个答案:

答案 0 :(得分:1)

为了说明问题,我们假设要拟合的数据点存储在文件pnts.dat(x,y坐标)中:

-2.000000   -0.005494
-1.789474   -0.410310
-1.578947   -0.616013
-1.368421   0.760577
-1.157895   0.695609
-0.947368   0.921957
-0.736842   -0.882355
-0.526316   -1.031450
-0.315789   -0.910362
-0.105263   -0.986339
0.105263    -0.897862
0.315789    -1.059766
0.526316    -1.007012
0.736842    0.910494
0.947368    -0.878432
1.157895    0.823232
1.368421    0.831900
1.578947    -0.662069
1.789474    0.427903
2.000000    -0.001474

现在,目标是在等式a*x*x + b*x*y + c*y*y + d*x + e*y + f = 0中找到参数的最佳值。但是,如果在拟合过程中直接使用该等式,则结果很可能是所有参数都等于零,因为它自动满足x,y的任何值。如果一个人对非退化椭圆感兴趣,它必须保持b*b-4*a*c<0。因此,参数a不能为零,因此可以强加条件a=1

至于拟合本身,下面的脚本分几步进行:

  1. 使用指定剩余参数fit
  2. b,c,d,e,f命令执行拟合
  3. 然后生成隐式函数f(x,y(x))=0的图,它使用&#34;技巧&#34;使用splot获取与值0对应的轮廓。计算出的点通过contour.dat命令存储到文件set table
  4. 然后将该轮廓与原始点一起绘制
  5. 总计:

    f(x, y) = x*x + b*x*y + c*y*y + d*x + e*y + f
    fit f(x, y) 'pnts.dat' u 1:2:(0) via b,c,d,e,f
    
    set contour
    set view map
    unset surface
    set cntrparam levels discrete 0
    set isosamples 1000,1000
    
    set table 'contour.dat'
    splot f(x, y)
    
    unset table
    unset contour
    
    set terminal pngcairo enhanced
    set output 'fig.png'
    
    set xr [-3:3]
    set yr [-3:3]
    set size square
    
    plot \
        'contour.dat' u 1:2 w l lw 2 lc rgb 'red', \
        'pnts.dat' u 1:2 w p ps 1.5 lc rgb 'black'
    

    然后产生: enter image description here