我有一些非线性优化问题(最好在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 ,如何解决问题?即圆的真实半径在区间r-u ... r + u。
如何找到包含半径不确定性的最佳点(x / y)?
答案 0 :(得分:1)
鉴于此处的解释,这实际上并不那么难: http://mathworld.wolfram.com/Circle-CircleIntersection.html
建议的算法:
两者都应使用任意2个圆圈完成。
另一个建议...... 我再读一遍你的问题,并意识到你不想找到 这一点......
但是,如果在纸张上绘制所有9个圆圈(3个相交,加上2个越来越大的r + e和r-e,其中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()
答案 1 :(得分:0)
我试试这种方式。对于给定点p,我计算从该点到三个圆中的每一个的距离。这可以通过获取(1)圆与圆的原点之间的距离和(2)圆的半径之间的差的绝对值来完成。然后你的目标函数是最小化三个距离的总和(p到circleA,p到圆圈B,p到圆圈C)。我尝试算术和,但可能有一些很好的理由进行不同的聚合(ensamble平均数学类型)。然后,您使用非线性包来最小化目标函数(即三个距离的总和)。
现在你的每个圈都有重量。因此,您修改目标函数以通过每个圆的不确定性来折扣距离。同样,你需要一些逻辑来完成这种称重......朴素的方法是使用"加权平均值",即将1 / sigma ^ 2作为每个距离的权重。所以你的目标函数变成了
(weighted average distance)
= ( distA * sigmaA^-2 + distB * sigmaB^-2 + distC * sigmaC^-2 )
/ ( sigmaA^-2 + sigmaB^-2 + sigmaC^-2)
其中distX是从点到圆的距离,sigmaA是圆的位置的标准偏差(由于cicle位置和大小的不确定性),^-2
表示正方形然后除。
使用nonlin包来最小化上述obj。通过改变点的x和y来起作用。