matlab笔记-椭圆方程的参数拟合及长短轴和面积计算
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;
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!