n個のポイントの三辺測量アルゴリズム


27

円T1、T2、T3、T4、T5、..、Tnが交差し、重心から線Rの長さまでの図から重心A(別名、重心、幾何学的中心、重心)を計算できるアルゴリズムを見つける必要があります上記の図の最も遠い角

次の情報が提供されます。

  • T1緯度= 56.999883経度= 24.144473半径= 943
  • T2緯度= 57.005352経度= 24.151168半径= 857
  • T3緯度= 57.005352経度= 24.163356半径= 714
  • T4緯度= 56.999042経度= 24.168506半径= 714
  • T5緯度= 56.994226経度= 24.15709半径= 771

結果は次のようになります。A緯度= XX.XXXXXXX経度= XX.XXXXXXX半径= XX

ここに画像の説明を入力してください

おそらく既にわかっているように、アクセスポイントまたはベースステーションの数が変化する可能性があるため、最も近いWifiアクセスポイントまたはモバイルベースステーションによってデバイスの位置を見つけることができるソフトウェアに取り組んでいます。 。

ここここにいくつかの同様の質問ありますが、どれも私の質問に正確に答えません。


どの言語で働いていますか?
ウルフオドラデ

ほとんどがPHPで、JavaScriptが少し。私はこれについて前に言及しなければならなかったと思いますが、私はWeb開発者であり、Whuberの答えを理解するには数学者を見つけなければなりません。
カーリスバウマニス

半径は相対的な信号強度から派生していますか?
カーククイケンダル

はい!実は半径はdBmである
カルリス・バウマニス

1
@Reddox、一部-サーバーサイドで数学を使用してphp_exec()で計算することができました。
カーリスバウマニス14年

回答:


29

半径の測定値は間違いなく多少の誤差を受けます。エラーの量は半径自体に比例すると予想されます。それ以外の場合は測定値にバイアスがないと仮定します。次に、合理的な解決策は、重みが非線形の最小二乗近似を使用し、重みは二乗半径に反比例します。

これは、(とりわけ)はPythonで利用可能な標準のものでRMathematicaの私はちょうどそれを説明しますので、多くのフル機能の統計パッケージ。デバイスの場所を囲む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]

地図

  • 白い点は(既知の)アクセスポイントの場所です。

  • 大きな青い点は、実際のデバイスの場所です。

  • 灰色の円は、測定された半径を表します。理想的には、それらはすべて真のデバイスの位置で交差しますが、測定誤差のために明らかに交差しません。

  • 大きな赤い点は、デバイスの推定位置です。

  • 赤い楕円は、デバイスの場所の95%の信頼領域を示しています。

この場合の楕円の形状は興味深いものです。位置の不確実性はNW-SEラインに沿って最大になります。ここでは、3つのアクセスポイント(NEおよびSW)までの距離はほとんど変化せず、他の2つのアクセスポイント(北および南東)までの距離には誤差のトレードオフがあります。

(より正確な信頼領域は、いくつかのシステムで尤度関数の輪郭として取得できます。この楕円は、そのような輪郭の単なる2次近似です。)

半径をエラーなしで測定すると、すべての円に少なくとも1つの相互交点があり、その点が一意であれば、それが一意のソリューションになります。

この方法は、2つ以上のアクセスポイントで機能します。信頼区間を取得するには、3つ以上が必要です。2つしか使用できない場合、交差点の1つ(存在する場合)を見つけます。それ以外の場合は、2つのアクセスポイント間の適切な場所を選択します。


3
よくやったビル!

1
@Reddox原則として、はい:チューリング完全言語は文字通りあらゆる計算を実行できます。しかし、PHPは、ターゲット言語としての選択肢の選択肢の1つです。PHPマニュアルでさえ「PHPはおそらくグラフィカルユーザーインターフェイスを備えたデスクトップアプリケーションを作成するのに最適な言語ではありませんが、PHPをよく知っていて、クライアント側で高度なPHP機能を使用したい場合はPHP-GTKを使用してこのようなプログラムを作成できるアプリケーション。」
whuber

1
@Reddoxリンクありがとうございます。ジオメトリ計算がどのように提供されるかわかります。この状況では、これらは本当に必要ありません。そのような計算は、ピタゴラスの定理を適用して距離を平方の平方和として取得することです(Norm私のコードでの呼び出し)。すべての作業は、重み付き非線形最小二乗近似に関係していますが、GEOSライブラリがその機能を提供するとは思いません。正確な楕円体距離が必要な場合、GEOSが役立つ可能性があります。
whuber

2
これを正しく読んでいる場合、@ BenR、あなたはそれらに反比例するのではなく、二乗半径に比例してデータを重み付けしているようです。あなたがするとき、何が起こる分割によってsquare(data[2])それを掛けるのではなく?
whuber


1

この場合、すべての円が他のすべての円と交差するため、この方法で交差点を決定できます。

最初にすべてのn *(n-1)交点を決定します。これらの交点Iのセットを呼び出します。最も内側のポイントを含むポイントTのリストを取得します。次に、Iの各点pについて、pがすべての円内にあるかどうかを確認します。pがすべての円の内側にある場合、これは最も内側の交差点にあります。そのような点をリストTに追加します。

これで目的の交差座標ができました。場所を予測するには、少なくとも2つの方法が考えられます。

  1. Tによって形成される多角形の重心を計算します(距離を重みとして使用しますか?)。重心は目的の位置です。
  2. Tのすべての点を含む最小円を計算します。次に、この円の中心が目的の場所になります。この後、Rの計算は簡単です。

別の注意:最初に、自由空間パスモデル(またはバリエーション)を使用して、信号強度を距離に変換します。私の考えは次のとおりです。トレーニングデータセットがある場合、固定値としてn = 2またはn = 2.2を使用する代わりに、何らかの学習手法を使用してパス損失指数を見つけようとする必要があります。


T ...「最も内側のポイント」とは何ですか-5つのノードがある場合..いくつの「最も内側のポイント」をチェックする必要がありますか?
ewizard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.