0

最近、Mathematica を使ってデータをいじっています。静的受信機からの4つ以上の距離測定値からx、y座標を計算する方法があります(x、y座標も)。

私が持っているデータでこれを最も効果的に行うために使用する関数は、mathematica 関数です。

NonlinearModelFit[data, Norm[{x, y} - {x0, y0}], {x0, y0}, {x, y},
                  Weights -> 1/distances, Method->"LevenbergMarquardt"]

どこ...

data = {{548189.217202, 5912779.96059, 93}, {548236.967784, 5912717.80716, 39},
        {548359.406452, 5912752.54022, 88}, {548358.636206, 5912690.89573, 97}};


distances = {93, 39, 88, 97};

x0, y0 は見つけた解です

上記に対する mathematica の出力は次のとおりです。

FittedModel[{"Nonlinear", {x0 -> 548272.0043962265,
                           y0 -> 5.912735710367113*^6},
            {{x, y}, Sqrt[Abs[x - x0]^2 + Abs[y - y0]^2]}},
            {{1/93, 1/39, 1/88, 1/97}}, {{548189.217202, 5.91277996059*^6, 93},
            {548236.967784, 5.91271780716*^6, 39},
            {548359.406452, 5.91275254022*^6, 88},
            {548358.636206, 5.91269089573*^6, 97}},
            Function[Null, Internal`LocalizedBlock[{x, x0, y, y0}, #1], {HoldAll}]]

x0, y0私の解決策です。

したがって、曲線をフィッティングするのではなく、ポイントにフィッティングします(重みは距離に反比例します)。私はグーグルで見回しましたが、重み付け機能を導入するためにscipy関数scipy.optimize.leastsqアルゴリズムからどこから始めればよいかわかりません...

では、mathematica でできるのに、なぜ私はこれを行っているのでしょうか? Python コードから mathematicascript (サブプロセス モジュールを使用) を呼び出すのは、私がライブ データでやりたいことに対して遅すぎるので、速度を改善できるかどうかを確認するために Python で書き直してみたいと思います。

4

1 に答える 1

1

数学における同等のアプローチ(まったく同じx0、y0を与える)、おそらくこれはpythonへの移植について考えるのが簡単です。

FindMinimum[ 
       Total @ ((1/#[[3]]) (Norm[#[[1 ;; 2]] - {x0, y0}] - #[[3]])^2  & /@ 
               data) , {x0, y0}]

重み(1 /#[[3]])をエラー基準に明示的に入れていることに注意してください。

同じことをもう少し読みやすく..

  err[{x_, y_, z_}] := (1/z) (Norm[{x, y} - {x0, y0}] - z)^2
  FindMinimum[ Total @ (err  /@ data) , {x0, y0}]
于 2013-03-11T17:53:31.470 に答える