数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 2501|回复: 0

求助!如何用MAPLE求解对离散点的最优椭圆拟合

[复制链接]
发表于 2005-4-24 22:27:34 | 显示全部楼层 |阅读模式
<RE><FONT size=3><FONT face=宋体>如何用MAPLE求解对离散点的最优椭圆拟合?</FONT></FONT></PRE><RE><FONT face=宋体 size=3>请各位大侠告知!</FONT></PRE><RE><FONT face=宋体 size=3>这里有一个MATLAB的来自</FONT></PRE><PRE><FONT face=宋体 size=3><a href="http://bbs.dartmouth.edu/~fangq/wiki/index.cgi?MathTools_FAQ" target="_blank" >http://bbs.dartmouth.edu/~fangq/wiki/index.cgi?MathTools_FAQ</A></FONT></PRE><PRE><FONT size=3><FONT face=宋体>function a = fitellipse(X,Y)<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% FITELLIPSE  Least-squares fit of ellipse to 2D points.<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>%        A = FITELLIPSE(X,Y) returns the parameters of the best-fit<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>%        ellipse to 2D points (X,Y).<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>%        The returned vector A contains the center, radii, and orientation<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>%        of the ellipse, stored as (Cx, Cy, Rx, Ry, theta_radians)<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>%<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>% Authors: Andrew Fitzgibbon, Maurizio Pilu, Bob Fisher<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>% Reference: "Direct Least Squares Fitting of Ellipses", IEEE T-PAMI, 1999<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>%<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>% This is a more bulletproof version than that in the paper, incorporating<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>% scaling to reduce roundoff error, correction of behaviour when the input<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>% data are on a perfect hyperbola, and returns the geometric parameters<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>% of the ellipse, rather than the coefficients of the quadratic form.<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>%<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>%  Example:  Run fitellipse without any arguments to get a demo<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>if nargin == 0<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  % Create an ellipse<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  t = linspace(0,2);<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>  Rx = 300<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  Ry = 200<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  Cx = 250<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  Cy = 150<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  Rotation = .4 % Radians<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>  x = Rx * cos(t);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  y = Ry * sin(t);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  nx = x*cos(Rotation)-y*sin(Rotation) + Cx;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  ny = x*sin(Rotation)+y*cos(Rotation) + Cy;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  % Draw it<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  plot(nx,ny,'o');<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  % Fit it<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  fitellipse(nx,ny)<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  % Note it returns (Rotation - pi/2) and swapped radii, this is fine.<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  return<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>end<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% normalize data<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>mx = mean(X);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>my = mean(Y);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>sx = (max(X)-min(X))/2;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>sy = (max(Y)-min(Y))/2;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>x = (X-mx)/sx;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>y = (Y-my)/sy;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% Force to column vectors<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>x = x(;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>y = y(;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% Build design matrix<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>D = [ x.*x  x.*y  y.*y  x  y  ones(size(x)) ];<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% Build scatter matrix<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>S = D'*D;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% Build 6x6 constraint matrix<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>C(6,6) = 0; C(1,3) = -2; C(2,2) = 1; C(3,1) = -2;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% Solve eigensystem<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>[gevec, geval] = eig(S,C);<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% Find the negative eigenvalue<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>I = find(real(diag(geval)) &lt; 1e-8 &amp; ~isinf(diag(geval)));<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% Extract eigenvector corresponding to negative eigenvalue<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>A = real(gevec(:,I));<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% unnormalize<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>par = [<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>  A(1)*sy*sy,   ...<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>      A(2)*sx*sy,   ...<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>      A(3)*sx*sx,   ...<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>      -2*A(1)*sy*sy*mx - A(2)*sx*sy*my + A(4)*sx*sy*sy,   ...<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>      -A(2)*sx*sy*mx - 2*A(3)*sx*sx*my + A(5)*sx*sx*sy,   ...<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>      A(1)*sy*sy*mx*mx + A(2)*sx*sy*mx*my + A(3)*sx*sx*my*my   ...<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>      - A(4)*sx*sy*sy*mx - A(5)*sx*sx*sy*my   ...<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>      + A(6)*sx*sx*sy*sy   ...<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>      ]';<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% Convert to geometric radii, and centers<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>thetarad = 0.5*atan2(par(2),par(1) - par(3));<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>cost = cos(thetarad);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>sint = sin(thetarad);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>sin_squared = sint.*sint;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>cos_squared = cost.*cost;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>cos_sin = sint .* cost;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>Ao = par(6);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>Au =   par(4) .* cost + par(5) .* sint;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>Av = - par(4) .* sint + par(5) .* cost;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>Auu = par(1) .* cos_squared + par(3) .* sin_squared + par(2) .* cos_sin;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>Avv = par(1) .* sin_squared + par(3) .* cos_squared - par(2) .* cos_sin;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>% ROTATED = [Ao Au Av Auu Avv]<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>tuCentre = - Au./(2.*Auu);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>tvCentre = - Av./(2.*Avv);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>wCentre = Ao - Auu.*tuCentre.*tuCentre - Avv.*tvCentre.*tvCentre;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>uCentre = tuCentre .* cost - tvCentre .* sint;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>vCentre = tuCentre .* sint + tvCentre .* cost;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>Ru = -wCentre./Auu;<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>Rv = -wCentre./Avv;<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>Ru = sqrt(abs(Ru)).*sign(Ru);<p></p></FONT></FONT></PRE><PRE><FONT size=3><FONT face=宋体>Rv = sqrt(abs(Rv)).*sign(Rv);<p></p></FONT></FONT></PRE><PRE><p><FONT face=宋体 size=3> </FONT></p></PRE><PRE><FONT size=3><FONT face=宋体>a = [uCentre, vCentre, Ru, Rv, thetarad];<p></p></FONT></FONT></PRE>
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 18:39 , Processed in 0.052835 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表