三辺測量の目的で、非線形最小二乗フィッティング LMFIT を実行しようとしています。
- LMFIT
- ビーコンにはビーコン位置 x、y、z が含まれます
Parameters()
Xinit
推定する場所を 含めます。tag_distances[i]
測定値を含める (タグから までの距離beacon[i]
)
次のエラーが表示されます。
Raise TypeError('不適切な入力: N=%s は M=%s を超えてはなりません' % (n, m)) TypeError: 不適切な入力: N=3 は M=1 を超えてはなりません
import numpy as np
from math import pow
from lmfit import minimize, Parameters
beacons=np.array([[0.,0.,5.],
[0.,15.,5.],
[15.,0.,5.],
[15.,15.,5.]])
tag=np.array([0,15,0])
tag_distances=np.arange(float(beacons.shape[0]))
xinit=np.array([5.,5.,2.])
def distance (p1, p2):
s=0
for i in range (0,3):
s+=(p1[i]-p2[i])**2
return s**.5
for i in range (0,beacons.shape[0]):
tag_distances[i]=distance(beacons[i,:],tag)
tag_distances= tag_distances.reshape(beacons.shape[0], 1)
def residual(params, measures , beacons, eps_data):
x=np.array([ params['x'].value,
params['y'].value,
params['z'].value])
s=0
for i in range (0,beacons.shape[0]):
s+=(measures[i,0]-distance(beacons[i,:],x))**2
return s
params = Parameters()
params.add('x', value=xinit[0])
params.add('y', value=xinit[1])
params.add('z', value=xinit[2])
eps_data=np.array([1.0,1.0,1.0,1.0])
out = minimize(residual, params, args=(tag_distances, beacons, eps_data))