Je dois trouver un algorithme qui peut calculer le centroïde A (alias centre de gravité, centre géométrique, centre de masse) à partir de la figure où les cercles T1, T2, T3, T4, T5, .., Tn se coupent ET la longueur de la ligne R du centroïde à coin le plus éloigné de la figure mentionnée
Les informations suivantes sont fournies:
- T1 Latitude = 56,999883 Longitude = 24,144473 Rayon = 943
- T2 Latitude = 57,005352 Longitude = 24,151168 Rayon = 857
- T3 Latitude = 57,005352 Longitude = 24,163356 Rayon = 714
- T4 Latitude = 56,999042 Longitude = 24,168506 Rayon = 714
- T5 Latitude = 56,994226 Longitude = 24,15709 Rayon = 771
Le résultat devrait ressembler à ceci: A Latitude = XX.XXXXXXX Longitude = XX.XXXXXXX Rayon = XX
Comme vous l'avez probablement déjà compris, je travaille sur un logiciel qui peut trouver l'emplacement de l'appareil par les points d'accès Wifi ou les stations de base mobiles les plus proches, car le nombre de points d'accès ou de stations de base peut changer, j'ai besoin d'un algorithme qui peut s'adapter à une quantité incertaine de points .
Il y a des questions similaires ici et ici , mais aucune d'entre elles ne répond exactement à ma question.
la source
Réponses:
Les mesures de rayon sont sûrement sujettes à une erreur. Je m'attendrais à ce que la quantité d'erreur soit proportionnelle aux rayons eux-mêmes. Supposons que les mesures soient par ailleurs non biaisées. Une solution raisonnable utilise alors l' ajustement des moindres carrés non linéaires pondéré , avec des poids inversement proportionnels aux rayons carrés.
Ce sont des choses standard disponible dans (entre autres) Python,
R
, Mathematica , et de nombreux progiciels statistiques complet, donc je vais l' illustrer. Voici quelques données obtenues en mesurant les distances, avec une erreur relative de 10%, à cinq points d'accès aléatoires entourant l'emplacement de l'appareil:Mathematica a besoin d'une seule ligne de code et d'aucun temps CPU mesurable pour calculer l'ajustement:
Modifier--
Pour les grands rayons, des solutions plus précises (sphériques ou ellipsoïdales) peuvent être trouvées simplement en remplaçant la distance euclidienne
Norm[{x, y} - {x0, y0}]
par une fonction pour calculer la distance sphérique ou ellipsoïdale. Dans Mathematica, cela pourrait être fait, par exemple , via- fin de l'édition
Un avantage de l'utilisation d'une technique statistique comme celle-ci est qu'elle peut produire des intervalles de confiance pour les paramètres (qui sont les coordonnées de l'appareil) et même une ellipse de confiance simultanée pour l'emplacement de l'appareil.
Il est instructif de tracer les données et la solution:
Les points blancs sont les emplacements (connus) des points d'accès.
Le gros point bleu est le véritable emplacement de l'appareil.
Les cercles gris représentent les rayons mesurés. Idéalement, ils se croiseraient tous à l'emplacement réel de l'appareil - mais évidemment, ils ne le font pas, en raison d'une erreur de mesure.
Le gros point rouge est l'emplacement estimé de l'appareil.
L'ellipse rouge délimite une région de confiance à 95% pour l'emplacement de l'appareil.
La forme de l'ellipse dans ce cas est intéressante: l'incertitude de localisation est la plus grande le long d'une ligne NW-SE. Ici, les distances à trois points d'accès (au NE et au SO) changent à peine et il y a un compromis d'erreurs entre les distances aux deux autres points d'accès (au nord et au sud-est).
(Une région de confiance plus précise peut être obtenue dans certains systèmes comme contour d'une fonction de vraisemblance; cette ellipse n'est qu'une approximation de second ordre d'un tel contour.)
Lorsque les rayons sont mesurés sans erreur, tous les cercles auront au moins un point d'intersection mutuelle et - si ce point est unique - ce sera la solution unique.
Cette méthode fonctionne avec deux points d'accès ou plus. Trois ou plus sont nécessaires pour obtenir des intervalles de confiance. Lorsque seulement deux sont disponibles, il trouve l'un des points d'intersection (s'ils existent); sinon, il sélectionne un emplacement approprié entre les deux points d'accès.
la source
Norm
dans mon code). Tout le travail est impliqué dans l'ajustement des moindres carrés non linéaires pondérés, mais je ne pense pas que la bibliothèque GEOS offre cette capacité. GEOS pourrait être d'une certaine utilité lorsque des distances ellipsoïdales précises sont nécessaires.square(data[2])
au lieu de multiplier par lui?Dans ce cas, chaque cercle intersecte tous les autres cercles et nous pouvons donc déterminer les points d'intersection de cette façon:
Déterminez d'abord tous les points d'intersection n * (n-1). Appelez l'ensemble de ces points d'intersection I . Prenez une liste de points T qui contient les points les plus intérieurs. Ensuite, pour chaque point p dans I , vérifiez si p est à l'intérieur de chaque cercle. Si p est à l'intérieur de chaque cercle, c'est le point sur l'intersection la plus intérieure. Ajouter un tel point à la liste T .
Vous avez maintenant les coordonnées d'intersection souhaitées. Je peux penser à au moins deux façons de prédire l'emplacement:
Autre remarque: convertissez d'abord la force du signal en distance à l'aide d'un modèle de trajet d'espace libre (ou de variations). Ma position est la suivante: vous avez un ensemble de données d'apprentissage, vous devriez essayer de trouver l'exposant de perte de chemin en utilisant une technique d'apprentissage au lieu d'utiliser n = 2 ou n = 2.2 comme valeur fixe.
la source