อัลกอริทึม Trilateration สำหรับจำนวน n จุด


27

ฉันต้องการหาอัลกอริทึมที่สามารถคำนวณเซนทรอยด์A (aka แรงโน้มถ่วงศูนย์, ศูนย์กลางเรขาคณิต, ศูนย์กลางมวล) จากรูปที่วงกลม T1, T2, T3, T4, T5, .. , Tn ตัดและความยาวของเส้นRจากเซนทรอยด์ถึง มุมที่ไกลที่สุดของตัวเลขที่กล่าวถึง

ข้อมูลต่อไปนี้จะได้รับ:

  • T1 Latitude = 56.999883 ลองจิจูด = 24.144473 รัศมี = 943
  • T2 Latitude = 57.005352 ลองจิจูด = 24.151168 รัศมี = 857
  • T3 Latitude = 57.005352 ลองจิจูด = 24.163356 รัศมี = 714
  • T4 Latitude = 56.999042 ลองจิจูด = 24.168506 รัศมี = 714
  • T5 Latitude = 56.994226 ลองจิจูด = 24.15709 รัศมี = 771

ผลลัพธ์ควรมีลักษณะเช่นนี้: ละติจูด = XX.XXXXXXX ลองจิจูด = XX.XXXXXXX รัศมี = XX

ป้อนคำอธิบายรูปภาพที่นี่

ตามที่คุณคิดแล้วฉันกำลังทำงานกับซอฟต์แวร์ที่สามารถค้นหาตำแหน่งอุปกรณ์โดยใช้จุดเชื่อมต่อ Wifi หรือสถานีฐานโทรศัพท์มือถือที่ใกล้เคียงที่สุดเนื่องจากจำนวนจุดเชื่อมต่อหรือสถานีฐานอาจเปลี่ยนแปลงได้ฉันต้องการอัลกอริทึมที่สามารถปรับให้เข้ากับจำนวนจุดที่ไม่แน่นอน .

มีคำถามที่คล้ายกันอยู่ที่นี่และที่นี่แต่ไม่มีใครตอบคำถามของฉันได้อย่างแน่นอน


คุณใช้ภาษาอะไร
WolfOdrade

PHP ส่วนใหญ่เป็น JavaScript เล็กน้อย ฉันเดาว่าฉันต้องพูดถึงเรื่องนี้มาก่อน แต่ฉันเป็นนักพัฒนาเว็บและเข้าใจคำตอบของ Whuber ฉันต้องหานักคณิตศาสตร์
Kārlis Baumanis

รัศมีมาจากความแรงของสัญญาณสัมพัทธ์หรือไม่?
Kirk Kuykendall

ใช่ อันที่จริงรัศมีอยู่ใน dBm
Kārlis Baumanis

1
@ Redox ส่วนหนึ่ง - ฉันจัดการเพื่อคำนวณด้วย php_exec () โดยใช้ mathematica บนเซิร์ฟเวอร์
Kārlis Baumanis

คำตอบ:


29

การตรวจวัดรัศมีย่อมมีข้อผิดพลาด ฉันคาดว่าจำนวนข้อผิดพลาดจะเป็นสัดส่วนกับรัศมีเอง ให้เราสมมติว่าการวัดนั้นไม่เอนเอียง วิธีแก้ปัญหาที่สมเหตุสมผลนั้นใช้น้ำหนักที่ไม่เชิงเส้นอย่างน้อยกำลังสองที่เหมาะสมกับน้ำหนักที่แปรผกผันกับรัศมีที่สอง

นี่คือสิ่งที่มีอยู่ในมาตรฐาน (เหนือสิ่งอื่น) งูหลามR, Mathematicaและอีกหลายโปรแกรมสำเร็จรูปทางสถิติเต็มรูปแบบดังนั้นฉันจะแสดงให้เห็นว่ามัน นี่คือข้อมูลบางส่วนที่ได้รับจากการวัดระยะทางโดยมีข้อผิดพลาดสัมพัทธ์ 10% ถึงจุดเชื่อมต่อแบบสุ่มห้าจุดโดยรอบตำแหน่งอุปกรณ์:

