0%

点集的最小外包围椭圆02

问题解答

给定点集 \(\mathcal{P}=\{P_1,P_2,\cdots,P_n\}\) ,求包围该点集的最小椭圆 \(\mathcal{E}\)

椭圆大小

给定椭圆的半轴 \(a\)\(b\) ,如何定义椭圆的大小?

  • 面积:\(\mathrm{Area}(\mathcal{E})=\pi ab\)
  • 周长:\(\mathrm{Perimeter}(\mathcal{E})=\int_0^{2\pi} \sqrt{(a\sin t)^2+(b\cos t)^2}~\mathrm{d}t\)

对于周长 \(\mathrm{Perimeter}(\mathcal{E})\) 没有一个简单的初等函数表达形式,故采用面积 \(\mathrm{Area}(\mathcal{E})\) 来定义椭圆大小。

问题建模

数学抽象

将二次曲线形式的椭圆方程 \[ Ax^2+Bxy+Cy^2+Dx+Ey+F=0 \] 变换为中心形式,即 \[ A(x-x_0)^2+B(x-x_0)(y-y_0)+C(y-y_0)^2=f \] 其中 \[ x_0=\frac{2CD-BE}{B^2-4AC}\qquad y_0=\frac{2AE-BD}{B^2-4AC} \]

\[ f=-F+Ax_0^2+Bx_0y_0+Cy_0^2 \]

将中心形式方程记为二次型,即 \[ \underbrace{\begin{bmatrix} x-x_0 \\ y-y_0 \end{bmatrix}^{\mathrm{T}}}_{\vec{\boldsymbol{x}}^{\mathrm{T}}}\cdot \underbrace{\begin{bmatrix} A/f&B/2f \\ B/2f&C/f \end{bmatrix}}_{M}\cdot\underbrace{\begin{bmatrix} x-x_0 \\ y-y_0 \end{bmatrix}}_{\vec{\boldsymbol{x}}}=1 \] 对于实对称矩阵 \(M\) ,存在正交矩阵 \(Q\) ,使得 \[ Q\cdot M \cdot Q^{\mathrm{T}}=\begin{bmatrix} \lambda_1&0 \\ 0&\lambda_2 \end{bmatrix} \]\(\det(Q)=1\) (逆时针旋转为正),则有 \[ a^2=1/\lambda_1 \qquad b^2=1/\lambda_2 \] 于是有 \[ \mathrm{Area}(\mathcal{E})=\pi ab=\pi\sqrt{\frac{1}{\lambda_1\lambda_2}}=\pi\sqrt{\frac{1}{\det(M)}} \] 即当 \(\det(M)\) 取最大值时,椭圆面积最小。

优化建模

中心形式方程中有六个未知数,可将其中的 \(f\) 作为归一化量,则设计变量为 \((A,B,C,x_0,y_0)\)

\(A(x-x_0)^2+B(x-x_0)(y-y_0)+C(y-y_0)^2=f\) ,可令 \(f\) 为常数

显然,矩阵 \(M\) 的两个特征值均需大于零,考虑到 \[ \lambda_1\lambda_2=\frac{4AC-B^2}{4f^2}\qquad \lambda_1+\lambda_2=\frac{A+C}{f} \] 于是有 \[ 4AC-B^2>0\qquad (A+C)f>0 \] 显然,\(A\)\(C\)\(f\) 同号。

考虑到点集 \(\mathcal{P}=\{P_1,P_2,\cdots,P_n\}\) 在椭圆 \(\mathcal{E}\) 内,则有 \[ A(x_i-x_0)^2+B(x_i-x_0)(y_i-y_0)+C(y_i-y_0)^2\le f \] 其中,\((x_i,y_i)\) 为第 \(i\) 个点的坐标。

