半径の測定値は間違いなく多少の誤差を受けます。エラーの量は半径自体に比例すると予想されます。それ以外の場合は測定値にバイアスがないと仮定します。次に、合理的な解決策は、重みが非線形の最小二乗近似を使用し、重みは二乗半径に反比例します。
これは、(とりわけ)はPythonで利用可能な標準のものでR
、Mathematicaの私はちょうどそれを説明しますので、多くのフル機能の統計パッケージ。デバイスの場所を囲む5つのランダムアクセスポイントまでの距離を10%の相対誤差で測定することによって取得したデータを次に示します。
Mathematicaは1行のコードだけでフィットを計算するための測定可能なCPU時間を必要としません:
fit = NonlinearModelFit[data, Norm[{x, y} - {x0, y0}], {x0, y0}, {x, y}, Weights -> 1/observations^2]
編集-
半径が大きい場合、ユークリッド距離Norm[{x, y} - {x0, y0}]
を関数で置き換えるだけで、より正確な(球体または楕円体)解が得られ、球体または楕円体の距離を計算できます。Mathematicaこれを行うことができ、例えば、経由
fit = NonlinearModelFit[data, GeoDistance[{x, y}, {x0, y0}], {x0, y0}, {x, y},
Weights -> 1/observations^2]
-編集の終わり
このような統計的手法を使用する利点の1つは、パラメーター(デバイスの座標)の信頼区間と、デバイスの場所の同時信頼楕円を生成できることです。
ellipsoid = fit["ParameterConfidenceRegion", ConfidenceLevel -> 0.95];
fit["ParameterConfidenceIntervalTable", ConfidenceLevel -> 0.95]
データと解をプロットすることは有益です。
Graphics[{Opacity[0.2], EdgeForm[Opacity[0.75]], White, Disk[Most[#], Last[#]] & /@ data,
Opacity[1], Red, ellipsoid,
PointSize[0.0125], Blue, Point[source], Red, Point[solution],
PointSize[0.0083], White, Point @ points},
Background -> Black, ImageSize -> 600]
この場合の楕円の形状は興味深いものです。位置の不確実性はNW-SEラインに沿って最大になります。ここでは、3つのアクセスポイント(NEおよびSW)までの距離はほとんど変化せず、他の2つのアクセスポイント(北および南東)までの距離には誤差のトレードオフがあります。
(より正確な信頼領域は、いくつかのシステムで尤度関数の輪郭として取得できます。この楕円は、そのような輪郭の単なる2次近似です。)
半径をエラーなしで測定すると、すべての円に少なくとも1つの相互交点があり、その点が一意であれば、それが一意のソリューションになります。
この方法は、2つ以上のアクセスポイントで機能します。信頼区間を取得するには、3つ以上が必要です。2つしか使用できない場合、交差点の1つ(存在する場合)を見つけます。それ以外の場合は、2つのアクセスポイント間の適切な場所を選択します。