ตารางข้อมูล

Mathematicaต้องการโค้ดเพียงหนึ่งบรรทัดและไม่มีเวลา CPU ที่วัดได้เพื่อคำนวณความพอดี:

fit = NonlinearModelFit[data, Norm[{x, y} - {x0, y0}], {x0, y0}, {x, y}, Weights -> 1/observations^2]

Edit--

สำหรับรัศมีขนาดใหญ่การแก้ปัญหา (ทรงกลมหรือวงรี) ที่แม่นยำยิ่งขึ้นสามารถพบได้โดยการแทนที่ระยะทางแบบยุคลิดNorm[{x, y} - {x0, y0}]ด้วยฟังก์ชันเพื่อคำนวณระยะทางทรงกลมหรือทรงรี ในMathematicaสามารถทำได้เช่นผ่าน

fit = NonlinearModelFit[data, GeoDistance[{x, y}, {x0, y0}], {x0, y0}, {x, y}, 
        Weights -> 1/observations^2]

- สิ้นสุดการแก้ไข

ข้อดีอย่างหนึ่งของการใช้เทคนิคทางสถิติเช่นนี้คือมันสามารถสร้างช่วงความมั่นใจสำหรับพารามิเตอร์ (ซึ่งเป็นพิกัดของอุปกรณ์) และแม้แต่วงรีความเชื่อมั่นพร้อมกันสำหรับตำแหน่งอุปกรณ์

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 ที่นี่ระยะทางถึงจุดเชื่อมต่อสามจุด (เป็น NE และ SW) แทบจะไม่เปลี่ยนแปลงและมีการแลกเปลี่ยนข้อผิดพลาดระหว่างระยะทางไปยังจุดเชื่อมต่ออื่น ๆ สองจุด (ไปทางทิศเหนือและตะวันออกเฉียงใต้)

(เขตความเชื่อมั่นที่แม่นยำยิ่งขึ้นสามารถหาได้ในบางระบบในฐานะที่เป็นรูปร่างของฟังก์ชันความน่าจะเป็น; วงรีนี้เป็นเพียงการประมาณลำดับที่สองของรูปร่างนั้น)

เมื่อรัศมีถูกวัดโดยไม่มีข้อผิดพลาดวงกลมทั้งหมดจะมีจุดตัดร่วมกันอย่างน้อยหนึ่งจุดและ - ถ้าจุดนั้นไม่ซ้ำกัน - มันจะเป็นทางออกที่ไม่ซ้ำกัน

วิธีนี้ใช้ได้กับจุดเชื่อมต่อสองจุดขึ้นไป ต้องมีสามอย่างขึ้นไปเพื่อให้ได้ช่วงความมั่นใจ เมื่อมีเพียงสองจุดเท่านั้นมันจะพบหนึ่งในจุดตัด (ถ้ามี); มิฉะนั้นจะเลือกตำแหน่งที่เหมาะสมระหว่างสองจุดเชื่อมต่อ


3
ทำได้ดีมากบิล!

1
@ Rededdox ตามหลักการแล้วใช่: ภาษาทัวริงที่สมบูรณ์ใด ๆ สามารถทำการคำนวณใด ๆ แต่ PHP จะลดรายการตัวเลือกของใครก็ได้เป็นภาษาเป้าหมาย แม้แต่PHP เองก็ยอมรับว่า: "PHP อาจไม่ใช่ภาษาที่ดีที่สุดในการสร้างแอปพลิเคชันเดสก์ท็อปที่มีส่วนต่อประสานผู้ใช้แบบกราฟิก แต่ถ้าคุณรู้จัก PHP เป็นอย่างดีและต้องการใช้ฟีเจอร์ PHP ขั้นสูงในฝั่งไคลเอ็นต์ของคุณ แอปพลิเคชันที่คุณสามารถใช้ PHP-GTK เพื่อเขียนโปรแกรมดังกล่าวได้ "
whuber

