坐标簇与沿单位矢量i的点之间的最小距离

时间:2014-12-19 20:20:35

标签: python numpy scipy

我有一组3D坐标Q聚集成一个关于原点O,单位矢量i和长度d的粗球。设p = c * i,其中c是正实数。设M表示Q与Q之间的每个q之间的距离集。我需要一种稳健的方法来计算c的最小值,受M的最小阀门大于d的约束。有没有一种优雅的方式在python中使用scipy / numpy来做到这一点?我怀疑scipy.spatial.KDTree会很有用,但我不清楚如何有效地找到我的约束最小值。

1 个答案:

答案 0 :(得分:1)

您可以像这样解决问题:

对于Q中的q点,定义:

C(q) = set of values of c >= 0 s.t. |q - c*i| >= d

然后定义

C = intersection { q in Q } C(q)

然后所需的值c为:

c = inf C = minimum element of C

集合C(q)只是二次不等式的解决方案,因此也是如此 有一种形式:

1) C(q) = [0, +infinity)
2) C(q) = [0, b] union [ e, +infinity )  (for some e > b)
3) C(q) = [e, +infinity )

您可以安全地丢弃第一张表格的集合。

如果所有剩余的C(q)集具有形式#2,则c = 0。

如果相反,他们都有#3的形式,c是:

c = maximum { q in Q } e(q)

否则事情变得更复杂。

对于给定的q,要计算C(q),请注意:

|q - c*i| >= d
  <=> (q - c*i)^2 >= d*d
  <=> (q - c*i).(q - c*i) >= d*d
  <=> q.q + c*c - 2*c*(q.i) >= d*d
  <=> c*c - c*2*(q.i) + q.q - d*d >= 0

如果该二次方程的判别式<1。 0,然后C(q)= [0,+无穷大。)

否则让b和e成为根,b&lt; = e,并检查这些情况:

e < 0    -->  C(q) = [0, +infinity)
b < 0    -->  C(q) = [e, +infinity)
b >= 0   -->  C(q) = [0, b]  union [e, +infinity)

2-d中的一个例子,它展示了更复杂的情况:

Q = { q1, q2, q3, q4 }
  = { (1,0), (0,1), (4,4), (0,10) }
i = (1/sqrt 5, 2/sqrt 5)
d = 2

C(q1) = [ 2.236, +infinity )
C(q2) = [ 2.843, +infinity )
C(q3) = [ 0, 4.472 ] union [ 6.261, +infinity )
C(q4) = [ 0, +infinity )

C(q1),C(q2)和C(q3)交点的最小元素是2.843。