এই উত্তরটি একাধিক বিভাগে বিভক্ত:
"ক্যানড" রুটিনগুলির সাহায্যে কাঙ্ক্ষিত বিন্দুটি কীভাবে খুঁজে পাওয়া যায় তা দেখিয়ে সমস্যার বিশ্লেষণ এবং হ্রাস ।
উদাহরণ: একটি ওয়ার্কিং প্রোটোটাইপ , ওয়ার্কিং কোড দেয়।
উদাহরণ , সমাধানগুলির উদাহরণ দেখানো।
Pitfalls , সম্ভাব্য সমস্যার আলোচনা এবং কিভাবে তাদের সঙ্গে মানিয়ে নিতে।
আর্কজিআইএস বাস্তবায়ন , একটি কাস্টম আর্কজিআইএস সরঞ্জাম তৈরি করার বিষয়ে মন্তব্য এবং প্রয়োজনীয় রুটিনগুলি কোথায় পাবেন।
সমস্যাটির বিশ্লেষণ ও হ্রাস
এর যে নিরীক্ষক (পুরোপুরি বৃত্তাকার) গোলাকৃতি মডেল দ্বারা শুরু করা যাক সেখানে হবে সবসময় একটি সমাধান হতে সত্য --in, ঠিক দুই সমাধান। বেস পয়েন্টগুলি এ, বি এবং সি দেওয়া, প্রতিটি জুটি তার "লম্ব দ্বিখণ্ডক" নির্ধারণ করে, যা প্রদত্ত দুটি বিন্দু থেকে সমান পয়েন্টের সেট। এই দ্বিখণ্ডক একটি জিওডেসিক (দুর্দান্ত বৃত্ত)। গোলাকার জ্যামিতি উপবৃত্তাকার : যে কোনও দুটি জিওডেসিক ছেদ করে (দুটি অনন্য পয়েন্টে)। সুতরাং, এবি'র দ্বিখণ্ডক এবং বিসি-র দ্বিখণ্ডকের ছেদ পয়েন্টগুলি হ'ল সংজ্ঞা অনুসারে - এ, বি এবং সি থেকে সামঞ্জস্যপূর্ণ, যার ফলে সমস্যার সমাধান হয়। (নীচে প্রথম চিত্র দেখুন।)
উপবৃত্তাকারে বিষয়গুলি আরও জটিল দেখায়, তবে এটি গোলকের একটি ক্ষুদ্র ক্ষুদ্র অংশ, তাই আমরাও একইরকম আচরণ আশা করতে পারি। (এর বিশ্লেষণটি আমাদের অনেক বেশি দূরত্বে নিয়ে যাবে ll) উপবৃত্তাকারে সঠিক দূরত্ব গণনা করতে জটিল সূত্রগুলি (অভ্যন্তরীণভাবে একটি জিআইএসের অভ্যন্তরে) ধারণাগত জটিলতা নয়, যদিও: সমস্যাটি মূলত একই রকম। সমস্যাটি কতটা সহজ তা দেখতে, আসুন এটি কিছুটা বিমূর্তভাবে বলা যাক। এই বিবৃতিতে, "d (U, V)" U এবং V এর পয়েন্টগুলির মধ্যে সত্য, সম্পূর্ণ নির্ভুল দূরত্বকে বোঝায় this
উপবৃত্তাকারে তিনটি বিন্দু A, B, C (ল্যাট-লোন জোড়া হিসাবে) দেওয়া, একটি বিন্দু X সন্ধান করুন যার জন্য (1) d (X, A) = d (X, B) = d (X, C) এবং ( 2) এই সাধারণ দূরত্ব যতটা সম্ভব ছোট।
এই তিনটি দূরত্ব সমস্ত অজানা এক্স এর উপর নির্ভর করে । সুতরাং ইউ (এক্স) = ডি (এক্স, এ) - ডি (এক্স, বি) এবং ভি (এক্স) = ডি (এক্স, বি) - ডি (এক্স, সি) দূরত্বের পার্থক্যগুলি এক্স এর প্রকৃত মূল্যবান ফাংশন are আবার কিছুটা বিমূর্তভাবে আমরা এই পার্থক্যগুলিকে অর্ডারযুক্ত জোড়ায় একত্রিত করতে পারি। এক্স এর স্থানাঙ্ক হিসাবে আমরা (ল্যাট, লোন )ও ব্যবহার করব, এটিও একটি অর্ডারযুক্ত জোড় হিসাবে বিবেচনা করার অনুমতি দেই, এক্স = (ফাই, ল্যাম্বদা) বলুন। এই সেটআপে, ফাংশন
এফ (ফাই, ল্যাম্বদা) = (ইউ (এক্স), ভি (এক্স)
দ্বি-মাত্রিক স্থানের একটি অংশ থেকে দ্বি-মাত্রিক স্থানগুলিতে মান গ্রহণ করে আমাদের সমস্যাটি হ্রাস পায়
সমস্ত সম্ভাব্য (ফাই, ল্যাম্বদা) অনুসন্ধান করুন যার জন্য এফ (ফাই, ল্যাম্বদা) = (0,0)।
এখানে বিমূর্ততা প্রদান করে: এটি সমাধানের জন্য প্রচুর দুর্দান্ত সফ্টওয়্যার উপস্থিত রয়েছে (খাঁটি সংখ্যাটি বহুমাত্রিক মূল অনুসন্ধান) সমস্যাটি সমাধান করার জন্য। এটি যেভাবে কাজ করে তা হ'ল আপনি এফ গণনা করার জন্য একটি রুটিন লিখেছেন , তারপরে আপনি সফ্টওয়্যারটির সাথে তার ইনপুটটিতে বিধিনিষেধ সম্পর্কিত কোনও তথ্যও সরবরাহ করবেন ( ফাই অবশ্যই -90 এবং 90 ডিগ্রি এবং লাম্বডা অবশ্যই -180 এবং 180 এর মধ্যে থাকা উচিত ডিগ্রী). এটি একটি সেকেন্ডের ভগ্নাংশের জন্য দূরে সরে যায় এবং যদি এটির সন্ধান করতে পারে তবে (সাধারণত) কেবলমাত্র একটি ফাই ( ফাই , ল্যাম্বদা ) ফেরত দেয় ।
হ্যান্ডেল করার জন্য বিশদ রয়েছে, কারণ এটির একটি শিল্প রয়েছে: এফ "আচরণ করে" তার উপর নির্ভর করে বেছে নেওয়া বিভিন্ন সমাধান পদ্ধতি রয়েছে ; এটি তার অনুসন্ধানের জন্য যুক্তিসঙ্গত প্রারম্ভিক বিন্দু দিয়ে সফ্টওয়্যারটিকে "চালিত" করতে সহায়তা করে (এটি অন্য উপায়গুলির চেয়ে নিকটতম সমাধানটি পেতে পারি এমন এক উপায় ); এবং আপনি সাধারণত সমাধানটি কীভাবে সঠিক হতে চান তা নির্দিষ্ট করতে হবে (সুতরাং অনুসন্ধান কখন থামাতে হবে তা তা জানে)। (জিআইএস বিশ্লেষকদের এই জাতীয় বিবরণ সম্পর্কে যা জানা দরকার, যা জিআইএস সমস্যার ক্ষেত্রে প্রচুর পরিমাণে আসে, সে সম্পর্কে আরও তথ্যের জন্য দয়া করে জিওপ্যাটিয়াল টেকনোলজিস কোর্সের জন্য কম্পিউটার সায়েন্সে অন্তর্ভুক্ত করার জন্য বিষয়গুলি সুপারিশ করুন এবং শেষের নিকটে "বিবিধ" বিভাগটি দেখুন। )
উদাহরণ: একটি ওয়ার্কিং প্রোটোটাইপ
বিশ্লেষণে দেখা যায় যে আমাদের দুটি বিষয় প্রোগ্রাম করতে হবে: সমাধানের অশোধিত প্রাথমিক অনুমান এবং নিজেই এফের গণনা ।
প্রাথমিক অনুমানটি তিনটি বেস পয়েন্টের একটি "গোলাকার গড়" দ্বারা তৈরি করা যেতে পারে। এটি জিওসেন্ট্রিক কার্টেসিয়ান (এক্স, ওয়াই, জেড) স্থানাঙ্কগুলিতে তাদের প্রতিনিধিত্ব করে, সেই স্থানাঙ্কগুলির গড় গড়ে, এবং সেই গোলকে গোল করে গড় গড় উপস্থাপন করে এবং এটি অক্ষাংশ এবং দ্রাঘিমাংশে পুনরায় প্রকাশ করার মাধ্যমে প্রাপ্ত হয়। গোলকের আকার নিরবচ্ছিন্ন এবং গণনাগুলি এর মাধ্যমে সোজাভাবে তৈরি করা হয়: কারণ এটি কেবল একটি সূচনা পয়েন্ট, আমাদের উপবৃত্তাকার গণনার প্রয়োজন নেই।
এই ওয়ার্কিং প্রোটোটাইপের জন্য আমি ম্যাথেমেটিকা 8 ব্যবহার করেছি ।
sphericalMean[points_] := Module[{sToC, cToS, cMean},
sToC[{f_, l_}] := {Cos[f] Cos[l], Cos[f] Sin[l], Sin[f]};
cToS[{x_, y_, z_}] := {ArcTan[x, y], ArcTan[Norm[{x, y}], z]};
cMean = Mean[sToC /@ (points Degree)];
If[Norm[Most@cMean] < 10^(-8), Mean[points], cToS[cMean]] / Degree
]
(চূড়ান্ত Ifশর্তটি পরীক্ষা করে যে গড়টি দ্রাঘিমাংশ নির্দেশিত করতে স্পষ্টভাবে ব্যর্থ হতে পারে কিনা; যদি তা হয় তবে এটি এর ইনপুটটির অক্ষাংশ এবং দ্রাঘিমাংশের একটি সোজা গাণিতিক গড়ের দিকে ফিরে যায় - সম্ভবত কোনও দুর্দান্ত পছন্দ নয়, তবে কমপক্ষে একটি বৈধ মান রয়েছে। এই কোডটি প্রয়োগের গাইডেন্সের জন্য যারা ব্যবহার করছেন তাদের জন্য নোট করুন যে ম্যাথমেটিকার যুক্তিগুলি ArcTanঅন্যান্য অন্যান্য বাস্তবায়নের তুলনায় বিপরীত হয়েছে: এর প্রথম যুক্তিটি এক্স-কো-অর্ডিনেট, এটির দ্বিতীয়টি y- স্থানাঙ্ক এবং এটি ভেক্টরের দ্বারা তৈরি কোণটি ফিরিয়ে দেয় ( X, Y)।)
দ্বিতীয় অংশটি যতদূর যায়, কারণ গণিত - আর্কজিআইএস এবং প্রায় সমস্ত জিআইএস-এর মতো - উপবৃত্তের উপর সঠিক দূরত্ব গণনার কোড রয়েছে, লেখার মতো কিছুই নেই almost আমরা কেবল মূল অনুসন্ধানের রুটিনকে কল করি:
tri[a_, b_, c_] := Block[{d = sphericalMean[{a, b, c}], sol, f, q},
sol = FindRoot[{GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, a] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, b] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, c]},
{{f, d[[1]]}, {q, d[[2]]}},
MaxIterations -> 1000, AccuracyGoal -> Infinity, PrecisionGoal -> 8];
{Mod[f, 180, -90], Mod[q, 360, -180]} /. sol
];
এই প্রয়োগের সর্বাধিক লক্ষণীয় দিক হ'ল এটি কীভাবে যথাক্রমে যথাক্রমে 180 এবং 360 ডিগ্রি মডিউলগুলিকে গণনা করে অক্ষাংশ ( f) এবং দ্রাঘিমাংশ ( q) সীমাবদ্ধ করার প্রয়োজনকে ডজ করে । এটি সমস্যার সীমাবদ্ধতা এড়ানো এড়ায় (যা প্রায়শই জটিলতা সৃষ্টি করে)। নিয়ন্ত্রণের প্যারামিটারগুলি MaxIterationsইত্যাদি এই কোডটি যতটা সম্ভব যথাসম্ভব যথাযথতা সরবরাহ করতে তৈরি করা হয়েছে।
এটি কার্যকরভাবে দেখতে, আসুন এটি সম্পর্কিত প্রশ্নে প্রদত্ত তিনটি বেস পয়েন্টগুলিতে প্রয়োগ করুন :
sol = tri @@ (bases = {{-6.28530175, 106.9004975375}, {-6.28955287, 106.89573839}, {-6.28388865789474, 106.908087643421}})
{-6.29692, 106.907}
এই সমাধান এবং তিনটি পয়েন্টের মধ্যে গণিত দূরত্বগুলি
50 1450.23206979, 1450.23206979, 1450.23206978}
(এগুলি মিটার)। তারা একাদশ উল্লেখযোগ্য অঙ্কের মধ্য দিয়ে সম্মতি জানায় (এটি খুব নির্ভুল, আসলে, যেহেতু দূরত্বগুলি মিলিমিটার বা তার চেয়ে বেশি ভাল করার পক্ষে খুব কমই সঠিক)। এই তিনটি পয়েন্ট (কালো), তাদের তিনটি মিউচুয়াল বাইসেক্টর এবং সমাধান (লাল) এর চিত্র এখানে রয়েছে:

