我有一些非线性优化问题(最好用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
公共(public)点 (x/y) 是所需的,在这种情况下可以通过 fsolve (scipy.optimize) 计算。 但是,如果半径 r1..3 的不确定性分别为 u1..3,如何解决这个问题呢? IE。圆的真实半径位于 r-u ... r+u 区间内。
如何找到包含半径不确定性的最佳点 (x/y)?
最佳答案
考虑到这里的描述,这实际上并不难: http://mathworld.wolfram.com/Circle-CircleIntersection.html
提出的算法:
- 找到 x - 如链接中所述。
- 计算 y。
两者都应该使用任意 2 个圆圈来完成。
- 将点 (x,y) 和 (x,-y) 插入第 3 个圆中。
- 解决方案是所有三个圆相交于: x,y x,-y 或者根本不。
另一个建议... 我再次阅读了你的问题,并意识到你不想找到 重点是它本身...
但是,如果您在纸上画出所有 9 个圆(3 个相交的圆,加上 r+e 和 r-e 的 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()
关于python - 以最小误差求解非线性方程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7996405/