0

三辺測量の目的で、非線形最小二乗フィッティング 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))
4

1 に答える 1

1

最小二乗アルゴリズム (線形または非線形) を使用して関数をデータに適合させる場合、少なくともmモデル内のパラメーター ( ) と同じ数のデータ ポイント ( ) が曲線上に必要ですn。ポイントよりも多くのパラメーターがある場合、アルゴリズムは単一のソリューションに収束しません (実際、同じように優れたソリューションは無限に存在します)。

TypeError('Improper input: N=%s must not exceed M=%s' % (n, m))コードが現在実装されているため、nが よりも大きいため、scipy によってエラーが発生しますm

lmfitminimizeでは、関数residualが値の配列を返す必要があり、現在のところ、単一の float のみを返します。次のように編集residualして、残差の配列を返すことができます。

def residual(params, measures , beacons, eps_data):
    x=np.array([ params['x'].value,
                 params['y'].value,
                 params['z'].value])
    s= np.empty(beacons.shape[0])   # Make s an np.array beforehand
    for i in range (0,beacons.shape[0]): 
        s[i] =(measures[i,0]-distance(beacons[i,:],x))**2 # Store each residual
    return s 

out = minimize(residual, params, args=(tag_distances, beacons, eps_data))
# Print results
print out.params['x'].value
print out.params['y'].value
print out.params['z'].value

これでスクリプトは、 から返される残差を最小化するパラメーター x、y、z を返すという点で機能しますresidual

ただし、残差関数を使用すると、この残差関数を最小化するパラメーター x、y、z は常に に等しくなりtagます。したがって、これはあまり有用な最小化手順ではありません。実際に依存する別の残差関数を書くつもりだったと思いますeps_data

于 2016-11-11T02:42:23.607 に答える