উদাহরণ
এই বাস্তবায়নটি পরীক্ষা করার জন্য এবং সমস্যাটি কীভাবে আচরণ করে তার আরও ভাল ধারণা পেতে, এখানে তিনটি বিস্তৃত ব্যবধানযুক্ত বেস পয়েন্টের জন্য দূরত্বের মূলের বর্গতুল্য পার্থক্যের মূল কনট্যুর প্লট রয়েছে। (আরএমএসের তফাতটি তিনটি ডিফ (এক্স, এ) -ডি (এক্স, বি), ডি (এক্স, বি) -ডি (এক্স, সি), এবং ডি (এক্স, সি) -ডি (এক্স) তিনটি পার্থক্য গণনা করে প্রাপ্ত হয় , ক), তাদের স্কোয়ারের গড় গড়ে এবং স্কোয়ার রুট গ্রহণ করা X এটি সমস্যাটি শূন্যের সমান যখন এক্স সমস্যা সমাধান করে এবং অন্যথায় এক্স সমাধান থেকে দূরে সরে যাওয়ার সাথে সাথে বৃদ্ধি পায় এবং সুতরাং যে কোনও স্থানে সমাধান হওয়ার জন্য আমরা কীভাবে "নিকটে" রয়েছি তা পরিমাপ করে। )

