10

緯度と経度の値のリストがあり、それらの間の距離を見つけようとしています。標準の大円法を使用して、次を見つける必要があります。

acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2) * cos(long2-long1))

これに、私が使用している単位で地球の半径を掛けます。これは、acos を取得する値が [-1,1] の範囲内にある限り有効です。この範囲から少しでも外れるNaN場合は、その差が丸めによるものであっても、 が返されます。

私が抱えている問題は、2 つの緯度/経度の値が同一である場合に、NaNエラーが発生することがあることです。同じ数のペアであっても常にではありませんが、リスト内の常に同じものです。たとえば、砂漠の道で止まった人がいます。

Time  |lat     |long
1:00PM|35.08646|-117.5023
1:01PM|35.08646|-117.5023
1:02PM|35.08646|-117.5023
1:03PM|35.08646|-117.5023
1:04PM|35.08646|-117.5023

連続するポイント間の距離を計算すると、たとえば 3 番目の値は常に になりますNaNが、他の値はそうではありません。これは、R の丸めに関する奇妙なバグのようです。

4

2 に答える 2

8

データを見ずに正確に判断することはできませんが(試してみてくださいdput)、これはほとんどの場合、FAQ7.31の結果である可能性があります。

(x1 <- 1)
## [1] 1
(x2 <- 1+1e-16)
## [1] 1
(x3 <- 1+1e-8)
## [1] 1
acos(x1)
## [1] 0
acos(x2)
## [1] 0
acos(x3)
## [1] NaN

つまり、値が非常に類似しているために印刷された表現が同じであっても、それらは異なる可能性があります。中には含まれるもの.Machine$double.epsと含まれないものがあります...

入力値が[-1,1]で囲まれていることを確認する1つの方法は、とを使用することpmaxですpminacos(pmin(pmax(x,-1.0),1.0))

于 2012-12-24T23:02:28.233 に答える
0

簡単な回避策は、次のように pmin() を使用することです。

acos(pmin(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2) * cos(long2-long1),1))

これで、精度の低下が正確に 1 を超えない値になることが保証されます。

ただし、これは何が起こっているのかを説明していません。

(編集: Matthew Lundberg は、ベクトル化された入力を扱うには pmin を使用する必要があると指摘しました。これにより、動作させる際の問題は修正されますが、丸めが正しくない理由はまだわかりません。)

于 2012-12-24T22:55:16.390 に答える