matlab笔记-椭圆方程的参数拟合及长短轴和面积计算

发布时间:2023年12月25日

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+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;
文章来源:https://blog.csdn.net/chen_mp/article/details/135184611
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。