給定一個 N 維點的向量。向量的大小為 N 1。是否有一種通用演算法可以使用球體與這些點中的每一個相交的那些點來找到 ND 球體的中心和半徑?
uj5u.com熱心網友回復:
在數學 stackexchange 上也提出了同樣的問題,并得到了建設性的回答:
- 一組仿射跨越 R^n 的 n 1 個點是否位于唯一的 (n-1) 球面上?
這是該答案中描述的演算法在 python/numpy 中的實作。
import numpy as np
def find_sphere_through_points(points):
n_points, n_dim = points.shape
if (n_points != n_dim 1):
raise ValueError('Number of points must be equal to 1 dimension')
a = np.concatenate((points, np.ones((n_points, 1))), axis=1)
b = (points**2).sum(axis=1)
x = np.linalg.solve(a, b)
center = x[:-1] / 2
radius = x[-1] center@center
return center, radius
為了測驗這種方法,我們可以使用這個相關問題中描述的方法在球體表面上生成隨機點:
- 生成分布在單位球面上的點的隨機樣本
import numpy as np
def sample_spherical(npoints, ndim=3, center=None):
vec = np.random.randn(npoints, ndim)
vec /= np.linalg.norm(vec, axis=1).reshape(npoints,1)
if center is None:
return vec
else:
return vec center
n = 5
center = np.random.rand(n)
points = sample_spherical(n 1, ndim=n, center=center)
guessed_center, guessed_radius = find_sphere_through_points(points)
print('True center:\n ', center)
print('Calc center:\n ', guessed_center)
print('True radius:\n ', 1.0)
print('Calc radius:\n ', guessed_radius)
# True center:
# [0.18150032 0.94979547 0.07719378 0.26561175 0.37509931]
# Calc center:
# [0.18150032 0.94979547 0.07719378 0.26561175 0.37509931]
# True radius:
# 1.0
# Calc radius:
# 0.9999999999999997
uj5u.com熱心網友回復:
以三點為圓心,求(X, Y)其半徑R 為:
(X - X0)2 (Y - Y0)2 = R2
(X - X1)2 (Y - Y1)2 = R2
(X - X2)2 (Y - Y2)2 = R2
然后成對相減以消除R,
(2X - X0 - X1)(X1 - X0) (2Y - Y0 - Y1)(Y1 - Y0) = 0
(2X - X0 - X2)(X2 - X0) (2Y - Y0 - Y2)(Y2 - Y0) = 0
這是兩個未知數的兩個線性方程組,給出了中心的坐標(實際上我們構造了兩個平分線的交點)。半徑來自第一個等式。
這立即推廣到 D 維度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474837.html
上一篇:Delta算子在sympy
