8

Python で次の連立方程式の最適解を見つけようとしています。

(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) と半径 (r) の値を指定すると、次のようになります。

x1, y1, r1 = (0, 0, 0.88)
x2, y2, r2 = (2, 0, 1)
x3, y3, r3 = (0, 2, 0.75)

点 (x,y) の最適解を見つける最善の方法は何ですか? 上記の例を使用すると、次のようになります:
~ (1, 1)

4

4 に答える 4

15

私があなたの質問を正しく理解していれば、これがあなたが求めているものだと思います:

from scipy.optimize import minimize
import numpy as np

def f(coord,x,y,r):
    return np.sum( ((coord[0] - x)**2) + ((coord[1] - y)**2) - (r**2) )

x = np.array([0,   2,  0])
y = np.array([0,   0,  2])
r = np.array([.88, 1, .75])

# initial (bad) guess at (x,y) values
initial_guess = np.array([100,100])

res = minimize(f,initial_guess,args = [x,y,r])

どちらが得られますか:

>>> print res.x
[ 0.66666666  0.66666666]

ベクトルを返す目的関数を期待する最小二乗法を試すこともできます。このベクトルの二乗和を最小化する必要があります。最小二乗法を使用すると、目的関数は次のようになります。

def f2(coord,args):
    x,y,r = args
    # notice that we're returning a vector of dimension 3
    return ((coord[0]-x)**2) + ((coord[1] - y)**2) - (r**2)

そして、あなたはそれを次のように最小化するでしょう:

from scipy.optimize import leastsq
res = leastsq(f2,initial_guess,args = [x,y,r])

どちらが得られますか:

>>> print res[0]
>>> [ 0.77961518  0.85811473]

これは基本的にminimize、元の目的関数を次のように使用して書き直すのと同じです。

def f(coord,x,y,r):
    vec = ((coord[0]-x)**2) + ((coord[1] - y)**2) - (r**2)
    # return the sum of the squares of the vector
    return np.sum(vec**2)

これにより、次のようになります。

>>> print res.x
>>> [ 0.77958326  0.8580965 ]

argsで処理される方法が少し異なりleastsq、2つの関数によって返されるデータ構造も異なることに注意してください。scipy.optimize.minimize詳細については、およびのドキュメントを参照しscipy.optimize.leastsqてください。

scipy.optimizeその他の最適化オプションについては、ドキュメントを参照してください。

于 2012-10-17T20:55:29.957 に答える
1

これらの方程式は、2D 空間の 3 つの円の円周上のすべての点を記述していると見なすことができます。解決策は、円が交差するポイントになります。

円の半径の合計は、中心間の距離よりも小さいため、円は重なりません。以下の縮尺で円をプロットしました。 幾何学的解

この連立方程式を満たす点はありません。

于 2012-10-17T21:30:04.147 に答える