এই প্লেট ক্যারি প্রক্ষেপণে বেস পয়েন্টগুলি (60, -120), (10, -40) এবং (45,10) লাল দেখানো হয়েছে; সমাধান (49.2644488, -49.9052992) - যা গণনা করতে 0.03 সেকেন্ডের প্রয়োজন - হলুদ। সমস্ত প্রাসঙ্গিক দূরত্ব হাজার হাজার কিলোমিটার থাকা সত্ত্বেও এর আরএমএসের তাত্পর্যটি তিন ন্যানোমিটারের চেয়ে কম । অন্ধকার অঞ্চলগুলি আরএমএসের ছোট মানগুলি দেখায় এবং হালকা অঞ্চলগুলি উচ্চ মান দেখায়।
এই মানচিত্রটি পরিষ্কারভাবে আরেকটি সমাধান দেখায় (-49.2018206, 130.0297177) (প্রথম সমাধানের বিপরীতে প্রাথমিক অনুসন্ধানের মানটি ডায়ামেট্রিকভাবে সেট করে দুটি ন্যানোমিটারের একটি আরএমএসে গণনা করা হয়েছে))
pitfalls
সংখ্যাগত অস্থিতিশীলতা
যখন বেস পয়েন্টগুলি প্রায় সমান্তরাল হয় এবং একসাথে ঘনিষ্ঠ হয়, তখন সমস্ত সমাধান প্রায় অর্ধেক বিশ্ব দূরে থাকবে এবং সঠিকভাবে নিচে নামানো খুব কঠিন হবে। কারণটি হ'ল বিশ্বজুড়ে কোনও অবস্থানে ছোট পরিবর্তনগুলি - এটিকে বেস পয়েন্টগুলির দিকে বা দূরে সরিয়ে - দূরত্বের পার্থক্যের মধ্যে কেবল অবিশ্বাস্যরূপে ছোট্ট পরিবর্তন আনতে পারে। ফলাফলটি নীচে নেওয়ার জন্য জিওডেটিক দূরত্বের সাধারণ গণনায় যথেষ্ট যথার্থতা এবং নির্ভুলতা তৈরি হয়নি।
উদাহরণস্বরূপ, বেস পয়েন্টগুলি (45.001, 0), (45, 0) এবং (44.999,0) থেকে শুরু করে, যা প্রতিটি triমেরির মধ্যে কেবল 111 মিটার দ্বারা প্রাইম মেরিডিয়ান বরাবর পৃথক করা হয়েছে, সমাধানটি পান (11.8213, 77.745 )। এটি থেকে বেস পয়েন্টগুলির দূরত্বগুলি 8,127,964.998 77; 8,127,964.998 41; এবং যথাক্রমে 8,127,964.998 65 মিটার। তারা নিকটতম মিলিমিটারে সম্মত! এই ফলাফলটি কতটা যথাযথ হতে পারে তা সম্পর্কে আমি নিশ্চিত নই, তবে অন্য বাস্তবায়নগুলি যদি এর থেকে খুব দূরে অবস্থানগুলি ফিরে আসে তবে তিনটি দূরত্বের প্রায় সমানভাবে সমতা দেখায় তবে অবাক হওয়ার কিছু নেই।
গণনার সময়
এই গণনাগুলি, কারণ এগুলি জটিল দূরত্বের গণনা ব্যবহার করে যথেষ্ট অনুসন্ধানে জড়িত, দ্রুত নয়, সাধারণত একটি সেকেন্ডের লক্ষণীয় ভগ্নাংশের প্রয়োজন হয়। রিয়েল-টাইম অ্যাপ্লিকেশনগুলির এ সম্পর্কে সচেতন হওয়া প্রয়োজন।
আর্কজিআইএস বাস্তবায়ন
পাইথন হ'ল আর্কজিআইএসের জন্য পছন্দের স্ক্রিপ্টিং পরিবেশ (9 সংস্করণ দিয়ে শুরু করা)। Scipy.optimize প্যাকেজ একটি বহুচলকীয় rootfinder হয়েছে rootযা কি করা উচিত FindRootমধ্যে আছে ম্যাথামেটিকাল কোড। অবশ্যই আর্কজিআইএস নিজেই সঠিক উপবৃত্তাকার দূরত্ব গণনার অফার করে। তারপরে বাকী সমস্ত প্রয়োগকরণের বিবরণ: বেস পয়েন্ট স্থানাঙ্কগুলি কীভাবে প্রাপ্ত হবে (কোনও স্তর থেকে? ব্যবহারকারী দ্বারা টাইপ করা? একটি পাঠ্য ফাইল থেকে? মাউস থেকে?) কীভাবে আউটপুট উপস্থাপন করা হবে তা স্থির করুন (স্থানাঙ্ক হিসাবে) স্ক্রিনে প্রদর্শিত হয়? গ্রাফিক পয়েন্ট হিসাবে? একটি লেয়ারে নতুন পয়েন্ট অবজেক্ট হিসাবে?), ইন্টারফেসটি লিখুন, এখানে দেখানো ম্যাথেমেটিক কোডটি পোর্ট করুন (সোজা) এবং আপনি সমস্ত সেট হয়ে যাবেন।