matlab笔记-椭圆方程的参数拟合及长短轴和面积计算
y+1=0的椭圆,参数ABCDEF未知待求。那么就可以通过matlab自带的非线性拟合函数nlinfit,带入离散的xy数据,反向求出ABCDEF这6个系数的值,这样,你就得到了最可以符合数据分布的一个椭圆方程。参数拟合,即假定已知了很多组x,y的坐标数据,并发现数据的分布规律和椭圆类似,我们先假设有一个方程表达式为A。计算出ABCDEF这6个系数的值后,椭圆的一般方程就确立了。这里已经将拟合出来
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;
完整代码
更多推荐
所有评论(0)