综上,该优化问题为 \[ \begin{array}{l} \min.\quad f(A,B,C,x_0,y_0)=\left.\displaystyle\frac{4f^2}{4AC-B^2}\right|_{f=\mathrm{positive~constant}}\\[8pt] \mathrm{st}.\quad \left\{\begin{array}{l} 4AC-B^2>0 \\[5pt] A>0 \\[5pt] C>0 \\[5pt] A(x_i-x_0)^2+B(x_i-x_0)(y_i-y_0)+C(y_i-y_0)^2\le f\quad(i=1,2,\cdots,n) \end{array}\right. \end{array} \]

计算程序

计算步骤如下:

  1. 使用 MATLAB 内置函数convhull求给定点集 \(\mathcal{P}=\{P_1,P_2,\cdots,P_n\}\) 的凸包,并记为 \(\mathcal{P}'\)
  2. 按照优化思想,求凸包 \(\mathcal{P}'\) 的最小外包圆,并记其圆心为 \(P_0\) 、半径为 \(r_0\)
  3. 对优化问题 \(\min.f\) ,补充约束条件 \(\sqrt{4f^2/(4AC-B^2)} \le r_0^2\) ,即凸包 \(\mathcal{P}'\) 的最小外包椭圆面积不超过最小外包圆面积;
  4. \(P_0\)\(r_0\) 作为优化问题 \(\min.f\) 的初值,调用函数fmincon即可。

\(4AC-B^2>0\)\(\sqrt{4f^2/(4AC-B^2)} \le r_0^2\) 可得出 \(4AC-B^2 \ge 4f^2/r_0^4\)


MATLAB 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
clc;clear;close all;

% 测试数据1
num=300;
x=rands(num,1)*2+linspace(0.1,10,num)';
y=(rands(num,1).^2+log(linspace(0.1,10,num)')).*rands(1)*5;

% 测试数据2
% x=[223.733951757250;223.833697394539;223.922646689227;224.000880733819;224.068653128016;224.126560116489;224.175758538324;224.218011319415;224.255507049715;224.290675342302;224.325918591334;224.363330300223;224.404466422983;224.450246806729;224.500957932443;224.556301903270;224.615524985632;224.677605425843;224.741422264585;224.805988686164;224.870575758886;224.934764214239;224.998380690226;225.061302970145;225.123319187764;225.184191802578;225.243817794490;225.302337803345;225.360151644602;225.417790413442;225.475722830957;225.534133810977;225.592763498866;225.650850136415;225.707023708177;225.759312918096;225.805404309633;225.842980260142;225.869996170339;225.884908318228;225.886947516890;225.876285457031;225.854018753504;225.822035246754;225.782821832544;225.739089830514;225.693366113721;225.647709389771;225.603574628860;225.561705513734;225.522053111182;225.483911443817;225.446270952057;225.408209109314;225.369169027461;225.329118808556;225.288598511188;225.248680210334;225.210782721995;225.176329939259;225.146539635617;225.122471772716;225.105199250200;225.095934153070;225.096067492676;225.107113972238;225.130443716057;225.166890953114;225.216465475091;225.278273671757;225.350668760968;225.431453487920;225.517896617177;225.606815061359;225.694759078130;225.778159155728;225.853657752780;225.918602553822;225.971363271951;226.011414507445;226.039215868141;226.055901535522;226.063036419289;226.062544979761;226.056624371470;226.047441112180;226.036908177029;226.026633747980;226.017891953112;226.011584773485;226.008157919702;226.007514307594;226.009016391487;226.011711597181;226.014693060596;226.017420673647;226.019921200759;226.022680352064;226.026353630374;226.031642200878;226.039257260013;226.049736809320;226.063332528479;226.080044342181;226.099683758408;226.122004996791;226.146925201504;226.174710616286;226.205985989252;226.241557869553;226.282025878988;226.327438532043;226.377242317162;226.430345121498;226.485262494219;226.540401902539;226.594277719489;226.645628227577;226.693616615330;226.737807541775;226.778080810533;226.814649132657;226.848098778648;226.879309894412;226.909309796824;226.939184897437;226.969976400198;227.002679994746;227.038389691321;227.078362523234;227.123829188786;227.175794506171;227.234943923084;227.301484197341;227.375006842603;227.454474216806;227.538354507998;227.624772408166;227.711799127999;227.797821986571;227.881759489701;227.963241620317;228.042626107807;228.120722387549;228.198441377807;228.276455592957;228.354980045987;228.433675886679;228.511657716428;228.587727201068;228.660657519266;228.729289362715;228.792486292443;228.849147992902;228.898386595429;228.939774908702;228.973426618427;228.999861816890;229.019827828428;229.034145256230;229.043706952390;229.049646156479;229.053416189673;229.056750845093;229.061610040660;229.070190652075;229.084815640852;229.107643564561;229.140298281372;229.183513607371;229.236949820189;229.299254420218;229.368240381822;229.441184183142;229.515225130230;229.587820681930;229.656935247980;229.720925310027;229.778486226739;229.828786427130;229.871460766725;229.906430867921;229.933869552015;229.954237736006;229.968190174056;229.976429988024;229.979558088383;229.978027894463;229.972268000650;229.962772994561;229.950019070323;229.934353821778;229.915894485670;229.894504909283;229.869911452167;229.841845764500;229.810158875628;229.774992319968;229.736836303536;229.696449647228;229.654769210775;229.612857298103;229.571668517161;229.531663113146;229.492562239760;229.453423134291;229.412888999365;229.369411012489;229.321453947529;229.267699911206;229.207343853741;229.140361142994;229.067587824171;228.990491867326;228.910918730048;228.830814043544;228.751848934085;228.675131779455;228.601231834357;228.530386383324;228.462725196508;228.398289205354;228.336856740784;228.277833972044;228.220386048036;228.163747854214;228.107503988828;228.051725936565;227.997067476431;227.944711218602;227.896030857659;227.852093937700;227.813236162533;227.778909428099;227.747824041007;227.718185750697;227.687941644250;227.655132281530;227.618343178388;227.576940357431;227.531099558532;227.481680569457;227.430048321957;227.377801152558;227.326590043391;227.278088097508;227.233822485975;227.194928823853;227.162011989237;227.135044467314;227.113385417182;227.096019609365;227.081939634223;227.070430083512;227.061137724592;227.054043317376;227.049385761250;227.047556996408;227.048945774543;227.053633837800;227.061223906704;227.070985402491;227.082172170768;227.094193955669;227.106501193714;227.118319215879;227.128458470810;227.135257382120;227.136622999962;227.130171668375;227.113407860108;227.084078171916;227.040671881653;226.982675707136;226.910523342888;226.825443094448;226.729357384043;226.624793911211;226.514743888006;226.402461298158;226.291158484369;226.183777632105;226.082886361490;225.990595364466;225.908422104094;225.837113303390;225.776630802889;225.726277648946;225.684869139300;225.651014328905;225.623420448135;225.601193474491;225.583940518838;225.571580351099;225.564085948839;225.561288533707;225.562710030863;225.567498426293;225.574514601934;225.582467431579;225.590122966365;225.596594410301;225.601603978839;225.605606065942;225.609747340686;225.615705230363;225.625496821392;225.641236177881;225.664811797126;225.697712308718;225.740951772221;225.794982419428;225.859641138390;225.934182968855;226.017292185793;226.107124699310;226.201440408999;226.297852371059;226.394089133090;226.488173693553;226.578561697237;226.664200124716;226.744425869261;226.818882752056;226.887533596128;226.950706351811;227.009082884588;227.063700274818;227.116047166713;227.168118558718;227.222381103607;227.281669434780;227.348984535901;227.427047696040;227.517936199133;227.622919992535;227.742449152700;227.876283426094;228.023556366069;228.182810486380;228.352033167788;228.528734965340;228.710125555104;228.893339833403;229.075623936998;229.254503559596;229.427941263094;229.594489438819;229.753489557472;229.905242763539;230.050991645143;230.192722350278;230.332758399343;230.473209403382;230.615390176122;230.759505281311;230.904759975625;231.049794633994;231.193040303728;231.332842191959;231.467503581034;231.595435710618;231.715407310618;231.826653034394;231.928730519882;232.021274796909;232.103840851391;232.175789600995;232.236190553921;232.283968599539;232.318272384955;232.338735738386;232.345660197826;232.340005585847;232.323126934259;232.296400966296;232.261017142323;232.217904195576;232.167772572329;232.111216633142;232.048789406754;231.981076544546;231.908663394859;231.831968926939;231.751136727983;231.666093850211;231.576780183650;231.483421886108;231.386663773525;231.287541894097;231.187392334862;231.087736456938;230.990145824909;230.896088528141;230.806792674954;230.723216675763;230.646103021989;230.575991955534;230.513208247802;230.457867174616];
% y=[180.289972476265;180.196048742147;180.114716168600;180.044466597916;180.006363729235;180.031817484419;180.125947980568;180.264228370686;180.416872681925;180.577383440085;180.762058535872;180.976884095101;181.206312000315;181.429666519698;181.633218264244;181.805088461248;181.917839123211;181.948521244181;181.902935462524;181.809280615995;181.698184993815;181.577499887323;181.454734293544;181.341775930352;181.238485278407;181.135390806543;181.041317194308;181.001633357398;181.057126172561;181.204266006952;181.405210690630;181.617033883637;181.802169265020;181.947489571552;182.060564574977;182.155575500750;182.246510674000;182.335203945430;182.417141232252;182.498687549105;182.592511620757;182.704304691228;182.829660042803;182.967458057996;183.108321556881;183.225322425552;183.291324538000;183.293375248557;183.227088433275;183.108884257125;182.982145043986;182.889128720386;182.841948528203;182.820619023027;182.780858363398;182.675025525329;182.478978849246;182.204621471133;181.890026356829;181.572219362603;181.266677320809;180.973560553881;180.676892589488;180.347435496973;179.984798948364;179.623157293021;179.304030791561;179.056812057495;178.872383387039;178.710373688259;178.534909186992;178.329367716727;178.085793678957;177.817401892107;177.555284771341;177.326011473298;177.136718068777;176.983315000873;176.862709400993;176.770958669989;176.713296989531;176.701428664527;176.730326385211;176.766110221241;176.775373753847;176.756279354368;176.726443222924;176.707442918982;176.701754596945;176.685261177978;176.641209810908;176.588197019187;176.562908611991;176.593800864981;176.680017902426;176.787894904577;176.861820021953;176.859016771957;176.779886419473;176.668679870896;176.582498413615;176.550880385350;176.566940468033;176.609663021482;176.664105368119;176.740851960237;176.858238410749;177.012272378052;177.185118364549;177.354906434292;177.496720710654;177.582100850191;177.592055274358;177.528609070487;177.411828682268;177.269445810050;177.132543194869;177.029971556275;176.971861219269;176.940899505576;176.906125412001;176.855045749763;176.793313610037;176.715999117486;176.619131473749;176.514153005477;176.420669935444;176.374659468370;176.417513255830;176.571173510706;176.818495866668;177.117154674418;177.417661774084;177.681338508602;177.889416880404;178.028494741404;178.088588089335;178.068003658624;177.980672318779;177.852763757722;177.711329343884;177.587187522713;177.507113868030;177.476229646265;177.467825468310;177.445558045833;177.397096173508;177.361506411956;177.398367550213;177.535858633858;177.751995072910;177.990557734470;178.184860549441;178.309590556037;178.388271469373;178.448713607346;178.497091384492;178.521465726107;178.531808942208;178.563517023506;178.633454165941;178.715649714847;178.771796373782;178.777482998855;178.734522579575;178.664539344669;178.588947523339;178.522972202048;178.478387092782;178.445229143261;178.397103771833;178.308066097158;178.178272542621;178.044743547293;177.945905474730;177.880087796530;177.819710224495;177.742859223059;177.637169954420;177.518051690515;177.426180490204;177.388664833646;177.391399163537;177.397596385443;177.374754952853;177.310599487747;177.216663306695;177.117005524187;177.034029530484;176.979656029190;176.955586067052;176.960804482922;176.984280556233;176.995684329962;176.970500019430;176.902142700151;176.809392316904;176.716199703676;176.647998990209;176.628361783559;176.646179455922;176.643997465823;176.566433443344;176.417147416045;176.249163995164;176.114460007695;176.031697824242;175.997873154392;175.988909900962;175.969469607014;175.923277868258;175.844596596478;175.728363323825;175.599637567648;175.489242514426;175.416048735336;175.381214907169;175.370756989949;175.379142110819;175.408316159340;175.467989888729;175.573257827783;175.732069922745;175.926889750385;176.120531439873;176.284550908838;176.425412974882;176.574499693495;176.757822162899;176.978903586157;177.223818433790;177.467430593816;177.687742372733;177.866412080019;177.996913284291;178.087326720465;178.156821403363;178.241889668877;178.360606821834;178.474463867790;178.528820392076;178.505415858363;178.442288654457;178.414890271990;178.493313841187;178.689516517102;178.951167366023;179.203748771592;179.390329089739;179.484915142127;179.491840331014;179.433717833152;179.340124826610;179.254312828203;179.212942274302;179.210252213689;179.211358844566;179.190428662303;179.155829573481;179.133721925550;179.136809966746;179.153495782434;179.159397333397;179.136607242882;179.083324304631;179.024245482540;178.995891359340;179.013863671189;179.056484230680;179.087370930580;179.086224493187;179.056635331020;179.014033362466;178.968974241884;178.927367602767;178.894696021603;178.868614045041;178.831450398091;178.750040150321;178.601676203235;178.409314403855;178.240198679880;178.152970587316;178.149393028381;178.186422758724;178.218329864245;178.219549169349;178.190702115925;178.151299423732;178.111445640704;178.069492647051;178.024964225997;177.969548411878;177.890414875868;177.783450144686;177.651553302176;177.501459758012;177.358551056986;177.254462968358;177.187107576967;177.131361187863;177.072958814456;177.005624296614;176.928396058867;176.856133288486;176.802417289714;176.762423250781;176.717512003379;176.653592557103;176.586208464905;176.549161395599;176.559556811027;176.611767034099;176.692656403438;176.784653053205;176.860834727666;176.886088274379;176.839381750981;176.725692034611;176.576422165604;176.445385308093;176.371893720576;176.340405830777;176.300485937048;176.223185242108;176.123781088080;176.032726276575;175.958404237847;175.877835569349;175.772739373532;175.659820353178;175.580752233158;175.556058000790;175.574919194929;175.604950719178;175.612805119819;175.578376132032;175.502710050379;175.397554979516;175.254010413446;175.067176006944;174.862647928136;174.669568394029;174.501548918035;174.362229038517;174.243603503007;174.124196245564;173.978451920879;173.786404900040;173.559783720828;173.330391911988;173.118038587822;172.918983378373;172.713385684213;172.482566111024;172.232590402993;172.001871595166;171.823067337026;171.690062945107;171.568736078599;171.425980522500;171.248215437744;171.043607632452;170.835820447708;170.641914968891;170.459961173763;170.278504573848;170.096656901441;169.925401634431;169.768259226781;169.610909460862;169.449715432420;169.307487286433;169.210678068030;169.168300805093;169.172377745919;169.218399580258;169.295702901012;169.383889733577;169.460846703873;169.504268825835;169.489905382838;169.406702280679;169.275232006574;169.142605383731;169.044146817926;168.981890302176;168.933018655287;168.874984226944;168.809199639279;168.769593202301;168.781951914775;168.828340056933;168.872131268802;168.885985394425;168.854311290532;168.785059170979;168.713576183789;168.678384234613;168.695618691259];

% 求凸包
[k,av]=convhull(x,y);p=[x(k,:),y(k,:)];

% 最小外包圆
fun1=@(x) x(3);% fun=r^2, x=[xc,yc,r^2]
nonlcon1=@(x) mycon1(x,p);
out1=fmincon(fun1,[mean(p),av/pi],[],[],[],[],....
[-inf,-inf,0],[inf,inf,inf],nonlcon1);

pc1=out1(1:2);r1=sqrt(out1(3));theta=linspace(0,2*pi,200);
x1=pc1(1)+r1*cos(theta);
y1=pc1(2)+r1*sin(theta);

% 最小外包椭圆
f=10;% 归一化系数, 影响数值计算结果
fun2=@(x) 4*f^2/(4*x(1)*x(3)-x(2)^2);% x=[A,B,C,x0,y0]
nonlcon2=@(x) mycon2(x,p,f,r1);
Ast=zeros(5);Ast(1,1)=-1;Ast(3,3)=-1;bst=zeros(5,1);
out2=fmincon(fun2,[f/r1^2,0,f/r1^2,pc1],Ast,bst,[],[],....
[0,-inf,0,-inf,-inf],[inf,inf,inf,inf,inf],nonlcon2);

pc2=out2(4:5);
matA=[out2(1),out2(2)/2;out2(2)/2,out2(3)]/f;
[V,D]=eig(matA);
if V(1)*V(4) < 0
D=diag([D(4),D(1)]);
V=[V(:,2),V(:,1)];
end
a=sqrt(1/abs(D(1)));b=sqrt(1/abs(D(4)));
% phi21=acos(V(1));
% phi22=acot((out2(1)-out2(3))/out2(2))/2;
temp=pc2'+V*[a*cos(theta);b*sin(theta)];
x2=temp(1,:);
y2=temp(2,:);

% 绘图
figure(1);hold on;box on;axis equal;grid off;
plot(x1,y1,'--k','linewidth',1);
plot(x2,y2,'-k','linewidth',1)
plot(x,y,'ob','MarkerFaceColor',[0 0 1],'MarkerSize',3);

% 圆的非线性约束方程
function [c,ceq]=mycon1(x,k)
c=(k(:,1)-x(1)).^2+(k(:,2)-x(2)).^2-x(3);
ceq=[];
end

% 椭圆的非线性约束方程
function [c,ceq]=mycon2(x,k,f,r0)
c=[x(1)*(k(:,1)-x(4)).^2+x(2)*(k(:,1)-x(4)).*(k(:,2)-x(5))+x(3)*(k(:,2)-x(5)).^2-f;
% x(2)^2-4*x(1)*x(3);
4*f^2+(x(2)^2-4*x(1)*x(3))*r0^4];
ceq=[];
end