如何求解两个椭球面上的最近点对?
你提到的“过两中心直线求交点”的方法仅适用于两个椭球主轴方向完全平行的特殊场景,当椭球的缩放、旋转方向不一致时,最短距离的连线并不一定经过两个中心,因此该方法不具备普适性。
普适性的求解思路是将问题转化为带约束的最小化问题,具体步骤如下:
明确目标与约束
目标是最小化两点距离的平方(和距离最小等价,计算更简便):
$$\min (x_2-x_1)^2 + (y_2-y_1)^2 + (z_2-z_1)^2$$
约束条件为两点分别位于两个椭球面上,即满足各自的椭球方程:第一个椭球(中心$(d_1,e_1,f_1)$):
$A_1(x_1-d_1)^2 + B_1(y_1-e_1)^2 + C_1(z_1-f_1)^2 + D_1(x_1-d_1)(y_1-e_1) + E_1(x_1-d_1)(z_1-f_1) + F_1(y_1-e_1)(z_1-f_1) = 1$
第二个椭球(中心$(d_2,e_2,f_2)$):
$A_2(x_2-d_2)^2 + B_2(y_2-e_2)^2 + C_2(z_2-f_2)^2 + D_2(x_2-d_2)(y_2-e_2) + E_2(x_2-d_2)(z_2-f_2) + F_2(y_2-e_2)(z_2-f_2) = 1$用拉格朗日乘数法构建方程组
构造拉格朗日函数,将目标函数与约束条件结合:
$$L = (x_2-x_1)^2 + (y_2-y_1)^2 + (z_2-z_1)^2 - \lambda_1\left[A_1(x_1-d_1)^2 + B_1(y_1-e_1)^2 + \dots -1\right] - \lambda_2\left[A_2(x_2-d_2)^2 + B_2(y_2-e_2)^2 + \dots -1\right]$$
对变量$x_1,y_1,z_1,x_2,y_2,z_2,\lambda_1,\lambda_2$分别求偏导并令偏导数为0,得到一个非线性方程组。求解方程组
由于是非线性方程组,通常需要用数值迭代方法求解,比如牛顿-拉夫逊法,也可以借助Python的scipy.optimize库、Matlab的优化工具箱等工具来完成计算。
几何验证依据:最短距离的连线$P_1P_2$一定是两个椭球面在对应点处的公法线——即$P_1$处椭球的法向量与$P_2$处椭球的法向量平行,且方向与$P_1P_2$一致,可用于验证解的正确性。
内容的提问来源于stack exchange,提问作者Fezzan Mahmood

