椭圆的一般方程可以表示为:
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
参数拟合,即假定已知了很多组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。绘制出来的拟合结果如下图:
计算出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+B2?2?(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+B2?2?(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;