私があなたの質問を正しく理解していれば、これがあなたが求めているものだと思います:
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
その他の最適化オプションについては、ドキュメントを参照してください。