1

我有一些非线性优化问题(最好在 python 中解决):

给定的是 2D 平面中的 3 个圆(中心 x1..3,y1..3,半径 d1..3)。

(x-x1)^2 + (y-y1)^2 - r1^2 = 0
(x-x2)^2 + (y-y2)^2 - r2^2 = 0
(x-x3)^2 + (y-y3)^2 - r3^2 = 0

公共点 (x/y) 是需要的,在这种情况下可以通过 fsolve (scipy.optimize) 计算。但是,如果半径 r1..3 的不确定性分别为 u1..3 ,如何解决这个问题呢?即圆的真实半径在区间 ru ... r+u 内。

如何找到包含半径不确定性的最佳点 (x/y)?

4

2 回答 2

1

考虑到这里的描述,这实际上并不难:http: //mathworld.wolfram.com/Circle-CircleIntersection.html

一种建议的算法:

  1. 查找 x - 如链接中所述。
  2. 计算 y。

两者都应该使用任意 2 个圆圈来完成。

  1. 将点 (x,y) 和 (x,-y) 插入 3 圈中。
  2. 解决方案是所有三个圆在 x,y x,-y 处相交或根本不相交。

另一个建议...我再次阅读了您的问题,并意识到您并不想自己找到重点...

然而,如果你在一张纸上画出所有 9 个圆(3 个相交的圆,加上 r+e 和 re 的 2 个越来越大,其中 e 是错误的),你会注意到以下内容。您的交点位于多边形内。您可以轻松计算此多边形的顶点。然后你的问题就变成了:在多边形中找到一个点。或者您编写一个查找这些顶点的反对函数,然后最小化该区域。

要了解我对圆圈的含义,请运行:

# excuse me for the ugly code ...
import pylab
pylab.axes()

cir = pylab.Circle((1,0), radius=1, alpha =.2, fc='b')
cir1 = pylab.Circle((1,0), radius=0.9, alpha =.2, fc='b')
cir2 = pylab.Circle((1,0), radius=1.1, alpha =.2, fc='b')
cir3 = pylab.Circle((-1,0), radius=1, alpha =.2, fc='b')
cir4 = pylab.Circle((-1,0), radius=0.9, alpha =.2, fc='b')
cir5 = pylab.Circle((-1,0), radius=1.1, alpha =.2, fc='b')
cir6 = pylab.Circle((0,-1), radius=0.9, alpha =.2, fc='b')
cir7 = pylab.Circle((0,-1), radius=1.1, alpha =.2, fc='b')
cir8 = pylab.Circle((0,-1), radius=1, alpha =.2, fc='b')
pylab.gca().add_patch(cir)
pylab.gca().add_patch(cir1)
pylab.gca().add_patch(cir2)
pylab.gca().add_patch(cir3)
pylab.gca().add_patch(cir4)
pylab.gca().add_patch(cir5)
pylab.gca().add_patch(cir6)
pylab.gca().add_patch(cir7)
pylab.gca().add_patch(cir8)

pylab.axis('scaled')
pylab.show()
于 2011-11-15T18:55:07.460 回答
0

我会尝试这种方式。对于给定的点 p,我计算从该点到三个圆中的每一个的距离。这可以通过取(1)点与圆的原点之间的距离与(2)圆的半径之间的差的绝对值来完成。那么你的目标函数是最小化三个距离的总和(p到圆A,p到圆B,p到圆C)。我会尝试算术和,但可能有一些很好的理由来不同地聚合(集合平均数学类型)。然后你使用非线性包来最小化目标函数(即三个距离的总和)。

现在你有每个圆圈的重量。因此,您修改目标函数以通过每个圆的不确定性来折扣距离。同样,您需要一些逻辑是如何完成这种加权的......天真的方法是使用“加权平均”,即每个距离取 1/sigma^2 作为权重。所以你的目标函数变成

(weighted average distance) 
= ( distA * sigmaA^-2 + distB * sigmaB^-2 + distC * sigmaC^-2 ) 
   / ( sigmaA^-2 + sigmaB^-2 + sigmaC^-2) 

其中 distX 是点到圆的距离,sigmaA 是圆位置的标准偏差(由于圆的位置和大小的不确定性),^-2表示正方形然后除。

使用 nonlin 包最小化上述 obj。通过改变点的 x 和 y 来发挥作用。

于 2011-11-15T19:14:14.980 回答