1
@Reddox ขอบคุณสำหรับลิงค์ ฉันเห็นว่ามันให้การคำนวณทางเรขาคณิตอย่างไร ในกรณีเช่นนี้สิ่งเหล่านั้นไม่จำเป็นจริงๆ: การคำนวณเพียงอย่างเดียวคือการประยุกต์ใช้ทฤษฎีบทพีทาโกรัสเพื่อให้ได้ระยะทางเป็นผลบวกของรากของกำลังสอง (การเรียกNormในรหัสของฉัน) งานทั้งหมดมีส่วนเกี่ยวข้องกับการปรับกำลังสองน้อยที่สุดแบบไม่เชิงเส้น แต่ฉันไม่เชื่อว่าห้องสมุด GEOS จะให้ความสามารถนั้น อาจเป็นไปได้ว่า GEOS อาจช่วยได้เมื่อต้องการระยะทางรูปวงรีที่แม่นยำ
whuber

2
ถ้าฉันอ่านมันอย่างถูกต้อง @BenR ดูเหมือนว่าคุณกำลังถ่วงน้ำหนักข้อมูลตามสัดส่วนของรัศมีกำลังสองแทนที่จะเป็นสัดส่วนตรงกันข้ามกับพวกมัน จะเกิดอะไรขึ้นเมื่อคุณหารด้วยsquare(data[2])แทนที่จะคูณมัน?
whuber


1

ในกรณีนี้วงกลมทุกวงจะตัดวงกลมอื่นทั้งหมดดังนั้นเราจึงสามารถกำหนดจุดตัดได้ด้วยวิธีนี้:

ก่อนอื่นกำหนดจุดตัด n * (n-1) ทั้งหมด เรียกชุดของเหล่านี้จุดสี่แยกฉัน ทำรายการคะแนนTซึ่งมีคะแนนด้านในสุด จากนั้นสำหรับแต่ละจุดpในIตรวจสอบว่าpอยู่ภายในวงกลมทุกวงหรือไม่ ถ้าpอยู่ภายในวงกลมทุกวงนี่จะเป็นจุดตัดที่ด้านในสุด เพิ่มจุดดังกล่าวไปยังรายการT

ตอนนี้คุณมีพิกัดทางแยกที่ต้องการ ฉันคิดอย่างน้อยสองวิธีในการทำนายตำแหน่ง:

  1. เพียงคำนวณ centroid (ใช้ระยะทางเป็นน้ำหนัก?) ของรูปหลายเหลี่ยมที่สร้างโดยTและ centroid เป็นตำแหน่งที่ต้องการ
  2. คำนวณวงกลมขั้นต่ำที่ประกอบด้วยจุดของทุกT จากนั้นศูนย์กลางของวงกลมนี้คือตำแหน่งที่ต้องการ การคำนวณRควรตรงไปตรงมาหลังจากนี้

หมายเหตุอื่น: ก่อนอื่นแปลงความแรงของสัญญาณเป็นระยะทางโดยใช้แบบจำลองพื้นที่ทางเดินว่าง (หรือรูปแบบ) สิ่งที่ฉันใช้คือ: คุณมีชุดข้อมูลการฝึกอบรมใด ๆ คุณควรลองค้นหาการสูญเสียเส้นทางโดยใช้เทคนิคการเรียนรู้แทนการใช้ n = 2 หรือ n = 2.2 เป็นค่าคงที่


T คืออะไร "จุดในสุด" - ถ้าฉันมี 5 โหนด .. ฉันควรจะตรวจสอบ "จุดในสุด" มากแค่ไหน?
ewizard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.