求椭球上任意两点间的最短弧长用数学来推算解析解的话十分复杂,因此考虑通过使用计算机来近似求解。问题的难点在于怎样让每一步都是处在最优的状态,以及怎样使每一步的方向都尽量处在该点能够选择的最优方向上。
求椭球上两点的最短路,很容易想到用传统的最短路算法如迪杰斯特拉算法或弗洛伊德算法求解,但是在椭球将步长离散化后,构造以及运用邻接矩阵十分复杂,在保证一定精度的条件下需要极大的运算量,所以最短路算法暂时没有太好的应用条件。
另一种考虑过的思路为采用经典优化算法,如粒子群算法或者蚁群算法等进行迭代求解。这种方法理论上是可行的,但是由于构造出椭球面的离散化极坐标坐标点相当多,以及这类算法本身有较大的运算量以及结果的随机性,暂时不予以考虑。
还曾考虑过用梯度下降算法来求解,就是将椭球旋转至使目标点的法向量为沿z轴负方向时构造出此时的椭球的函数表达式,即可使用梯度下降算法。这种方法是最为理想的方法,但是椭球的旋转涉及到仿射变换,构造变换矩阵非常复杂,所以暂时不予考虑。
根据梯度下降算法,可以很自然的想到既然椭球不转那我们能不能直接利用目标点的外法向量作为一个基准方向来进行导向。由次我们就想出了基于法向矢量导向的椭球上最短路求解。
(1) 假设椭球上的网格足够小,运动点在椭球上的运动方向近似为椭球表面的切线方向
(2) 运动点到达距离终点的欧式距离小于一定范围时就视为到达终点
(3) 椭球上的运动点每次移动的欧式距离近似等于在表面移动时的弧长
(4) 椭球上的运动点的每次移动都会选择最优的方向
步骤 | 操作 |
---|---|
1 | 给定起点A和终点B的椭球极坐标,计算其直角坐标,并计算B的外法向量记为BW |
2 | 计算A点在二维极坐标中以A为中心的一定宽度方格内的点Mi的极坐标 |
3 | 计算所有Mi的直角坐标,并且计算出向量AMi,并将其全部化为单位向量 |
4 | 计算BW*AMi的值,并找出使该值最小的Mi点作为下一个A点,重复步骤1 |
A……………………………………………….代指椭球表面的运动点的当前位置
B………………………………………………………………………………….终点
AM i _{i} i……………………….椭球运动点在某次运动中可选择的单位方向向量集合
BW…………………………………………………椭球终点的垂直于表面的法向量
d i _{i} i ………………………………………………………每次运动点移动的欧式距离
ϵ \epsilon ϵ ………………………………………………………………………….终点判断值
D…………………………………………………………………………总路径的长度
当A要向B靠近时,求使AMi的单位方向向量与BW乘积最大的AMi作为从当前运动点指向下一个运动点的向量。对于共线的向量AMi的情况 ,取AMi长度较小的一方指向的点作为下一个A点,这样可以通过减小步长来适当降低误差。
注意注意,这里的A点周围的单位向量其实并不在一个平面内,因为我们找的是椭球上A相邻极坐标的点,所以只是椭球上从一个点出发到周围多个点的连线,我们只是用这些连线形成的向量来帮我们判断下一步的方向以及下一步所到的点。
1 给定起点和终点B的椭球极坐标,,A初始值设为起点坐标,计算其直角坐标,并计算B的外法向量记为BW
2 计算A点在二维极坐标中以A为中心的一定宽度方格内的点Mi的极坐标
3 计算所有Mi的直角坐标,并且计算出向量AMi,并将其全部化为单位向量
4 计算BW*AMi的值,并找出使该值最小的Mi点作为下一个A点
5 计算当前A点与B的欧式距离,若该距离小于 ϵ \epsilon ϵ ,则停止循环,输出D
6 计算下一个点A于当前点A之间的欧式距离d i _{i} i,D=D+d i _{i} i
椭球坐标转化为直角坐标函数:
function [x,y,z]=elip2cart(theta,alpha)
a=6000;
b=5000;
x=a.*sin(theta).*sin(alpha);
y=a.*cos(theta).*sin(alpha);
z=b.*cos(alpha);
end
主程序:
clear all
a=6000;
b=5000;
%x=[-2200 2900];
%y=[-3600 3300];
%z=b*sqrt(1-(x.*x+y.*y)/(a*a));
%comval=zeros(9,33);
pcs=600;%网格精度,不能超过3000,否则电脑会无法存储过多的网格坐标数据而崩溃
cho=8;%AMi的选择个数控制,选择个数为(2*cho+1)^2;设置的越高,曲线就越平滑,但是可能出现跨度比较大的点,必须为正整数,一般设为6以上
g=linspace(0,pi,pcs);h=linspace(0,2*pi,pcs*2);
thetaS=g(pcs*0.3);alphaS=h(pcs*1.3);
thetaP=g(pcs*1.0);alphaP=h(pcs*1.9);%给出S,T的极坐标
sphS=[thetaS,alphaS];%路径点集
tL=g(2)-g(1);aL=tL;
[theta,alpha]=meshgrid(g,h);
[x,y,z]=elip2cart(theta,alpha);%计算椭圆上所有点的直角坐标
[xs, ys ,zs]=elip2cart(thetaS,alphaS);
[xt ,yt ,zt]=elip2cart(thetaP,alphaP); %计算S, T的直角坐标
pw=[xt*2/a^2,yt*2/a^2,zt*2/b^2];%计算T点的外法向量
pw=pw/norm(pw);
num=2;
lasts1=0;lasts2=0;
k=0;%距离终点的欧式距离
while num<10000
%----------------------构造所有的AMi的选择向量的指向点-------------------------------
m=thetaS-cho*tL:tL:thetaS+cho*tL;
n=alphaS-cho*aL:aL:alphaS+cho*aL;%生成网格节点
[moveSt,moveSa]=meshgrid(m,n);
moveSt=reshape(moveSt,[1,(cho*2+1)^2]);
moveSa=reshape(moveSa,[1,(cho*2+1)^2]);
[xmove,ymove,zmove]=elip2cart(moveSt,moveSa);%通过自己写的elip2cart函数将极坐标转为直角坐标
%---------------------进行核心算法判断,来选择椭圆表面移动点的下一个位置
sm=zeros((cho*2+1)^2,3);
cval=zeros(1,(cho*2+1)^2);
for i=1:(cho*2+1)^2
sm(i,:)=[xmove(i)-xs,ymove(i)-ys,zmove(i)-zs]/norm([xmove(i)-xs,ymove(i)-ys,zmove(i)-zs]);
cval(i)=sm(i,:)*pw';%计算每个AMi与PW的乘积
end
nextp=find(cval==max(cval)); %按照设计好的算法来选出最大乘积的AMi
thetaS=moveSt(nextp(1));alphaS=moveSa(nextp(1));%移动,将选出的M点坐标作为下一个起点
[xs, ys ,zs]=elip2cart(thetaS,alphaS);
sphS=[sphS;thetaS,alphaS];
num=num+1;
k=sqrt((xs-xt)^2+(ys-yt)^2+(zs-zt)^2);%计算当前移动后的点与终点的距离,若小于20(也可以自己设)则判读其到达了目的地
if k<20
break
end
end
thetaS=g(pcs*0.3);alphaS=h(pcs*1.3);%这个地方必须要跟前面设置的起点坐标保持一致
[xs, ys ,zs]=elip2cart(thetaS,alphaS);
[xr,yr,zr]=elip2cart(sphS(:,1),sphS(:,2));
td=0;%总距离
for i=2:length(xr)
td=td+sqrt((xr(i)-xr(i-1))^2+((yr(i)-yr(i-1))^2+((zr(i)-zr(i-1))^2)));
end
%comval(cho-1,(pcs-300)/100)=td;
td
realval=17314.47799
mesh(x,y,z);
hold on
plot3(xs, ys ,zs,'r.','markersize',24,'color','blue')
plot3(xt ,yt ,zt,'r.','markersize',24,'color','blue')
plot3(xr,yr,zr,'r.','markersize',5)
%,1:length(comval),realval.*ones(1,length(comval))
可以从图中看出,基本上已经实现了椭球上最短距离的寻找。接下来选取两个特殊点进行结果的验证和分析。
选取椭球的最高点到最低点的作为起点和终点,根据现有的理论近似公式计算出理论近似值,将其与通过该方法计算出的值进行比较。
理论计算的公式为计算椭圆的周长公式,名为Ramanujan近似公式。
计算得到的理论值为17314.47799,如上图所示,我们通过该方法计算得到的值为1.7283*104,与真实值比较接近。误差的来源可能为每次计算的欧式距离总是小于实际上的弧长,也可能是理论计算公式的带来的近似误差。
当改变网格的精度时,会使结果与理论计算值之间的差异发生变化,计算得到的值近似收敛于某个定值。推测收敛到这个值可能即为最短距离的真实值。
当改变AMi的可选择方向数目时对结果的影响不大。
本次实验较好地实现了通过计算机求解椭球面上两点的最短距离,得出的结果与理论近似公式得出的结果非常接近,对于椭球上的任意两点能够比较灵敏地自动寻找轨迹。所运用的方法是根据现有的梯度下降法的思想,方法创新性较强。
对于两个影响指标进行了分析,得到了这两个指标对结果的影响,并且给出了可能的解释。对于其中一个影响指标的趋势给出了可能的猜测。
本实验较大的不足在于,主要的算法没有进行严格的数学证明,是仅凭主观意识得出的结论,虽然结果比较理想但是没有严格证明结果的可靠性和正确性。
核心算法有漏洞,可能会导致特殊情况下路径选择的偏离。具体为,当向量AMi的选择范围较大时,比如大于100个方向向量,其选择的方向可能导致前后两个运动点间的跨度过大,从而导致路径偏离和较大的误差。如图所示。