求解具有最小误差的非线性方程组

时间:2011-11-03 14:17:19

标签: python optimization scipy nonlinear-optimization

我有一些非线性优化问题(最好在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)?

2 个答案:

答案 0 :(得分:1)

鉴于此处的解释,这实际上并不那么难: http://mathworld.wolfram.com/Circle-CircleIntersection.html

建议的算法:

  1. 查找x - 如链接中所述。
  2. 计算y。
  3. 两者都应使用任意2个圆圈完成。

    1. 将点(x,y)和(x,-y)插入3圈。
    2. 解决方案是所有三个圆相交: X,Y X,-y 或者根本没有。
    3. 另一个建议...... 我再读一遍你的问题,并意识到你不想找到 这一点......

      但是,如果在纸张上绘制所有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来起作用。