1.椭圆一般方程:
椭圆的一般方程可以表示为:
A
∗
x
2
+
B
∗
x
∗
y
+
C
∗
y
2
+
D
∗
x
+
E
∗
y
+
F
=
0
A*x^2+B*x*y+C*y^2+D*x+E*y+F=0
A∗x2+B∗x∗y+C∗y2+D∗x+E∗y+F=0
其中,x,y分别是x轴坐标值,y轴坐标值两个变量;ABCDEF是常量系数;
一般为了便于计算,会化简成:
A
∗
x
2
+
B
∗
x
∗
y
+
C
∗
y
2
+
D
∗
x
+
E
∗
y
+
1
=
0
A*x^2+B*x*y+C*y^2+D*x+E*y+1=0
A∗x2+B∗x∗y+C∗y2+D∗x+E∗y+1=0
2. 参数拟合
参数拟合,即假定已知了很多组x,y的坐标数据,并发现数据的分布规律和椭圆类似,我们先假设有一个方程表达式为Ax2+Bxy+Cy2+Dx+Ey+1=0的椭圆,参数ABCDEF未知待求。那么就可以通过matlab自带的非线性拟合函数nlinfit,带入离散的xy数据,反向求出ABCDEF这6个系数的值,这样,你就得到了最可以符合数据分布的一个椭圆方程。
matlab代码如下:
clc;clear all;
%% 数据配置
x = [2.85, 2.56, 1.45, 0.06, -1.34, -2.28, -2.59, -2.22, -1.28, 0.03, 1.22, 2.22]';%x坐标数据
y = [0.00, 1.51, 2.42, 2.88, 2.36, 1.37, 0.06, -1.22, -2.14, -2.34, -2.14, -1.31]';%y坐标数据
xy = [x,y];
A0=0.005;B0=0.005;C0=0.005;D0=0.005;E0=0.005;F0=0.005;
p_init=[A0 B0 C0 D0 E0 F0];
%% 拟合求解
func=@(param,xy)param(1)*xy(:,1).^2+param(2)*xy(:,1).*xy(:,2)+param(3)*xy(:,2).^2+param(4)*xy(:,1)+param(5)*xy(:,2)+param(6);
param=nlinfit([x,y],zeros(size(x,1),1),func,p_init);
A=param(1)/param(6);
B=param(2)/param(6);
C=param(3)/param(6);
D=param(4)/param(6);
E=param(5)/param(6);
F=param(6)/param(6);
这里已经将拟合出来的椭圆方程系数并化简成标准形式,F=1。绘制出来的拟合结果如下图:

3. 长短轴和面积计算
计算出ABCDEF这6个系数的值后,椭圆的一般方程就确立了。即可以根据通用公式计算椭圆长短轴和面积。
对于一个ABCDEF这6个系数已知,并化简成标准形式的椭圆方程:
A
∗
x
2
+
B
∗
x
∗
y
+
C
∗
y
2
+
D
∗
x
+
C
∗
y
+
1
=
0
A*x^2+B*x*y+C*y^2+D*x+C*y+1=0
A∗x2+B∗x∗y+C∗y2+D∗x+C∗y+1=0
有:
中心坐标的公式为:
x
0
=
(
B
∗
E
−
2
∗
C
∗
D
)
/
(
4
∗
A
∗
C
−
B
2
)
;
x0 = (B*E-2*C*D)/(4*A*C - B^2);
x0=(B∗E−2∗C∗D)/(4∗A∗C−B2);
y
0
=
(
B
∗
D
−
2
∗
A
∗
E
)
/
(
4
∗
A
∗
C
−
B
2
)
;
y0 = (B*D-2*A*E)/(4*A*C - B^2);
y0=(B∗D−2∗A∗E)/(4∗A∗C−B2);
长半轴的公式为:
a
=
2
∗
(
A
∗
x
0
2
+
C
∗
y
0
2
+
B
∗
x
0
∗
y
0
−
1
A
+
C
+
(
A
−
C
)
2
+
B
2
a=\sqrt{\frac{2*(A*x0^2+C*y0^2+B*x0*y0-1}{A+C+\sqrt{(A-C)^2+B^2}}}
a=A+C+(A−C)2+B22∗(A∗x02+C∗y02+B∗x0∗y0−1
短半轴的公式为:
b
=
2
∗
(
A
∗
x
0
2
+
C
∗
y
0
2
+
B
∗
x
0
∗
y
0
−
1
A
+
C
−
(
A
−
C
)
2
+
B
2
b=\sqrt{\frac{2*(A*x0^2+C*y0^2+B*x0*y0-1}{A+C-\sqrt{(A-C)^2+B^2}}}
b=A+C−(A−C)2+B22∗(A∗x02+C∗y02+B∗x0∗y0−1
面积公式为:
s
=
π
∗
a
∗
b
s=π*a*b
s=π∗a∗b
matlab代码如下:
%根据公式求椭圆中心
x0 = (B*E-2*C*D)/(4*A*C - B^2);
y0 = (B*D-2*A*E)/(4*A*C - B^2);
%%根据公式求椭圆长半轴
a= sqrt(2*(A*(x0^2)+C*(y0^2)+B*x0*y0-1)/(A+C+sqrt(((A-C)^2+B^2))));
%%根据公式求椭圆短半轴
b= sqrt(2*(A*(x0^2)+C*(y0^2)+B*x0*y0-1)/(A+C-sqrt(((A-C)^2+B^2))));
%面积s=π*a*b
s = pi*a*b;
完整代码
本文介绍了如何使用MATLAB的nlinfit函数对给定的x,y坐标数据进行椭圆参数拟合,得出标准形式的方程,并进一步计算椭圆的中心、长轴、短轴和面积。
2431





