我试图使用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坐标。
答案 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
。
至于拟合本身,下面的脚本分几步进行:
fit
b,c,d,e,f
命令执行拟合
f(x,y(x))=0
的图,它使用&#34;技巧&#34;使用splot
获取与值0对应的轮廓。计算出的点通过contour.dat
命令存储到文件set table
。总计:
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'