iterative_point_recovery_documentation-russian.tex 158 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250
  1. \documentclass[14pt%,showframe%
  2. ]{ipr_doc}
  3. \usepackage{fix-cm}% fix of Computer Modern font DO NOT MOVE!!!
  4. \usepackage{calc}% simple arithmetic in expressions
  5. \usepackage{etoolbox}% some Latex interfaces
  6. \usepackage{longtable,multirow}% tables
  7. \usepackage{float,adjustbox,placeins,caption}% processing of float objects
  8. %
  9. % page geometry
  10. %
  11. \usepackage[
  12. top = 0.06734007\paperheight,
  13. bottom = 0.06734007\paperheight,
  14. right = 0.1190476\paperwidth,
  15. left = 0.0952381\paperwidth
  16. ]{geometry}
  17. %
  18. % language and fonts
  19. %
  20. \usepackage{amsmath,amsfonts,amssymb,xfrac}
  21. \usepackage[cmintegrals,cmbraces]{newtxmath}
  22. \usepackage{xltxtra,polyglossia,csquotes}
  23. \usepackage{verbatim,fancyvrb,framed}
  24. \usepackage{relsize}
  25. \setmainlanguage{russian}
  26. \setotherlanguage{english}
  27. \setkeys{russian}{babelshorthands=true}
  28. \defaultfontfeatures{Scale=MatchLowercase,Mapping=tex-text}
  29. \input{fonts/font_settings-IBM_Plex.tex}
  30. % \input{fonts/font_settings-Computer_Modern.tex}
  31. % \input{fonts/font_settings-my_fonts.tex}
  32. %
  33. % paragraphs and align
  34. %
  35. \usepackage{indentfirst,framed}
  36. \frenchspacing\sloppy\raggedbottom
  37. \setlength{\parindent}{0.0604762\paperwidth}%
  38. %%%%% additional colontitles settings
  39. \RequirePackage{fancyhdr}
  40. \fancyhf{}\renewcommand{\headrulewidth}{0pt}
  41. \fancyfoot{}
  42. \fancyfoot[R]{\thepage}
  43. \pagestyle{fancy}
  44. %
  45. % references and toc
  46. %
  47. \RequirePackage{hyperref}
  48. \RequirePackage{xcolor}
  49. \definecolor{DarkBlue}{rgb}{0,0,0.5}
  50. \hypersetup{bookmarksnumbered,colorlinks=true,linkcolor={black},
  51. urlcolor=DarkBlue,citecolor={black}}
  52. \makeatletter\renewcommand{\Hy@numberline}[1]{#1. }\makeatother
  53. \let\savenumberline\numberline\relax\def\numberline#1{\savenumberline{#1.}}
  54. \setcounter{tocdepth}{4}
  55. %%%%% обеспечение меток для элементов списков
  56. \makeatletter%
  57. \def\itemlabel#1#2{{\phantomsection\def\@currentlabel{#2}\label{#1}}}%
  58. \makeatother%
  59. %
  60. % lists
  61. %
  62. \usepackage{enumitem}
  63. \usepackage{dirtree}
  64. %
  65. % figures and graphics
  66. %
  67. \RequirePackage{subfigure,graphicx,wrapfig}
  68. \graphicspath{{images/}}
  69. \newcommand{\pnt}[1]{\symbfup{#1}}% точка
  70. \newcommand{\vct}[1]{\vec{#1}}% вектор
  71. \newcommand{\sofs}[1]{\symbfsfup{#1}}% множество множеств
  72. \newcommand{\sofsofs}[1]{\symfrak{#1}}% множество множеств множеств
  73. \newcommand{\prop}[1]{\symtt{#1}}% высказывание (логическое выражение)
  74. \DeclareMathOperator*{\argmin}{arg\,min}
  75. \newcommand{\verbI}[1]{\textit{\Verb|#1|}}%
  76. \newcommand{\NmCnvDescript}%
  77. {\addtolength{\leftskip}{0.0604762\paperwidth}%
  78. \setlength{\parindent}{-0.0604762\paperwidth}}%
  79. \newenvironment{ImpNote}
  80. {\setlength{\parindent}{0.0604762\paperwidth}%
  81. \setlength{\LTleft}{\parindent}%
  82. \setlength{\LTpre}{\parsep}\setlength{\LTpost}{\parsep}%
  83. \begin{longtable}{|p{\linewidth-\tabcolsep-1\parindent}}%
  84. \noindent\textsf{\textbf{Важное замечание:}}}%
  85. {\end{longtable}}
  86. \title{Итеративное восстановление точки в $n$\nobreakdash-мерном пространстве
  87. по $n+1$~точкам и недостоверным расстояниям}
  88. \author{hk@r4in.tk\\ mns@r4in.tk}
  89. \begin{document}
  90. \maketitle
  91. \section{Введение}
  92. \label{sec:introduction}
  93. Проблема восстановления координат точки в пространстве в целом проблемой не
  94. является. Формулировка задачи выглядит следующим образом: в гладком эвклидовом
  95. пространстве $\symbb{R}^n$ существует точка
  96. ${\pnt{x}=\left\{ x_{i}\right\}_{i=0}^{n-1}}$, координаты которой неизвестны,
  97. но известны координаты ${n+1}$ других точек
  98. ${\sofs{C}=\left\{\pnt{c}_{j}\right\}_{j=0}^{n}}$, не лежащих в одной
  99. гиперплоскости, а также расстояния ${R=\left\{r_{j}\right\}_{j=0}^{n}}$ от них
  100. до точки $\pnt{x}$. Очевидно, что восстановление координат точки $\pnt{x}$
  101. осуществляется решением системы уравнений:
  102. \begin{equation}
  103. \label{eq:naive_approach_system}
  104. \begin{cases}
  105. \,r_{0}^{2}=\sum\limits_{k=0}^{n-1}\left(x_{k}-c_{0,k}\right)^{2}\\
  106. \,r_{1}^{2}=\sum\limits_{k=0}^{n-1}\left(x_{k}-c_{1,k}\right)^{2}\\
  107. \hfil\cdots\\
  108. \,r_{n}^{2}=\sum\limits_{k=0}^{n-1}\left(x_{k}-c_{n,k}\right)^{2}
  109. \end{cases}
  110. \end{equation}
  111. \noindent%
  112. Решение такой системы при~${n=2}$ не представляет проблемы. При~${n=3}$ оно уже
  113. сложнее. При дальнейшем увеличении~$n$ сложность решения такой системы
  114. уравнений растёт очень быстро\footnote{Точная оценка вычислительной сложности
  115. решения таких систем уравнений в зависимости от~$n$ не приводится, так как
  116. зависит от конкретного алгоритма.}. Учитывая, что в настоящее время размерность
  117. может достигать весьма больших значений от сотен и более, а кроме того может
  118. определяться самой структурой данных и меняться в ходе их обработки,
  119. представляется целесообразным выработать общий алгоритм восстановления точки,
  120. с приемлемым (и желательно контролируемым) временем выполнения для больших~$n$.
  121. Ситуация осложняется тем, что в прикладных задачах точность измерения
  122. расстояния может быть разной. Так, например, четыре радиоприёмника, оценивая
  123. расстояние до источника по силе сигнала, могут давать значения радиусов,
  124. которые не имеют единой точки пересечения, в результате чего решение такой
  125. системы уравнений будет комплексным, а следовательно неподходящим для
  126. практического использования. В подобных случаях необходимо не точное решение
  127. системы уравнений~\eqref{eq:naive_approach_system}, а некое, желательно
  128. наилучшее, приближение. Одна из таких ситуаций приведена на рис.\ref{fig:fig1}.
  129. \begin{wrapfigure}{R}{0.5\textwidth}
  130. \includegraphics[width=\linewidth]{fig1.eps}%
  131. \captionsetup{format=hang}%
  132. \caption{Ситуация при ${n=2}$,\newline
  133. ${\pnt{c}_{0}=\left\{-0.976,0.401\right\}}$,\newline
  134. ${\pnt{c}_{1}=\left\{-0.251,-0.506\right\}}$,\newline
  135. ${\pnt{c}_{2}=\left\{0.368, 0.327\right\}}$,\newline
  136. ${R=\left\{0.98,0.653,0.816\right\}}$.}%
  137. \vspace{-1\baselineskip} % IBM Plex
  138. % \vspace{-3\baselineskip} % Computer Modern
  139. \label{fig:fig1}
  140. \end{wrapfigure}
  141. Представляется справедливым, что искомая точка вероятнее всего принадлежит
  142. области~$a$, ограниченной $1$\nobreakdash-сферами с центрами в~$\pnt{c}_{i}$ и
  143. радиусами~$r_{i}$ соответственно. Данная гипотеза основана на том, что для
  144. любой точки внутри области~$a$ сумма расстояний до поверхностей сфер меньше,
  145. чем вне области~$a$. В идеальном случае, если радиусы сфер абсолютно точны, то
  146. расстояния от искомой точки до поверхностей сфер равны~$0$ в соответствии со
  147. смыслом системы уравнений~\eqref{eq:naive_approach_system}. Уточнения и
  148. раскрытие данного утверждения приведены ниже с рассмотрением случаев, когда
  149. область~$a$ может быть неограниченной, включая случай, когда ни одна пара сфер
  150. не имеет общих точек.
  151. Также нельзя не отметить, что в прикладных задачах часто есть возможность
  152. получить данные не с ${n+1}$~датчиков, дающих неточные значения, а с большего
  153. их (датчиков) количества. С одной стороны может показаться, что решение
  154. системы~\eqref{eq:naive_approach_system} при этом усложнится и это так, но если
  155. отталкиваться от иных подходов, то в прикладной сфере дополнительная информация
  156. может (и должна) улучшать приближение искомой точки, что будет показано в
  157. разделе~\ref{subsubsec:prototype_regress_estimation}.
  158. Здесь и далее иллюстрации для наглядности приводятся для случаев~${n=2}$,
  159. однако, подразумевается, что все изложенное справедливо для
  160. любых~${n\in\symbb{N}}$ и, соответственно, ${(n-1)}$\nobreakdash-сфер.
  161. Таким образом, целью данного документа является описание алгоритма, который
  162. получает в качестве аргументов:
  163. \begin{enumerate}
  164. \item Размерность пространства~--~${n\in\symbb{N}}$;
  165. \item Координаты ${m}$~точек
  166. (${m\in\symbb{N}}$~и~${m>n}$)\footnote{\label{note:m_restriction}%
  167. Ограничение~${m>n}$ очевидно и продиктовано тем, что при~${m<n+1}$
  168. существует сфера (множество точек) такая, что искомая точка
  169. равновероятно находится в любой точке принадлежащей поверхности
  170. такой сферы.} в данном пространстве~--~%
  171. ${\sofs{C}=\left\{\pnt{c}_{i}\in\symbb{R}^{n}\right\}_{i=0}^{m-1}}$;
  172. \item Недостоверные расстояния от точек~$\sofs{C}$ до искомой
  173. точки~--~${R=\left\{r_{i}\in\symbb{R}\right\}_{i=0}^{m-1}}$.
  174. \end{enumerate}
  175. \noindent%
  176. Результат работы алгоритма это
  177. точка~${\pnt{x}=\left\{x_{i}\right\}_{i=0}^{n-1}}$, являющаяся наилучшим
  178. приближением искомой точки. Это расплывчатое определение дано в связи с тем,
  179. что при описании алгоритма умышленно не будет использоваться <<настоящая>>
  180. искомая точка, так как в практических задачах, для решения которых
  181. вырабатывается алгоритм, искомая точка всегда неизвестна даже в случае
  182. полностью контролируемых условий оценки алгоритма. В
  183. разделе~\ref{subsec:prototype_testing} при оценке прототипа будет использована
  184. <<настоящая>> искомая точка для вычисления статистики по ошибке приближения, но
  185. при этом необходимо понимать, что хороший алгоритм должен демонстрировать
  186. прямую корреляцию качества своей работы и точности датчиков выдающих
  187. расстояния~$R$, а в таком случае оценка расстояния между алгоритмически
  188. вычисленной и искомой точкой будет не оценкой алгоритма, а оценкой точности
  189. датчиков, причём косвенной. В общем же случае лучше говорить, что алгоритм
  190. рассчитывает координаты точки, где наиболее вероятно нахождение искомой точки;
  191. либо полученное приближение достаточно точно для принятия решения и дальнейших
  192. действий. Грубо говоря, если поставить целью <<уничтожение>> искомой точки
  193. бомбой, которая при детонации сохраняет разрушающее воздействие в радиусе
  194. $100$~метров от эпицентра взрыва, то достаточно того, чтобы алгоритмически
  195. рассчитанная точка была менее чем в ста метрах от искомой.
  196. \section{Алгоритм}
  197. \label{sec:algorithm}
  198. \subsection{Предварительные утверждения}
  199. \label{subsec:preliminary_propositions}
  200. В данном разделе приведены самоочевидные или доказуемые утверждения, постулаты,
  201. леммы, отношение которых к описываемому алгоритму на данном этапе изложения
  202. может быть неясно. Поэтому вы можете при первом чтении пропустить этот раздел и
  203. перейти к общему описанию
  204. алгоритма~(разд.~\ref{subsec:general_algorithm_description}) и в ходе его
  205. чтения по ссылкам вернуться в этот раздел при необходимости.
  206. \subsubsection{Кратчайшее расстояние от точки до поверхности сферы в гладком
  207. эвклидовом пространстве}
  208. \label{subsubsec:shortest_distance_to_sphere_surface}
  209. Определим функцию ${\delta\left(\pnt{a},\pnt{b}\right)}$ как эвклидово
  210. расстояние:
  211. \begin{equation}
  212. \label{eq:delta}
  213. \delta\left(\pnt{a},\pnt{b}\right):\Leftrightarrow\sqrt[2]{
  214. \sum\limits_{i=0}^{n-1}\left(a_{i}-b_{i}\right)^{2}}
  215. \end{equation}
  216. \noindent%
  217. Тогда минимальное расстояние~$\mu$ от точки $\pnt{a}$ до поверхности
  218. ${(n-1)}$\nobreakdash-сферы с центром в~$\pnt{c}$ и радиусом~$r$:
  219. \begin{gather}
  220. \sofs{S}:\Leftrightarrow\left\{
  221. \left.\pnt{s}\in\symbb{R}^{n}\right|\delta\left(\pnt{c},\pnt{s}\right)=r
  222. \right\}\notag\\
  223. \pnt{s}_{\mu}=
  224. \argmin_{\pnt{s\in\sofs{S}}}\delta\left(\pnt{a},\pnt{s}\right)\notag\\
  225. \mu =\delta\left(\pnt{a},\pnt{s}_{\mu}\right)\notag\\
  226. \mu\left(\pnt{a},\pnt{c},r\right):\Leftrightarrow\left|
  227. \delta\left(\pnt{a},\pnt{c}\right)-r\right|\label{eq:mue}
  228. \end{gather}
  229. \noindent%
  230. Формула~\eqref{eq:mue} это удобное следствие из определения сферы, позволяющее
  231. алгоритмически эффективно рассчитывать~$\mu$ без вычисления
  232. точки~$\pnt{s}_{\mu}$. Также необходимо помнить, что при смене метрики на иную
  233. формула~\eqref{eq:mue} может перестать работать. Особенно надо быть осторожным
  234. при смене метрики на непринадлежащую метрикам Минковского или даже на
  235. некоммутирующую функцию расстояния, и учитывать, что при смене функции
  236. расстояния должна меняться не только формула, но и определение сферы. Это
  237. связано с тем, что формула (3) в данном случае следует из определения сферы
  238. через метрику, или, иными словами, в данном случае формула~\eqref{eq:mue}
  239. справедлива потому, что $\delta$~и~$r$ косвенно определены одна через
  240. другую~(circulus vitiosus!).
  241. В худших случаях смена функции расстояния может привести к тому, что ${n+1}$
  242. сфер могут иметь более одной общей точки и/или что точный способ нахождения
  243. кратчайшего расстояния от точки до сферы может быть неизвестен, сложен для
  244. машинного вычисления, или реализовано только приблизительное его вычисление
  245. через поиск~${\argmin_{\pnt{s}}\delta\left(\pnt{a},\pnt{s}\right)}$.
  246. В дальнейшем в данном документе используется и подразумевается эвклидова
  247. метрика.
  248. \subsubsection[Уравнение координат пересечения
  249. \texorpdfstring{$(n-1)$}{(n-1)}-сферы с прямой, проходящей через центр
  250. \texorpdfstring{$(n-1)$}{(n-1)}-сферы]{Уравнение координат пересечения
  251. $(n-1)$\nobreakdash-сферы с прямой, проходящей через центр
  252. $(n-1)$\nobreakdash-сферы}
  253. \label{subsubsec:line-sphere_intersection_equation}
  254. Для нахождения координат точки пересечения $(n-1)$\nobreakdash-сферы в
  255. пространстве~$\symbb{R}^{n}$ с прямой необходимо решить систему уравнений:
  256. \begin{equation}
  257. \label{eq:line-sphere_system}
  258. \begin{array}{ll}
  259. \begin{cases}
  260. \,\frac{x_{0}-p_{0}}{v_{0}}=\frac{x_{1}-p_{1}}{v_{1}}\\
  261. \,\frac{x_{0}-p_{0}}{v_{0}}=\frac{x_{2}-p_{2}}{v_{2}}\\
  262. \hfil\cdots\\
  263. \,\frac{x_{0}-p_{0}}{v_{0}}=\frac{x_{n-1}-p_{n-1}}{v_{n-1}}\\
  264. \,r^{2}=\sum\limits_{i=0}^{n-1}\left( x_{i}-c_{i}\right) ^{2}
  265. \end{cases}&
  266. \begin{aligned}
  267. &&\text{, }&\text{где}\hfil&&\\
  268. &&\pnt{x}&=\left\{x_{i}\right\}_{i=0}^{n-1}&\text{--- }&%
  269. \text{точка пересечения;}&\\
  270. &&\pnt{p}&=\left\{p_{i}\right\}_{i=0}^{n-1}&\text{--- }&%
  271. \text{точка принадлежащая прямой;}&\\
  272. &&\vec{v}&=\left\{v_{i}\right\}_{i=0}^{n-1}&\text{--- }&%
  273. \text{вектор коллинеарный прямой;}&\\
  274. &&\pnt{c}&=\left\{c_{i}\right\}_{i=0}^{n-1}&\text{--- }&%
  275. \text{центр сферы;}&\\
  276. &&r&&\text{--- }&\text{радиус сферы;}&\\
  277. &&n&&\text{--- }&\text{размерность пространства.}&
  278. \end{aligned}
  279. \end{array}
  280. \end{equation}
  281. \noindent%
  282. Полагаю излишним приводить решение данной системы уравнений, но необходимо
  283. отметить, что в период первоначального составления документа математические
  284. программы актуальных версий (Wolfram Mathematica, Mathcad Prime) при~${n>3}$
  285. дают неверные, но приближенные решения системы
  286. уравнений~\eqref{eq:line-sphere_system}. Так в ходе работы над алгоритмом было
  287. проведено ручное решение и декомпозиция системы~\eqref{eq:line-sphere_system}
  288. вплоть до~${n=5}$, что и обнаружило неточность машинных решений системы.
  289. Поэтому в случае необходимости модификации алгоритма и решения подобных систем
  290. уравнений осторожно относитесь к результатам машинного решения уравнений, если
  291. нет полной уверенности в точности алгоритма решения. Далее приведена
  292. окончательная формула искомой точки с декомпозицией (внимательно отнеситесь к
  293. индексам!):
  294. \begin{equation}
  295. \label{eq:line-sphere_intersection}
  296. \pnt{x}=\left\{
  297. x_{i}=p_{i}+
  298. \frac{v_{i}\left(l\pm\sqrt[2]{e^{2}-4df}\right)}{2dv_{0}}
  299. \right\}_{i=0}^{n-1}\text{,}
  300. \end{equation}
  301. \noindent где
  302. \begin{equation*}
  303. \begin{array}{ll}
  304. g=\sum\limits_{i=1}^{n-1}v_{i}^{2} & d=g+v_{0}^{2}\\
  305. h=\sum\limits_{i=1}^{n-1}\left(c_{i}-p_{i}\right)^{2}&%
  306. e=2\left(p_{0}g+v_{0}\left(c_{0}v_{0}+k\right)\right)\\
  307. k=\sum\limits_{i=1}^{n-1}v_{i}\left(c_{i}-p_{i}\right)\qquad&%
  308. f=v_{0}^{2}\left(c_{0}^{2}-r^{2}+h\right)+%
  309. p_{0}\left(p_{0}g+2v_{0}k\right)\\
  310. &l=2v_{0}\left(k+v_{0}\left(c_{0}-p_{0}\right)\right)
  311. \end{array}
  312. \end{equation*}
  313. Из формулы\footnote{Обратите внимание, что $d$~это дополнение суммы~$g$ до
  314. полной размерности~$n$ вектора~$\vec{v}$; а $l$~это произведение ${2v_{0}}$~на
  315. дополнение суммы~$k$ до полной размерности $n$ вектора~$\vec{v}$ и
  316. точек~$\pnt{p}$,~$\pnt{c}$. Данное замечание может быть полезно при реализации
  317. алгоритма.}~\eqref{eq:line-sphere_intersection} и геометрического смысла
  318. системы~\eqref{eq:line-sphere_system} очевидно, что любая прямая проходящая
  319. через центр сферы с~${r>0}$ в гладком эвклидовом пространстве имеет две точки
  320. пересечения с поверхностью сферы. Поэтому определим
  321. функцию~${\chi\left(\pnt{p},\vec{v},\pnt{c},r\right)}$ как
  322. \begin{equation}
  323. \label{eq:chi}
  324. \chi\left(\pnt{p},\vec{v},\pnt{c},r\right):\Leftrightarrow%
  325. \left\{\pnt{x}_{0},\pnt{x}_{1}\right\}\text{,}
  326. \end{equation}
  327. \noindent%
  328. где
  329. \begin{align*}
  330. \pnt{x}_{0}=\left\{
  331. x_{i}=p_{i}+
  332. \frac{v_{i}\left(l+\sqrt[2]{e^{2}-4df}\right)}{2dv_{0}}
  333. \right\}_{i=0}^{n-1}\,\,\,\text{ и }\,\,\,
  334. \pnt{x}_{1}=\left\{
  335. x_{i}=p_{i}+
  336. \frac{v_{i}\left(l-\sqrt[2]{e^{2}-4df}\right)}{2dv_{0}}
  337. \right\}_{i=0}^{n-1}
  338. \end{align*}
  339. \paragraph[Замечание]{Замечание.}\label{par:note_about_restrictions}Так как
  340. ожидается, что~${\pnt{x}\in\symbb{R}^{n}}$, то
  341. формула~\eqref{eq:line-sphere_intersection} влечёт явные ограничения.
  342. Так~${\pnt{x}\notin\symbb{R}^{n}}$ в следующих случаях:
  343. {\setlist[enumerate]{label*=(\alph*)}
  344. \begin{enumerate}[leftmargin=2\parindent]
  345. \item ${v_{0}=0}$, т.~е первая компонента вектора~$\vec{v}$
  346. системы~\eqref{eq:line-sphere_system} равна нолю. В
  347. геометрическом смысле вектор~$\vec{v}$ ортогонален абсциссе.
  348. \item $\|\vec{v}\|=0\Rightarrow{d=0}$, т.~е норма
  349. вектора~$\vec{v}$ и следовательно сумма~$d$ квадратов компонент
  350. вектора~$\vec{v}$ системы~\eqref{eq:line-sphere_system} в
  351. формуле~\eqref{eq:line-sphere_intersection} равны нолю. В
  352. геометрическом смысле вектор~$\vec{v}$ имеет нулевую длину, в
  353. связи с чем его направление не определено.
  354. \item ${e^{2}-4df<0}$, т.~е подкоренное выражение
  355. формулы~\eqref{eq:line-sphere_intersection} отрицательно. В
  356. геометрическом смысле это значит, что поверхность сферы не имеет
  357. общих точек с прямой в гладком эвклидовом пространстве. Может
  358. показаться, что такое невозможно раз уж прямая проходит через центр
  359. сферы, но как всегда есть нюансы: во\nobreakdash-первых это
  360. утверждение верно не для всех сочетаний размерностей; а,
  361. во\nobreakdash-вторых, особенности обработки чисел с плавающей
  362. запятой в практических реализациях алгоритма могут давать
  363. результаты не соответствующие абстрактным математическим ожиданиям.
  364. \end{enumerate}
  365. }
  366. \subsection{Общее описание алгоритма}
  367. \label{subsec:general_algorithm_description}
  368. В целом алгоритм является вариантом градиентного спуска с дополнительной
  369. информацией. Стоит напомнить, что согласно разделу~\ref{sec:introduction}
  370. аргументами алгоритма являются:
  371. \begin{itemize}
  372. \item размерность пространства ${n\in\symbb{N}}$;
  373. \item координаты ${m}$~точек~%
  374. ${\sofs{C}=\left\{\pnt{c}_{i}\in\symbb{R}^{n}\right\}_{i=0}^{m-1}}$,
  375. ${m\in\symbb{N}}$~и~${m>n}$;
  376. \item недостоверные расстояния~${R=\left\{r_{i}\right\}_{i=0}^{m-1}}$.
  377. \end{itemize}
  378. \noindent%
  379. Пары <<точка\nobreakdash-расстояние>> рассматриваются как описание множества
  380. сфер~${\sofsofs{S}=%
  381. \left\{\left\{\pnt{c}_{i},r_{i}\right\}\right\}_{i=0}^{m-1}}$~%
  382. (<<центр\nobreakdash-радиус>>), то есть постулируется взаимно однозначное
  383. соответствие по индексу известной точки и расстояния от неё до искомой точки.
  384. Далее приводится пошаговая схема алгоритма:
  385. \begin{enumerate}
  386. \item Методом~$\phi$~(разд.~\ref{subsubsec:first_approx_selection}~%
  387. \eqref{eq:phi}) выбирается начальное приближение искомой точки.
  388. \begin{equation*}
  389. \pnt{p}=\phi\left(\sofs{C}\right)
  390. \end{equation*}
  391. \item\itemlabel{item:the_second_step}{2} Выбирается
  392. сфера~${\left\{\pnt{c}_{j},r_{j}\right\}}$, поверхность которой
  393. наиболее удалена по~$\mu$~(разд.~%
  394. \ref{subsubsec:shortest_distance_to_sphere_surface}~\eqref{eq:mue})
  395. от~$\pnt{p}$.
  396. \begin{equation*}
  397. \forall\left\{\pnt{c},r\right\}\in\sofsofs{S}\,:\,\bigwedge\limits_{i=0}^{m-1}
  398. \mu\left(\pnt{p},\pnt{c}_{j},r_{j}\right)\geqslant
  399. \mu\left(\pnt{p},\pnt{c}_{i},r_{i}\right)
  400. \end{equation*}
  401. \item\itemlabel{item:the_third_step}{3} Методом~%
  402. $\chi$~(разд.~\ref{subsubsec:line-sphere_intersection_equation}~%
  403. \eqref{eq:chi}) рассчитывается пара
  404. точек~${\sofs{Q}=\left\{\pnt{q}_{0},\pnt{q}_{1}\right\}}$,
  405. принадлежащих сфере~${\left\{\pnt{c}_{j},r_{j}\right\}}$ и прямой
  406. проходящей через точки~$\pnt{c}$~и~$\pnt{p}$.
  407. \begin{equation*}
  408. \sofs{Q}=\left\{\pnt{q}_{0},\pnt{q}_{1}\right\}=
  409. \chi\left(\pnt{p},\vec{v},\pnt{c}_{j},r_{j}\right)
  410. \end{equation*}
  411. \item\itemlabel{item:chosing_point_from_pair}{4} К результатам~$\chi$
  412. применяется процедура~$\Lambda$, которая выбирает из пары~$\sofs{Q}$
  413. точку, для которой значение~%
  414. $\lambda$~(разд.~\ref{subsubsec:point_quality}~\eqref{eq:lambda})
  415. больше, или, иными словами, рассчитывается показатель качества
  416. приближения и выбирается наилучшее приближение искомой
  417. точки из пары~${\left\{\pnt{q}_{0},\pnt{q}_{1}\right\}}$.
  418. \begin{equation}
  419. \label{eq:chosing_point_from_pair}
  420. \Lambda\left(\sofs{Q},\sofs{C},R\right):\Leftrightarrow
  421. \left(\left.\pnt{t}\in\sofs{Q}\,\right|%
  422. \,\forall\pnt{q}\in\sofs{Q}\,:%
  423. \,\bigwedge\limits_{i=0}^{\left|\sofs{Q}\right|-1}%
  424. \lambda\left(\pnt{t},\sofs{C},R\right)\geqslant%
  425. \lambda\left(\pnt{q}_{i},\sofs{C},R\right)\right)
  426. \end{equation}
  427. \item\itemlabel{item:new_point_step}{5}%
  428. $\pnt{p}$~присваивается значение~$\Lambda$.
  429. \begin{equation*}
  430. \pnt{p}=\Lambda\left(\sofs{Q},\sofs{C},R\right)
  431. \end{equation*}
  432. \item Проверяется утверждение~$\prop{Z}$~%
  433. (разд.~\ref{subsubsec:the_last_iteration_condition}), если
  434. $\prop{Z}$~истинно, осуществляется переход к
  435. шагу~\ref{item:the_last_step}.
  436. \item\itemlabel{item:next_iteration}{7}%
  437. Переход к шагу~\ref{item:the_second_step}.
  438. \item\itemlabel{item:the_last_step}{8}%
  439. Методом~$\psi$~(разд.~\ref{subsubsec:point_refinement}~\eqref{eq:psi})
  440. осуществляется уточнение приближения искомой точки.
  441. \begin{equation*}
  442. \pnt{x}=\psi\left(\pnt{p},\sofs{C},R\right)
  443. \end{equation*}
  444. \end{enumerate}
  445. \subsection{Предположения}
  446. \label{subsec:assumptions}
  447. В данном разделе приведены неочевидные предположения, доказуемость которых
  448. неустановлена, но они обоснованы рядом аргументов или проверены эмпирическим
  449. путём. При этом надо понимать, что результат эмпирической проверки может быть
  450. статистической флуктуацией.
  451. \subsubsection{Выбор начального приближения искомой точки}
  452. \label{subsubsec:first_approx_selection}
  453. В принципе строгих ограничений выбора начального приближения искомой точки не
  454. выявлено. В случае если расстояния до искомой точки известны точно и являются
  455. абсолютно достоверными, то никаких ограничений на выбор начального приближения
  456. нет и можно брать случайную точку. Но если расстояния до искомой точки
  457. недостоверны, то в ряде случаев при <<неудачном>> выборе начального приближения,
  458. результат работы алгоритма может не быть <<лучшим>>, а только <<хорошим>>
  459. приближением. Это связано с тем, что в данном ряде случаев может быть не одна,
  460. а несколько областей, в которых вероятно присутствие искомой точки. Если
  461. говорить в терминах градиентного спуска, то может быть более одного глобального
  462. экстремума функции~$\lambda$ и/или ещё и несколько локальных экстремумов, в
  463. один из которых и приведёт алгоритм, в случае <<плохого>> выбора начального
  464. приближения. В связи с этим были изучены несколько подходов к выбору начального
  465. приближения при прочих равных, и проверены эмпирически на нерепрезентативной
  466. выборке:
  467. \begin{enumerate}
  468. \item Использовать в качестве начального приближения один из
  469. центров~$\sofs{C}$.
  470. \item Использовать в качестве начального приближения одну из вершин
  471. параллелограмма (естественно, $n$\nobreakdash-мерного), грани которого
  472. являются касательными к сферам в различных точках.
  473. \item\itemlabel{item:first_point_select_approach}{3} Использовать в
  474. качестве приближения усреднение по точкам~$\sofs{C}$.
  475. \end{enumerate}
  476. \noindent%
  477. В данном документе не приводится статистика проверок предложенных методов, в
  478. связи с тем, что (1) данный список не исчерпывающий, был проверен примерно
  479. десяток подходов, но записи о них производились на черновиках и утрачены; (2)
  480. выборка при проверке была нерепрезентативна и при принятии решения бесполезна;
  481. (3) ни один из проверенных способов не показал полного избегания локальных
  482. экстремумов, то есть независимо от выбора подхода возникают ситуации, при
  483. которых алгоритм завершается не в глобальном, а в локальном экстремуме
  484. функции~$\lambda$.
  485. Лучший эмпирический результат показал и наиболее обоснованным представляется
  486. метод~\ref{item:first_point_select_approach}, в связи с чем функция~$\phi$
  487. определена как
  488. \begin{equation}
  489. \label{eq:phi}
  490. \phi\left(\sofs{C}\right):\Leftrightarrow%
  491. \left\{\left.\sum\limits_{i=0}^{m-1} c_{i,j}\right/ m\right\}_{j=0}^{n-1}
  492. \end{equation}
  493. \noindent%
  494. В формуле~\eqref{eq:phi} используется среднее арифметическое, но допустимо
  495. поэкспериментировать с другими степенными средними, а при достаточно больших
  496. значениях~$n$ можно испытать и нестепенные средние. По крайней мере, на момент
  497. написания документа, не было сформулировано аргументов против использования
  498. других средних.
  499. В практической реализации алгоритма, если время принятия решения позволяет или
  500. есть возможность параллельных вычислений, можно снизить вероятность <<плохого>>
  501. выбора начального приближения путём вычисления алгоритма из нескольких начальных
  502. приближений подобранных разными методами, а затем выбрать из нескольких
  503. результатов приближение с наилучшим
  504. качеством~(см.~разд.~\ref{subsubsec:point_quality}). Так, например, в прототипе
  505. алгоритма в качестве начального приближения берутся общее усреднение по
  506. известным точкам и попарные усреднения со сдвигом, в последствии выбирается
  507. наилучшее конечное приближение.
  508. \subsubsection{Критерий качества точки}
  509. \label{subsubsec:point_quality}
  510. Предполагается, что в искомой точке расстояния до всех сфер равны нолю, а для
  511. наилучшего приближения минимальны, в связи с чем критерий качества точки может
  512. быть выражен очень разными способами, дающими, в общем, сходные результаты.
  513. Поэтому в качестве критерия был выбран самый простой, а именно отрицательная
  514. сумма расстояний от точки до поверхности всех сфер.
  515. \begin{equation}
  516. \label{eq:lambda}
  517. \lambda\left(\pnt{p},\sofs{C},R\right):\Leftrightarrow%
  518. -\sum\limits_{i=0}^{m-1}\mu\left(\pnt{p},\pnt{c}_{i},r_{i}\right)
  519. \end{equation}
  520. Отрицательная сумма взята исключительно из эстетических соображений, чтобы
  521. показатель качества рос с приближением к точке пересечения сфер, в которой он
  522. очевидно обращается в ноль, а если расстояния недостоверны, то просто
  523. максимизируется.
  524. Также как и выбор начального приближения точки, данная функция качества была
  525. проверена эмпирически среди других подходов, показала хороший результат, имеет
  526. достаточно очевидную и твёрдую аргументацию под собой, но не доказательство. Её
  527. можно сменить, например, на средние расстояний или иным образом, исходя из иных
  528. предположений о качестве точки.
  529. \subsubsection{Условие последней итерации}
  530. \label{subsubsec:the_last_iteration_condition}
  531. Условием последней итерации является истинность утверждения~$\prop{Z}$. Само
  532. утверждение~$\prop{Z}$ сильно зависит от решаемой задачи и обстановки
  533. исполнения алгоритма. Поэтому будет рассмотрено три варианта
  534. утверждения~$\prop{Z}$, в зависимости от надёжности значений~$R$ и требований
  535. обстановки.
  536. \paragraph[Утверждение~\texorpdfstring{$\prop{Z}$}{Z} при абсолютно точных
  537. значениях~\texorpdfstring{$R$}{R}]{Утверждение~$\prop{Z}$ при абсолютно точных
  538. значениях~$R$.}
  539. Так, в случае если расстояния от известных точек до искомой достоверны и
  540. абсолютно точны\footnote{В контексте документа абсолютно точными можно считать
  541. значения~$R$ при абстрактном анализе алгоритма без использования актуальных
  542. значений, либо ситуацию, когда ошибка измерения в датчике\nobreakdash-источнике
  543. значений~$R$ существенно меньше машинного~$\varepsilon$~(эпсилон).}, то
  544. последней считается итерация, после которой сумма расстояний от найденного
  545. приближения до поверхности всех сфер равна нолю или
  546. машинному~$\varepsilon$~(эпсилон).
  547. \begin{equation*}
  548. \label{eq:zed_without_uncertainty}
  549. \prop{Z}\Leftrightarrow%
  550. \sum\limits_{i=0}^{m-1}\mu\left(\pnt{p},\pnt{c}_{i},r_{i}\right)=0
  551. \end{equation*}
  552. \noindent%
  553. При истинности такого утверждения шаг~\ref{item:the_last_step} алгоритма можно
  554. пропустить, так как уточнять приближение не требуется, да и невозможно. Но
  555. вероятность возникновения такой ситуации в реальности стремиться к нолю,
  556. поэтому рассмотрим другое утверждение~$\prop{Z}$ при ухудшении обстановки.
  557. \paragraph[Утверждение~\texorpdfstring{$\prop{Z}$}{Z} при недостоверных
  558. значениях~\texorpdfstring{$R$}{R} и известной допустимой ошибке
  559. приближения~\texorpdfstring{$\Delta$}{Дельта}]%
  560. {Утверждение~$\prop{Z}$ при недостоверных значениях~$R$ и известной допустимой
  561. ошибке приближения~$\Delta$.}
  562. Предположим, множество~$R$ содержит заведомо неточные расстояния, но для
  563. принятия решения, необходимо приближение, расположенное не далее, чем
  564. в~$\Delta$ от искомой точки. В таком случае, учитывая, что на
  565. шаге~\ref{item:new_point_step} алгоритма
  566. ${\exists\sofs{S}_{i}\in\sofsofs{S}\,:\,\pnt{p}\in\sofs{S}_{i}\Rightarrow%
  567. \mu\left(\pnt{p},\pnt{c}_{i},r_{i}\right)=0}$, то если расстояния от данного
  568. приближения до всех из $m-1$~приближений, которые могут быть получены
  569. относительно других сфер, меньше~$\Delta$, утверждение~$\prop{Z}$ истинно.
  570. \begin{equation*}
  571. \label{eq:zed_with_uncertainty_and_delta}
  572. \prop{Z}\Leftrightarrow%
  573. \bigwedge\limits_{i=0}^{m-1}\mu\left(\pnt{p},\pnt{c}_{i},r_{i}\right)<\Delta
  574. \end{equation*}
  575. \noindent%
  576. В зависимости от задачи и обстановки можно использовать строгое и нестрогое
  577. сравнение.
  578. Необходимо понимать, что использование такого утверждения возможно только
  579. тогда, когда погрешность измерения в датчике\nobreakdash-источнике значений~$R$
  580. существенно меньше~$\Delta$. Иными словами, если известно матожидание
  581. погрешности датчиков\nobreakdash-источников~$R$, то допустимо использовать эту
  582. величину с запасом~(например,~${2\times 3\sigma}$) в качестве~$\Delta$. Если же
  583. $\Delta$~меньше погрешности датчиков\nobreakdash-источников значений~$R$,
  584. возникнет ситуация, при которой состояние <<$\prop{Z}$ \textit{истинно}>>
  585. недостижимо, в связи с чем рассмотрим наихудшую обстановку.
  586. \paragraph[Утверждение~\texorpdfstring{$\prop{Z}$}{Z} при недостоверных
  587. значениях~\texorpdfstring{$R$}{R} и отсутствии информации о допустимой ошибке
  588. приближения]{Утверждение~$\prop{Z}$ при недостоверных значениях~$R$ и
  589. отсутствии информации о допустимой ошибке приближения.}
  590. Наихудшая ситуация, но и наиболее частая на практике: значения~$\sofs{C}$~и~$R$
  591. недостоверны и информации о величине возможной ошибки нет и не предвидится. Для
  592. этого было эмпирически выработано утверждение~$\prop{Z}$, которое может
  593. показаться избыточным, однако, соответствуют неким ситуациям, возникшим в ходе
  594. эксплуатации реализации алгоритма. В связи с вышеизложенным, если нет
  595. уверенности в минимальной стабильности обстановки работы алгоритма,
  596. рекомендуется использовать данное или ещё более строгое относительно данного
  597. утверждение~$\prop{Z}$.
  598. \begin{equation}
  599. \label{eq:zed_with_total_uncertainty}
  600. \prop{Z}\Leftrightarrow%
  601. \left(\forall\lambda\in L\,:\,%
  602. \bigwedge\limits_{i=\omega-m^{2}}^{\omega}%
  603. \lambda_{max}\geqslant\lambda\left(%
  604. \pnt{p}_{i},\sofs{C},R\right)\right)\vee%
  605. \omega\geqslant\left(wm\right)\text{,}
  606. \end{equation}
  607. \noindent где
  608. \begin{itemize}[leftmargin=2\parindent]
  609. \item[]$\omega$\kern1ex---\kern1ex номер текущей итерации алгоритма,
  610. увеличение~$\omega$ на единицу происходит на
  611. шаге~\ref{item:next_iteration} алгоритма;
  612. \item[]${L=\left\{
  613. \lambda\left(\pnt{p}_{i},\sofs{C},R\right)
  614. \right\}_{i=\omega-m^{2}}^{\omega}}$\kern1ex---\kern1ex множество
  615. значений функции~$\lambda$ для ${m^{2}}$ последних итераций,
  616. соответственно ${\pnt{p}_{i}}$~--~приближение $i$\nobreakdash-той
  617. итерации;
  618. \item[]${\left.\lambda_{max}\,\right|\,\forall\lambda\in%
  619. \left\{\lambda\left(
  620. \pnt{p}_{i},\sofs{C},R\right)\right\}_{i=0}^{\omega-1}\,:\,%
  621. \bigwedge\limits_{i=0}^{\omega-1}\lambda_{max}\geqslant\lambda\left(
  622. \pnt{p}_{i},\sofs{C},R\right)}$\kern1ex---\kern1ex максимальное
  623. значение функции~$\lambda$ среди всех итераций алгоритма,
  624. кроме последней;
  625. \item[]$w$\kern1ex---\kern1ex предопределённая константа, которая
  626. определяет максимально возможное количество итераций из расчёта
  627. на количество известных сфер, иными словами, если прошло
  628. ${\left(wm\right)}$~итераций, то производим уточнение~$\psi$ и
  629. возвращаем результат.
  630. \end{itemize}
  631. $w$~выбирается исходя из ограничений по времени и в прототипе определено
  632. как~${100}$ на сферу (см.~раздел~\ref{subsubsec:prototype_settings}), а значит
  633. прототип всегда завершается после ${100m}$ итераций и переходит к
  634. уточнению~$\psi$. Очевидно, что $w$~должно выбираться так, что~${w>m}$, ведь
  635. в ином случае становится бессмысленным сравнение с ${\lambda_{max}}$ для
  636. последних ${m^{2}}$~итераций, либо должен быть снижен критерий количества
  637. итераций без улучшения под~${m^{2}}$.
  638. Данное условие обосновано только эмпирически и может быть изменено в
  639. соответствии с иными представлениями об обстоятельствах влекущих завершение
  640. работы алгоритма. Дополнительные соображения по выбору~$w$ в условиях строгих
  641. ограничений на время исполнения алгоритма приведены
  642. в~\hyperref[impNote:on_w]{замечании} к
  643. разделу~\ref{subsubsec:prototype_settings}.
  644. \subsubsection{Уточнение приближения последней итерации}
  645. \label{subsubsec:point_refinement}
  646. Учитывая, что все точки полученные как значение функции~$\chi$ принадлежат
  647. поверхности одной из известных сфер, а при неточных значениях расстояний~$R$
  648. сферы вероятнее всего не имеют единой точки пересечения, следовательно любое
  649. приближение принадлежащее одной из сфер будет иметь ненулевое расстояние до
  650. одной или более других сфер. В связи с этим имеет смысл уточнять приближение
  651. полученное после установления истинности высказывания~$\prop{Z}$ таким образом,
  652. чтобы в идеальном случае (когда расстояние от приближения до всех сфер равно
  653. нолю) уточнение не перемещало точку~$\pnt{p}$. В числе прочих для этого
  654. подходит усреднение по $m$~точкам, которые являются результатом выбора лучшего
  655. приближения для каждой из известных сфер от текущего приближения, или в
  656. символах:
  657. \begin{equation}
  658. \label{eq:psi}
  659. \psi\left(\pnt{p},\sofs{C},R\right):\Leftrightarrow
  660. \left\{\left.\sum\limits_{i=0}^{m-1} t_{i,j}\right/ m\right\}_{j=0}^{n-1}
  661. \text{,}
  662. \end{equation}
  663. \noindent%
  664. где
  665. \begin{equation*}
  666. \sofs{T}=\left\{
  667. \pnt{t}_{i}=\Lambda\left(
  668. \chi\left(\pnt{p},\vec{v},\pnt{c}_{i},r_{i}\right),\sofs{C},R\right)
  669. \right\}_{i=0}^{m-1}
  670. \end{equation*}
  671. \noindent%
  672. и $\Lambda$~---~процедура~\eqref{eq:chosing_point_from_pair}, определённая для
  673. шага~\ref{item:chosing_point_from_pair} общего описания алгоритма в
  674. разделе~\ref{subsec:general_algorithm_description}.
  675. Данный подход выбирался исходя из ситуации полной неопределённости погрешности
  676. датчиков\nobreakdash-источников~$R$ и даже более сильном условии, состоящим в
  677. том, что сама искомая точка принципиально не определяема точно. Поэтому, исходя
  678. из особенностей частной обстановки применения алгоритма, вполне возможно, что и
  679. среднее арифметическое, и метод~$\Lambda$, и процедура уточнения в целом могут
  680. быть изменены на релевантные специфичным условиям применения алгоритма.
  681. \section{Прототип}
  682. \label{sec:prototype}
  683. Прототип представляет собой реализацию вышеописанного алгоритма на языке~C.
  684. Прототип не является строго оптимальной реализацией алгоритма и предназначен
  685. для проверки возможных изменений алгоритма и сравнения результатов
  686. (регресс\nobreakdash-оценки). Но в целом, если к программному обеспечению не
  687. предъявляется строгих требований по времени и пространству исполнения, то можно
  688. использовать прототип <<как есть>>.
  689. \subsection{Состав прототипа}
  690. \label{subsec:prototype_content}
  691. Получить копию прототипа можно по адресу:\\*%
  692. {\small\href{https://ggs.void.r4in.tk/hk/%
  693. iterative_point_recovery/archive/master.tar.gz}%
  694. {\nolinkurl{https://ggs.void.r4in.tk/hk/%
  695. iterative\_point\_recovery/archive/master.tar.gz}}}\\%
  696. после чего распаковать полученный архив. Кроме того, при наличии установленной
  697. СКВ Git (\href{https://git-scm.com}{\nolinkurl{https://git-scm.com}}) можно
  698. получить копию прототипа командой\\*
  699. {\small\centerline{%
  700. \Verb|git clone https://ggs.void.r4in.tk/hk/iterative\_point\_recovery.git|}}
  701. В состав прототипа входят следующие файлы и каталоги:\par\nopagebreak
  702. \noindent\begin{samepage}\begin{minipage}[t]{\linewidth}
  703. {\small\dirtree{%
  704. .1 iterative\_point\_recovery/.
  705. .2 documentation/\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}%
  706. исходный код и сопутствующие файлы данного документа,
  707. см.~раздел~\ref{subsec:prototype_documentation_source}.
  708. \end{minipage}}.
  709. .2 examples/\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}исходный
  710. код с примерами использования прототипа,
  711. см.~раздел~\ref{subsec:prototype_use_examples}.
  712. \end{minipage}}.
  713. .2 src/\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}исходный код
  714. собственно прототипа,
  715. см.~раздел~\ref{subsec:prototype_prototype}.\end{minipage}}.
  716. .2 test\_suite/\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}исходный
  717. код проверочного комплекта прототипа,
  718. см.~раздел~\ref{subsec:prototype_testing}.\end{minipage}}.
  719. .2 visualisation/\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}набор
  720. сценариев для визуализации результатов тестирования,
  721. см.~раздел~\ref{subsec:prototype_testing}.\end{minipage}}.
  722. .2 Makefile\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}сценарий
  723. сборки прототипа,
  724. см.~раздел~\ref{subsec:prototype_prototype}.\end{minipage}}.
  725. }}
  726. \end{minipage}\end{samepage}
  727. Далее рассмотрены составляющие прототипа, даны их краткие описания и
  728. руководства по использованию.
  729. \subsection{Прототип. Сборка и описание}
  730. \label{subsec:prototype_prototype}
  731. Основной блок прототипа представляет собой функцию на языке C, которая может
  732. быть собрана в библиотеку или использована в виде исходного кода <<как есть>>.
  733. К основному блоку прототипа относятся:\par\nopagebreak
  734. \noindent\begin{samepage}\begin{minipage}[t]{\linewidth}
  735. {\small\dirtree{%
  736. .1 iterative\_point\_recovery/.
  737. .2 \ldots.
  738. .2 src/.
  739. .3 include\_hd/.
  740. .4 iterative\_point\_recovery.clh\DTcomment{\\\hspace*{\fill}%
  741. \begin{minipage}[t]{0.6666667\linewidth} заголовочный (header)
  742. файл, содержащий объявления функций и структур прототипа,
  743. см.~раздел~\ref{subsubsec:prototype_functions_and_structures}.
  744. \end{minipage}}.
  745. .4 ptrc\_hd\_settings.clh\DTcomment{\\\hspace*{\fill}%
  746. \begin{minipage}[t]{0.6666667\linewidth} заголовочный (header)
  747. файл, содержащий настройки прототипа,
  748. см.~раздел~\ref{subsubsec:prototype_settings}.\end{minipage}}.
  749. .3 iterative\_point\_recovery.clc\DTcomment{\\\hspace*{\fill}%
  750. \begin{minipage}[t]{0.6666667\linewidth} файл, содержащий
  751. определения функций прототипа,
  752. см.~раздел~\ref{subsubsec:prototype_functions_and_structures}.
  753. \end{minipage}}.
  754. .2 \ldots.
  755. .2 Makefile\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}сценарий
  756. сборки прототипа в библиотеку,
  757. см.~раздел~\ref{subsubsec:prototype_build_and_install}.
  758. \end{minipage}}.
  759. }}
  760. \end{minipage}\end{samepage}
  761. \subsubsection{Сборка и установка прототипа}
  762. \label{subsubsec:prototype_build_and_install}
  763. \paragraph[Сборка]{Сборка.}
  764. \begin{samepage}
  765. Для сборки по умолчанию необходимо перейти в каталог
  766. \verb|iterative_point_recovery| и выполнить команду\par\nopagebreak
  767. \indent\indent\verb|make|
  768. \end{samepage}
  769. \noindent Если команда завершена без ошибок, то в
  770. каталоге \verb|iterative_point_recovery/build| появится
  771. файл \verb|libIterPntRcv.so.|\verbI{I}\verb|.|\verbI{J} и несколько
  772. несколько служебных файлов. В имени файла \verbI{I}~--~основная версия
  773. библиотеки, а \verbI{J}~--~дополнительная.
  774. При необходимости возможна сборка для отладки (debug) командой\par\nopagebreak
  775. \indent\indent\verb|make debug|
  776. Если при сборке указать переменную \verb|GPGPU_DEV_IDX=|\verbI{N}, например
  777. так\par\nopagebreak
  778. \indent\indent\verb|make GPGPU_DEV_IDX=0|\par
  779. \noindent%
  780. то, при наличии установленного пакета OpenCL\_helpers
  781. (\href{https://ggs.void.r4in.tk/hk/OpenCL_helpers}%
  782. {\nolinkurl{https://ggs.void.r4in.tk/hk/OpenCL\_helpers}}), кроме обычной
  783. библиотеки будет собрана OpenCL\nobreakdash-библиотека с прототипом для
  784. GPGPU\nobreakdash-устройства с индексом~\verbI{N} в системе. Если пакет
  785. OpenCL\_helpers был установлен не в путь по умолчанию, то надо указать
  786. актуальный путь в переменной \verb|OCLH_PATH=|\verbI{путь\_установки}. После
  787. сборки с указанием переменной~\verb|GPGPU_DEV_IDX|, если сборка завершена без
  788. ошибок, в каталоге \verb|iterative_point_recovery/build| появится появится
  789. дополнительный
  790. файл~\verb|libIterPntRcv-|\verbI{имя\_устройства\_GPGPU}\verb|.clso|.
  791. \paragraph[Установка]{Установка.}
  792. Установка осуществляется командой\par\nopagebreak
  793. \indent\indent\verb|make install|\par
  794. \noindent%
  795. В результате будет создан каталог \verb|~/opt/iterative_point_recovery|, куда в
  796. подкаталоги \verb|lib|, \verb|include_hd| будут скопированы файлы библиотеки и
  797. заголовочные файлы соответственно. Затем целесообразно добавить каталог
  798. \verb|~/opt/iterative_point_recovery/lib| в переменную
  799. окружения~\verb|LD_LIBRARY_PATH|.
  800. Можно изменить целевой путь если задать команду\par\nopagebreak
  801. \indent\indent\verb|make PRFX_PATH=|\verbI{путь\_установки}\verb| install|
  802. \paragraph[Удаление]{Удаление.}
  803. Удаление производится командой\par\nopagebreak
  804. \indent\indent\verb|make uninstall|\par
  805. \noindent либо\par\nopagebreak
  806. \indent\indent\verb|make PRFX_PATH=|\verbI{путь\_установки}\verb| uninstall|%
  807. \par
  808. \noindent если установка производилась не в каталог по умолчанию.
  809. \subsubsection{Настройки прототипа}
  810. \label{subsubsec:prototype_settings}
  811. Настройка прототипа производится изменением макроопределений в
  812. файле \verb|src/include_hd/ptrc_hd_settings.clh|:\par\medskip
  813. {\NmCnvDescript \verb|_PTRC_VAL_T|\\* тип значений с плавающей точкой компонент
  814. точек и векторов. Допустимые значения \verb|half|, \verb|float|,
  815. \verb|double|, \verb|long double|. Учитывайте, поддерживается ли данный тип
  816. компилятором и математическими библиотеками или, иными словами, перегружены
  817. ли для данного типа операторы \verb|+|, \verb|-|, \verb|*|, \verb|/| и
  818. функции \verb|sqrt()|, \verb|abs()|. Также учитывайте, что на момент
  819. написания данного документа тип \verb|long double| и более длинные чаще
  820. всего обрабатываются не аппаратно, а программно, что влечёт значительное
  821. увеличение времени расчётов. В прототипе данное макроопределение
  822. установлено в значение~\verb|flt32_t|.\par\medskip}
  823. {\NmCnvDescript \verb|_PTRC_MAX_ITERATIONS_ON_SPHERE|\\* значение~$w$
  824. условия~$\prop{Z}$ (см.~разд.~\ref{subsubsec:the_last_iteration_condition}%
  825. ~\eqref{eq:zed_with_total_uncertainty}). В прототипе данное
  826. макроопределение установлено в значение~\verb|100|.
  827. \begin{ImpNote}
  828. \itemlabel{impNote:on_w} введение данной настройки может
  829. показаться бессмысленным, так как вероятность срабатывания
  830. условия~${\omega\geqslant\left(wm\right)}$~%
  831. (разд.~\ref{subsubsec:the_last_iteration_condition}%
  832. ~\eqref{eq:zed_with_total_uncertainty}) очень мала, но ненулевая. Для RTOS
  833. в условиях строгого ограничения времени эта настройка становится
  834. актуальной, поэтому рекомендуется использовать следующие подходы для
  835. выбора~$w$:
  836. \begin{equation*}
  837. w=\left\lfloor\frac{\left.\prop{CutOff}\right/
  838. \prop{ExecT}}{m}\right\rfloor\text{,}
  839. \end{equation*}\\
  840. где\\{\addtolength{\leftskip}{2ex}%
  841. $m$~---~количество известных сфер (датчиков\nobreakdash-источников
  842. расстояний);\par}\nointerlineskip\\{\addtolength{\leftskip}{2ex}%
  843. ${\prop{CutOff}}$~---~интервал времени отсечки восстановления точки (по
  844. истечении этого интервала результат восстановления теряет смысл). Может
  845. измеряться в секундах (чаще нано\nobreakdash- или микро\nobreakdash-) для
  846. гибридных архитектур процессоров или в тактах для традиционных
  847. архитектур;\par}\nointerlineskip\\{\addtolength{\leftskip}{2ex}%
  848. ${\prop{ExecT}}$~---~интервал времени выполнения (в тех же единицах,
  849. что и~${\prop{CutOff}}$) функции \verb|_ptrc_recoverPoint()|
  850. (см.~раздел~\ref{subsubsec:prototype_functions_and_structures}) при
  851. \verb|_PTRC_MAX_ITERATIONS_ON_SPHERE| определённом как~\verb|1|,
  852. аргументе~\verb|u64NofRuns| равном~\verb|1| и точном выходе по
  853. условию~${\omega\geqslant\left(wm\right)}$.\par}\nointerlineskip\\
  854. Оценка ${\prop{ExecT}}$ для традиционных архитектур процессоров
  855. должна показывать постоянное время отличающееся от запуска к запуску менее,
  856. чем на время одного такта процессора и может оцениваться по количеству
  857. машинных команд. Если такого не наблюдается или используется процессор
  858. гибридной архитектуры, то рекомендуется брать максимальное
  859. значение~${\prop{ExecT}}$ не менее чем от $10000$ замеров, так как
  860. практические оценки показывают, что кривая времени для гибридных архитектур
  861. достаточно сглаживается только на $10$\nobreakdash-ти тысячах и более
  862. замеров.
  863. \par\nointerlineskip\\
  864. При замерах необходимо учитывать контур размещения внутренних часов
  865. процессора, по возможности использовать замеры времени по часам на
  866. внутреннем контуре. Необходимо учитывать количество регистров часов и
  867. возможность множественных переполнений.\par\nointerlineskip\\
  868. Данный подход сформулирован исходя из пессимистичных соображений оценки
  869. времени и тактов исполнения, и даёт время/такты <<с запасом>>, что
  870. идеологически верно, однако при уверенности в стабильности работы
  871. архитектуры и константных оценках времени/тактов можно добавить оптимизма
  872. и, проведя поблочную оценку времени исполнения одной итерации алгоритма в
  873. прототипе, уточнить оценку приемлемого значения~$w$.
  874. \end{ImpNote}
  875. \par\medskip}
  876. {\NmCnvDescript \verb|_PTRC_NONRECONSTRUCTABLE_PNT_ERR|\\* значение
  877. возвращаемое функцией в случае когда нет возможности сформировать
  878. приближение искомой точки или, иными словами это код ошибки <<точка не
  879. восстанавливаема>>. Такая ошибка возвращается в случае
  880. если~${m<n+1}$~(см.~сноску~\ref{note:m_restriction} на
  881. стр.~\pageref{note:m_restriction}); в случаях
  882. из~\hyperref[par:note_about_restrictions]{замечания} на
  883. стр.~\pageref{par:note_about_restrictions}; и если указано нулевое
  884. количество проверяемых начальных
  885. приближений~(см.~аргумент \verb|u64NofRuns| основной функции прототипа в
  886. разделе~\ref{subsubsec:prototype_functions_and_structures}). В прототипе
  887. данное макроопределение установлено в значение~\verb|73|.\par}
  888. {\NmCnvDescript \verb|_PTRC_MEMALLOC_ERR|\\* значение функции, возвращаемое в
  889. случае ошибки выделения памяти. В прототипе данное макроопределение
  890. установлено в значение~\verb|-150|.\par}
  891. \subsubsection{Функции и структуры прототипа}
  892. \label{subsubsec:prototype_functions_and_structures}
  893. Почти все структуры и функции объявлены и определены таким образом, что
  894. прототип без изменений компилируется как компилятором соответствующим
  895. стандарту~C11 (ISO/IEC~9899:2011), так и компиляторами
  896. OpenCL\nobreakdash-диалекта~С версии~1.2 и выше. Это достигается за счёт
  897. широкого использования препроцессора языка~C и макроопределением, указывающим,
  898. что необходимо осуществлять сборку для OpenCL\nobreakdash-диалекта~С, является
  899. макроопределение \verb|_OCLH_OCL_COMPILER_|~--~если оно определено, то
  900. препроцессор сгенерирует код OpenCL\nobreakdash-диалекта~С, в ином случае будет
  901. сгенерирован код соответствующий стандарту~C11. Самостоятельно определять
  902. \verb|_OCLH_OCL_COMPILER_| нет необходимости, если вы используете пакет
  903. OpenCL\_helpers, который автоматически определяет данный макрос при компиляции.
  904. Кроме того, в связи с особенностями выделения памяти на GPGPU и вычислительных
  905. акселераторах, код OpenCL\nobreakdash-диалекта~С использует заголовочный файл
  906. \verb|oclh_d_mem_alloc.clh| пакета OpenCL\_helpers.
  907. \begin{ImpNote}
  908. Пакет OpenCL\_helpers реализует единый механизм выделения памяти для
  909. вычислительных акселераторов как без прямого доступа к оперативной памяти
  910. несущего компьютера, так и с таким доступом. Но для акселераторов с доступом
  911. данный механизм может работать медленнее, чем реализации
  912. \verb|malloc()|/\verb|free()| от их производителей. Для использования
  913. выделения, проверки и освобождения памяти релевантных диалекту
  914. OpenCL\nobreakdash-диалекта~С конкретного вычислительного акселератора
  915. необходимо переопределить макропределения \verb|__PTRC_VAL_T_alloc_and_check| и
  916. \verb|__PTRC_VAL_T_free| в файле
  917. \verb|src/include_hd/iterative_point_recovery.clh|.
  918. \end{ImpNote}
  919. \paragraph[Структура, описывающая исходные данные]%
  920. {Структура, описывающая исходные данные.}
  921. Исходные данные хранятся и передаются в структуре\par\nopagebreak
  922. \begin{Verbatim}[samepage=true,fontsize=\small]
  923. typedef struct _PTRC_INPUT_DATA {
  924. uint64_t u64D;
  925. __private _PTRC_VAL_T* pfCnt;
  926. __private _PTRC_VAL_T* pfRds;
  927. uint64_t u64NofS;
  928. } _PTRC_INDAT;
  929. \end{Verbatim}
  930. \noindent Модификаторы \verb|__private| не имеют смысла для языка~C
  931. стандарта~C11 и будут проигнорированы в соответствии с макроопределением.
  932. Для OpenCL\nobreakdash-диалекта~С эти модификаторы обозначают, что указатели
  933. указывают на собственную память нити исполнения.\par\medskip
  934. {\NmCnvDescript \verb|u64D|\\* размерность пространства.\par\medskip}
  935. {\NmCnvDescript \verb|pfCnt|\\* указатель на координаты \verb|u64NofS|~центров
  936. известных сфер, по \verb|u64D|~значений для каждого центра.\par\medskip}
  937. {\NmCnvDescript \verb|pfRds|\\* указатель на \verb|u64NofS|~неточных расстояний
  938. от центров известных сфер до искомой точки.\par\medskip}
  939. {\NmCnvDescript \verb|u64NofS|\\* количество известных сфер.\par\medskip}
  940. \paragraph[Основная функция прототипа]{Основная функция прототипа.}
  941. Основной функцией прототипа является \verb|_ptrc_recoverPoint()| и для
  942. стандарта C11 она объявлена как\par\nopagebreak
  943. \begin{Verbatim}[samepage=true,fontsize=\small]
  944. int32_t _ptrc_recoverPoint( _PTRC_VAL_T* const pfDst,
  945. _PTRC_VAL_T* const pfQlt,
  946. const _PTRC_INDAT in,
  947. const uint64_t u64NofRuns)
  948. \end{Verbatim}
  949. \noindent а для OpenCL\nobreakdash-диалекта~С как\par\nopagebreak
  950. \begin{Verbatim}[samepage=true,fontsize=\small]
  951. int32_t _ptrc_recoverPoint(__private _PTRC_VAL_T* const pfDst,
  952. __private _PTRC_VAL_T* const pfQlt,
  953. __private const _PTRC_INDAT in,
  954. __private const uint64_t u64NofRuns,
  955. _GDM_heap_PROTO(__private))
  956. \end{Verbatim}
  957. Функция возвращает~\verb|0| в случае нахождения приближения,
  958. \verb|_PTRC_MEMALLOC_ERR|~--~в случае ошибки выделения памяти и
  959. \verb|_PTRC_NONRECONSTRUCTABLE_PNT_ERR|~--~в случае если восстановление точки
  960. не представилось возможным (коды ошибок
  961. см.~в~разд.~\ref{subsubsec:prototype_settings}).\par\medskip
  962. {\NmCnvDescript \verb|in|\\* исходные данные в виде
  963. структуры~\verb|_PTRC_INDAT|.\par\medskip}
  964. {\NmCnvDescript \verb|pfDst|\\* указатель на память размером не менее чем
  965. \verb|in.u64D| размеров \verb|_PTRC_VAL_T|, где будет сохранено лучшее
  966. найденное приближение.\par\medskip}
  967. {\NmCnvDescript \verb|pfQlt|\\* указатель на память размером не менее чем
  968. один размер \verb|_PTRC_VAL_T|, где будет сохранен показатель
  969. качества~$\lambda$ (см.~раздел~\ref{subsubsec:point_quality}) лучшего
  970. найденного приближения.\par\medskip}
  971. {\NmCnvDescript \verb|u64NofRuns|\\* количество начальных приближений, от
  972. которых будет произведён поиск наилучшего приближения. Первое начальное
  973. приближение является усреднением по центрам известных сфер, последующие
  974. начальные приближения являются попарными усреднениями известных центров сфер со
  975. сдвигом к лучшему найденному приближению. Если \verb|u64NofRuns<1|, то функция
  976. вернёт \verb|_PTRC_NONRECONSTRUCTABLE_PNT_ERR|.\par\medskip}
  977. {\NmCnvDescript \verb|_GDM_heap_PROTO(__private)|\\*
  978. макроопределение\nobreakdash-прототип собственной <<кучи>> нити исполнения
  979. OpenCL для выделения памяти. При вызове функции в качестве данного аргумента
  980. передаётся макроопределение \verb|_GDM_heap_ARG(__private)|. Перед
  981. использованием макроопределения \verb|_GDM_heap_ARG(__private)| собственная
  982. <<куча>> нити исполнения должна быть инициализирована макроопределением
  983. \verb|_GDM___private_heap_init()|.\par\medskip}
  984. \paragraph[Внутренние функции и структуры прототипа]%
  985. {Внутренние функции и структуры прототипа.}
  986. Далее обзорно описаны функции, вызываемые при выполнении
  987. \verb|_ptrc_recoverPoint()|. Модификаторы \verb|__private| не имеют смысла для
  988. языка~C стандарта~C11 и будут проигнорированы в соответствии с
  989. макроопределением. Для OpenCL\nobreakdash-диалекта~С эти модификаторы
  990. обозначают, что указатели указывают на собственную память нити
  991. исполнения.\medskip
  992. \begin{samepage}
  993. \begin{Verbatim}[samepage=true,fontsize=\small]
  994. int32_t __ptrc_Phi_meanOfPoints(
  995. __private _PTRC_VAL_T* const pfDstPnt,
  996. __private const _PTRC_VAL_T* const pfSrcPnt,
  997. __private const uint64_t u64D,
  998. __private const uint64_t u64NofSrcPnts)
  999. int32_t __ptrc_meanOfPointsBiased(
  1000. __private _PTRC_VAL_T* const pfDstPnt,
  1001. __private const _PTRC_VAL_T* const pfSrcPnt,
  1002. __private const _PTRC_VAL_T* const pfBiasPnt,
  1003. __private const uint64_t u64D,
  1004. __private const uint64_t u64NofSrcPnts)
  1005. \end{Verbatim}
  1006. Функции являются реализациями
  1007. функции~$\phi$~(разд.~\ref{subsubsec:first_approx_selection}) и осуществляют
  1008. выбор начального приближения. Функция \verb|__ptrc_Phi_meanOfPoints()|
  1009. сохраняет в~\verb|pfDstPnt| усреднение по точкам~\verb|pfSrcPnt|. Функция
  1010. \verb|__ptrc_meanOfPointsBiased()| сохраняет в~\verb|pfDstPnt| усреднение
  1011. по точкам~\verb|pfSrcPnt| со сдвигом к~\verb|pfBiasPnt|.
  1012. \verb|u64D|~и~\verb|u64NofSrcPnts|~---~размерность пространства и количество
  1013. исходных точек соответственно.
  1014. \end{samepage}\medskip\hrule
  1015. \begin{samepage}
  1016. \begin{Verbatim}[samepage=true,fontsize=\small]
  1017. int32_t __ptrc_onePointRoutine(__private _PTRC_VAL_T* const pfPnt,
  1018. __private const _PTRC_INDAT in,
  1019. _GDM_heap_PROTO(__private))
  1020. \end{Verbatim}
  1021. Функция является реализацией
  1022. шагов~\ref{item:the_second_step}--\ref{item:the_last_step}
  1023. алгоритма~(разд.~\ref{subsec:general_algorithm_description}) для исходных
  1024. данных~\verb|in| и одного начального приближения~\verb|pfPnt|, по этому же
  1025. указателю будет сохранено найденное приближение. Для вызова функции в
  1026. программах стандарта~C11 аргумент~\verb|_GDM_heap_PROTO(__private)| не
  1027. указывается; для вызова функции в программах OpenCL\nobreakdash-диалекта~С в
  1028. качестве данного аргумента передаётся макроопределение
  1029. \verb|_GDM_heap_ARG(__private)|.
  1030. Перед использованием макроопределения \verb|_GDM_heap_ARG(__private)|
  1031. собственная <<куча>> нити исполнения должна быть инициализирована
  1032. макроопределением \verb|_GDM___private_heap_init()|.
  1033. \end{samepage}\medskip\hrule
  1034. \begin{samepage}
  1035. \begin{Verbatim}[samepage=true,fontsize=\small]
  1036. _PTRC_VAL_T __ptrc_Lambda_quality(
  1037. __private const _PTRC_VAL_T* const pfPnt,
  1038. __private const _PTRC_INDAT in)
  1039. \end{Verbatim}
  1040. Функция является реализацией
  1041. функции~$\lambda$~(разд.~\ref{subsubsec:point_quality}~\eqref{eq:lambda}) и
  1042. возвращает значение качества приближения~\verb|pfPnt| для исходных
  1043. данных~\verb|in|.
  1044. \end{samepage}\medskip\hrule
  1045. \begin{samepage}
  1046. \begin{Verbatim}[samepage=true,fontsize=\small]
  1047. int32_t __ptrc_copyVec(__private _PTRC_VAL_T* const pfDst,
  1048. __private const _PTRC_VAL_T* const pfSrc,
  1049. __private uint64_t u64D)
  1050. \end{Verbatim}
  1051. Функция копирования вектора/точки~\verb|pfSrc| размерности~\verb|u64D| в
  1052. вектор/точку~\verb|pfDst|.
  1053. \end{samepage}\medskip\hrule
  1054. \begin{samepage}
  1055. \begin{Verbatim}[samepage=true,fontsize=\small]
  1056. uint64_t __ptrc_idxOfFarestSphere(
  1057. __private const _PTRC_VAL_T* const pfPnt,
  1058. __private const _PTRC_INDAT in)
  1059. \end{Verbatim}
  1060. Функция выбора наиболее удалённой сферы реализует
  1061. шаг~\ref{item:the_second_step}
  1062. алгоритма~(разд.~\ref{subsec:general_algorithm_description}) и
  1063. функцию~$\mu$~(разд.~\ref{subsubsec:shortest_distance_to_sphere_surface}~%
  1064. \eqref{eq:mue}). Возвращает индекс сферы из исходных данных~\verb|in|,
  1065. поверхность которой наиболее удалена от точки~\verb|pfPnt|.
  1066. \end{samepage}\medskip\hrule
  1067. \begin{samepage}
  1068. \begin{Verbatim}[samepage=true,fontsize=\small]
  1069. int32_t __ptrc_nextPntAndQuality(
  1070. __private _PTRC_VAL_T* const pfDst,
  1071. __private const _PTRC_VAL_T* const pfPnt,
  1072. __private const _PTRC_INDAT in,
  1073. __private const uint64_t u64IdxOfSphere,
  1074. __private _PTRC_VAL_T* const pfQuality,
  1075. _GDM_heap_PROTO(__private))
  1076. \end{Verbatim}
  1077. Функция реализует
  1078. шаги~\ref{item:the_third_step}--\ref{item:chosing_point_from_pair}
  1079. алгоритма~(разд.~\ref{subsec:general_algorithm_description}). От
  1080. приближения~\verb|pfPnt| рассчитывается новое приближение к сфере из~\verb|in|
  1081. с индексом~\verb|u64IdxOfSphere|. Новое приближение сохраняется по
  1082. указателю~\verb|pfDst|; показатель качества нового приближения сохраняется по
  1083. указателю~\verb|pfQuality|. Допустимо передавать в качестве
  1084. \verb|pfDst|~и~\verb|pfPnt| один адрес. Для вызова функции в программах
  1085. стандарта~C11 аргумент~\verb|_GDM_heap_PROTO(__private)| не указывается; для
  1086. вызова функции в программах OpenCL\nobreakdash-диалекта~С в качестве данного
  1087. аргумента передаётся макроопределение \verb|_GDM_heap_ARG(__private)|. Перед
  1088. использованием макроопределения \verb|_GDM_heap_ARG(__private)| собственная
  1089. <<куча>> нити исполнения должна быть инициализирована макроопределением
  1090. \verb|_GDM___private_heap_init()|.
  1091. \end{samepage}\medskip\hrule
  1092. \begin{samepage}
  1093. \begin{Verbatim}[samepage=true,fontsize=\small]
  1094. int32_t __ptrc_Psi_refineApproximation(
  1095. __private _PTRC_VAL_T* const pfPnt,
  1096. __private const _PTRC_INDAT in,
  1097. _GDM_heap_PROTO(__private))
  1098. \end{Verbatim}
  1099. Функция реализует
  1100. процедуру~$\psi$~(разд.~\ref{subsubsec:point_refinement}~\eqref{eq:psi}). Для
  1101. приближения~\verb|pfPnt| и исходных данных~\verb|in| рассчитывается уточнение
  1102. приближения, которое сохраняется по указателю~\verb|pfPnt|. Для вызова функции
  1103. в программах стандарта~C11 аргумент~\verb|_GDM_heap_PROTO(__private)| не
  1104. указывается; для вызова функции в программах OpenCL\nobreakdash-диалекта~С в
  1105. качестве данного аргумента передаётся
  1106. макроопределение \verb|_GDM_heap_ARG(__private)|. Перед использованием
  1107. макроопределения \verb|_GDM_heap_ARG(__private)| собственная <<куча>> нити
  1108. исполнения должна быть инициализирована макроопределением
  1109. \verb|_GDM___private_heap_init()|.
  1110. \end{samepage}\medskip\hrule
  1111. \begin{samepage}
  1112. \begin{Verbatim}[samepage=true,fontsize=\small]
  1113. _PTRC_VAL_T __ptrc_EuclDist(__private const _PTRC_VAL_T* const pfA,
  1114. __private const _PTRC_VAL_T* const pfB,
  1115. __private uint64_t u64D)
  1116. \end{Verbatim}
  1117. Функция расчёта расстояния в эвклидовой метрике, реализует
  1118. функцию~$\delta$~(разд.~\ref{subsubsec:shortest_distance_to_sphere_surface}~%
  1119. \eqref{eq:delta}). Возвращает значение расстояния между
  1120. точками~\verb|pfA|~и~\verb|pfB| в пространстве размерности~\verb|u64D|.
  1121. \end{samepage}\medskip\hrule
  1122. \begin{samepage}
  1123. \begin{Verbatim}[samepage=true,fontsize=\small]
  1124. int32_t __ptrc_Chi_intersections(__private _PTRC_VAL_T* const pfDst,
  1125. __private const _PTRC_VAL_T* const pfP,
  1126. __private const _PTRC_VAL_T* const pfV,
  1127. __private const _PTRC_VAL_T* const pfC,
  1128. __private const _PTRC_VAL_T fR,
  1129. __private const uint64_t u64D)
  1130. \end{Verbatim}
  1131. Функция реализует
  1132. функцию~$\chi$~(разд.~\ref{subsubsec:line-sphere_intersection_equation}~%
  1133. \eqref{eq:line-sphere_intersection}~и~\eqref{eq:chi}). Функция в пространстве
  1134. размерности~\verb|u64D| рассчитывает пару точек, в которых прямая, проходящая
  1135. через точки~\verb|pfP|~и~\verb|pfC|, пересекает поверхность сферы с центром
  1136. в~\verb|pfC| и радиусом~\verb|fR|. Результат (пара точек) сохраняется по
  1137. указателю~\verb|pfDst|.
  1138. \end{samepage}\medskip\hrule
  1139. \begin{samepage}
  1140. \begin{Verbatim}[samepage=true,fontsize=\small]
  1141. _PTRC_DEFL_VARS __ptrc_deflFunc(__private const _PTRC_VAL_T* const P,
  1142. __private const _PTRC_VAL_T* const V,
  1143. __private const _PTRC_VAL_T* const C,
  1144. __private const uint64_t u64D,
  1145. __private const _PTRC_VAL_T r)
  1146. _PTRC_GHK_VARS __ptrc_ghkFunc(__private const _PTRC_VAL_T* const P,
  1147. __private const _PTRC_VAL_T* const V,
  1148. __private const _PTRC_VAL_T* const C,
  1149. __private const uint64_t u64D)
  1150. \end{Verbatim}
  1151. Функции рассчитывают значения $d$, $e$, $f$, $g$, $h$, $k$, $l$
  1152. формулы~\eqref{eq:line-sphere_intersection}
  1153. раздела~\ref{subsubsec:line-sphere_intersection_equation}. Возвращают
  1154. структуры, содержащие эти значения:\par\nopagebreak
  1155. \begin{Verbatim}[samepage=true,fontsize=\small]
  1156. typedef struct _PTRC_G_H_K_VARS {
  1157. _PTRC_VAL_T g; _PTRC_VAL_T h; _PTRC_VAL_T k;
  1158. } _PTRC_GHK_VARS;
  1159. typedef struct _PTRC_D_E_F_L_VARS {
  1160. _PTRC_VAL_T d; _PTRC_VAL_T e; _PTRC_VAL_T f; _PTRC_VAL_T l;
  1161. } _PTRC_DEFL_VARS;
  1162. \end{Verbatim}
  1163. \end{samepage}\medskip
  1164. \subsection{Примеры использования прототипа в приложениях}
  1165. \label{subsec:prototype_use_examples}
  1166. К примерам использования прототипа в приложениях относятся следующие
  1167. файлы:\par\nopagebreak
  1168. \noindent\begin{samepage}\begin{minipage}[t]{\linewidth}
  1169. {\small\dirtree{%
  1170. .1 iterative\_point\_recovery/.
  1171. .2 \ldots.
  1172. .2 examples/.
  1173. .3 Makefile\DTcomment{%
  1174. \begin{minipage}[t]{0.6666667\linewidth}сценарий сборки
  1175. примеров.\end{minipage}}.
  1176. .3 point\_recovery\_kernel.clc\DTcomment{\\\hspace*{\fill}%
  1177. \begin{minipage}[t]{0.6666667\linewidth}файл, содержащий определение
  1178. ядерной GPGPU\nobreakdash-функции, вызывающей
  1179. \Verb|\_ptrc\_recoverPoint()|.\end{minipage}}.
  1180. .3 point\_recovery-C11.c\DTcomment{\\\hspace*{\fill}%
  1181. \begin{minipage}[t]{0.6666667\linewidth}файл, содержащий исходный код
  1182. консольного приложения, вызывающего функцию \Verb|\_ptrc\_recoverPoint()|.
  1183. \end{minipage}}.
  1184. .3 point\_recovery-OpenCL.c\DTcomment{\\\hspace*{\fill}%
  1185. \begin{minipage}[t]{0.6666667\linewidth}файл, содержащий исходный код
  1186. консольного приложения, разворачивающего инфраструктуру OpenCL и
  1187. запускающего ядерную GPGPU\nobreakdash-функцию из файла
  1188. \Verb|point\_recovery\_kernel.clc|.\end{minipage}}.
  1189. .2 \ldots.
  1190. }}
  1191. \end{minipage}\end{samepage}
  1192. Для сборки примера на языке C стандарта C11 необходимо, находясь в каталоге
  1193. \verb|iterative_point_recovery/examples|, выполнить команду\par\nopagebreak
  1194. \indent\indent\verb|make c11|\par\noindent Если прототип установлен
  1195. не в каталог по умолчанию, то при сборке необходимо указывать актуальный путь
  1196. (префикс) в переменной окружения \verb|IPR_PATH|. Если команда \verb|make|
  1197. завершена без ошибок, то в каталоге
  1198. \verb|iterative_point_recovery/examples/build| появится
  1199. файл~\verb|ptrc_example-c11|. Запуск данного файла приведёт к выводу входных
  1200. данных и результирующего приближения, рассчитанного функцией
  1201. \verb|_ptrc_recoverPoint()|. При этом в переменной окружения
  1202. \verb|LD_LIBRARY_PATH| должен быть путь к файлу \verb|libIterPntRcv.so.0.0| (по
  1203. умолчанию \verb|~/opt/iterative_point_recovery/lib|).
  1204. Несколько иначе осуществляется сборка прототипа
  1205. для OpenCL\nobreakdash-диалекта~С. Предполагается, что установлен пакет
  1206. OpenCL\_helpers, и прототип
  1207. собран~(см.~разд.~\ref{subsubsec:prototype_build_and_install}) с указанием
  1208. индекса устройства GPGPU. Тогда выполнение команды\par\nopagebreak
  1209. \indent\indent\verb|make GPGPU_DEV_IDX=|\verbI{N}\verb| opencl|\par\noindent
  1210. (где \verbI{N}~---~тот же индекс устройства GPGPU, который был указан при сборке
  1211. прототипа) приведёт к появлению в каталоге
  1212. \verb|iterative_point_recovery/examples/build|
  1213. файла~\verb|ptrc_example-ocl-|\verbI{имя\_устройства\_GPGPU}. Запуск данного
  1214. файла приведёт к выводу входных данных и результирующего приближения,
  1215. рассчитанного функцией \verb|_ptrc_recoverPoint()|. При этом в переменной
  1216. окружения \verb|LD_LIBRARY_PATH| должен быть путь к файлу \verb|liboclh.so.0.0|
  1217. (по умолчанию \verb|~/opt/oclh/lib|). В ходе выполнения
  1218. файла~\verb|ptrc_example-ocl-|\verbI{имя\_устройства\_GPGPU} ведётся журнал в
  1219. файле~\verb|ipr_oclh.log|, где отображаются события и действия связанные с
  1220. OpenCL инфраструктурой.
  1221. Сами файлы содержащие примеры использования, не превышают 50\nobreakdash-ти
  1222. строк кода достаточно прозрачного для дальнейшей интеграции прототипа в
  1223. приложения.
  1224. \subsection{Проверка и оценка прототипа. Визуализация результатов}
  1225. \label{subsec:prototype_testing}
  1226. \subsubsection{Проверочный комплект}
  1227. \label{subsubsec:test_suite}
  1228. Проверочный комплект состоит из следующих файлов:\par\nopagebreak
  1229. \noindent\begin{samepage}\begin{minipage}[t]{\linewidth}
  1230. {\small\dirtree{%
  1231. .1 iterative\_point\_recovery/.
  1232. .2 \ldots.
  1233. .2 test\_suite/.
  1234. .3 Makefile\DTcomment{%
  1235. \begin{minipage}[t]{0.6666667\linewidth}сценарий сборки проверочного
  1236. комплекта.\end{minipage}}.
  1237. .3 ptrc\_test\_settings.h\DTcomment{\\\hspace*{\fill}%
  1238. \begin{minipage}[t]{0.6666667\linewidth}файл, содержащий настройки
  1239. проверочного комплекта.\end{minipage}}.
  1240. .3 ptrc\_test.c\DTcomment{%
  1241. \begin{minipage}[t]{0.6666667\linewidth} файл, содержащий исходный код
  1242. проверочного комплекта.\end{minipage}}.
  1243. .2 \ldots.
  1244. }}
  1245. \end{minipage}\end{samepage}
  1246. Проверочный комплект реализован только для проверки алгоритма на языке~C
  1247. стандарта~C11, исходя из предположения, что алгоритм на
  1248. OpenCL\nobreakdash-диалекте~С идентичен за исключением округлений и случаев
  1249. оптимизации обработки числе с плавающей запятой.
  1250. Для сборки примера на языке C стандарта C11 необходимо, находясь в каталоге
  1251. \verb|iterative_point_recovery/test_suite|, выполнить команду\par\nopagebreak
  1252. \indent\indent\verb|make stable|\par\noindent или\par\nopagebreak
  1253. \indent\indent\verb|make debug|\par\noindent если необходима сборка с
  1254. отладочной информацией. Если команда \verb|make| завершена без ошибок, то в
  1255. каталоге \verb|iterative_point_recovery/test_suite/build| появится
  1256. файл~\verb|ptrc_test|. Запуск данного файла приведёт к выполнению процедуры
  1257. проверки в соответствии с настройками из файла \verb|ptrc_test_settings.h|,
  1258. которые описаны \hyperref[par:test_suite_settings_synopsis]{ниже}.
  1259. При проверке одного случая проверочный комплект выбирает псевдослучайные точки
  1260. в пространстве~${\symbb{R}^n}$, затем рассчитывает расстояния от точек до
  1261. последней из них и вносит псевдослучайную погрешность в рассчитанные
  1262. расстояния.
  1263. Таким образом формируются данные, где первые точки~--~центры сфер, расстояния
  1264. с погрешностью~--~радиусы сфер, а последняя точка~--~искомая. Этот блок данных
  1265. передаётся функции восстановления точки \verb|_ptrc_recoverPoint()|, после чего
  1266. рассчитывается расстояние от полученного приближения до последней
  1267. псевдослучайной точки, что интерпретируется как ошибка приближения. Такие
  1268. параметры как размерность пространства, интервал выбора псевдослучайных точек,
  1269. количество известных сфер и максимальная погрешность
  1270. датчика\nobreakdash-источника расстояния задаются в
  1271. \hyperref[par:test_suite_settings_synopsis]{настройках проверочного
  1272. комплекта}.
  1273. \paragraph[Сводка настроек проверочного комплекта]%
  1274. {Сводка настроек проверочного комплекта.}
  1275. \label{par:test_suite_settings_synopsis}
  1276. Настройки проверочного комплекта хранятся в файле \verb|ptrc_test_settings.h|
  1277. и представляют собой накроопределения на языке~C, в связи с чем после изменения
  1278. настроек необходима пересборка проверочного комплекта в порядке описанном в
  1279. разделе~\ref{subsubsec:test_suite}.\par\medskip
  1280. {\NmCnvDescript \verb|_PTRC_TS_DIMENSIONALITY|\\* размерность
  1281. пространства.\par\medskip}
  1282. {\NmCnvDescript \verb|_PTRC_TS_NUM_OF_SPHERES|\\* количество известных сфер
  1283. (пар <<центр\nobreakdash-радиус>>).\par\medskip}
  1284. {\NmCnvDescript \verb|_PTRC_TS_NUM_OF_RUNS|\\* количество начальных
  1285. приближений, от которых будет выполняться алгоритм. Соответственно,
  1286. данное количество точек равно количеству запусков алгоритма.
  1287. Рекомендуется использовать размерность пространства, увеличенную на
  1288. единицу.\par\medskip}
  1289. {\NmCnvDescript \verb|_PTRC_TS_RANGE_MULTIPLIER|\\* множитель интервала, из
  1290. которого выбираются проверочные точки. Так, если
  1291. \verb|_PTRC_TS_RANGE_MULTIPLIER| определён как \verb|1.0f|, то точки
  1292. принадлежат интервалу~${\left\lbrack-1;1\right\rbrack}$ по каждой оси
  1293. координат. При изменении множителя концы интервала умножаются на данное
  1294. число.\par\medskip}
  1295. {\NmCnvDescript \verb|_PTRC_TS_MIN_SENSOR_UNCERTAINTY|\\* начальная
  1296. относительная случайная инструментальная погрешность
  1297. датчика\nobreakdash-источника расстояний, которая будет использована при
  1298. проверке.\par\medskip}
  1299. {\NmCnvDescript \verb|_PTRC_TS_MAX_SENSOR_UNCERTAINTY|\\* конечная
  1300. относительная случайная инструментальная погрешность
  1301. датчика\nobreakdash-источника расстояний, которая будет использована при
  1302. проверке .\par\medskip}
  1303. {\NmCnvDescript \verb|_PTRC_TS_SENSOR_UNCERTAINTY_INCREMENT|\\* приращение
  1304. погрешности датчика\nobreakdash-источника расстояний.\par\medskip}
  1305. {\NmCnvDescript \verb|_PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT|\\* количество
  1306. частных случаев, которые будут проверены для одного значения погрешности
  1307. датчика\nobreakdash-источника расстояний.\par\medskip}
  1308. {\NmCnvDescript \verb|_PTRC_MAX_ITERATIONS_ON_SPHERE|\\* переопределение
  1309. значения~$w$ условия~$\prop{Z}$
  1310. (см.~разд.~\ref{subsubsec:the_last_iteration_condition}%
  1311. ~\eqref{eq:zed_with_total_uncertainty}, а также
  1312. разд.~\ref{subsubsec:prototype_settings}).\par\medskip}
  1313. {\NmCnvDescript \verb|_PTRC_TS_STATISTICS_FILENAME|\\* имя файла, в который
  1314. будет сохранена итоговая статистика результатов проверки. Данный файл
  1315. используется для визуализации
  1316. результатов~(см.~разд.~\ref{subsubsec:prototype_regress_estimation}).%
  1317. \par\medskip}
  1318. {\NmCnvDescript \verb|_PTRC_TS_STATISTICS_DISCRETISATION_STEP|\\* частота
  1319. дискретизации значений ошибки для расчёта статистики. Так, если частота
  1320. дискретизации определена как \verb|0.001f|, тогда ошибка
  1321. приближения~${0{,}00345\ldots}$ рассматривается в статистике
  1322. как~${0{,}003}$.\par\medskip}
  1323. {\NmCnvDescript \verb|_PTRC_TS_FLOAT_OUTFORM|\\* формат вывода чисел с
  1324. плавающей запятой. Соответствует преобразованиям функции \verb|printf()| из
  1325. стандартной библиотеки языка~C.\par\medskip}
  1326. {\NmCnvDescript \verb|_PTRC_TS_DATA_OUTPUT_MODE|\\* значение данного
  1327. макроопределения несущественно. В случае если данное макроопределение
  1328. определено, будет производится машиночитаемый вывод следующих значений
  1329. разделённых пробельными символами (значения указаны в порядке вывода):
  1330. \begin{itemize}[leftmargin=-2\parindent]
  1331. \item погрешность датчика\nobreakdash-источника расстояний,
  1332. \item значение~$w$~(см.~разд.~\ref{subsubsec:the_last_iteration_condition}%
  1333. ~\eqref{eq:zed_with_total_uncertainty}~и~%
  1334. \ref{subsubsec:prototype_settings}),
  1335. \item размерность пространства,
  1336. \item количество известных сфер,
  1337. \item количество проверяемых начальных приближений,
  1338. \item координаты центров известных сфер,
  1339. \item неточные радиусы известных сфер (расстояния до искомой точки);
  1340. \end{itemize}
  1341. затем выводится блок записей итераций, каждая запись состоит из следующих
  1342. значений разделённых пробельными символами:
  1343. \begin{itemize}[leftmargin=-2\parindent]
  1344. \item номер итерации,
  1345. \item координаты нового приближения,
  1346. \item качество нового
  1347. приближения~$\lambda$~(см.~разд.~\ref{subsubsec:point_quality}).
  1348. \end{itemize}
  1349. Две последние положительные записи блока итераций отличаются номером итерации
  1350. на~$2$, и это значит, что последняя запись с положительным номером итерации
  1351. есть результат уточнения
  1352. приближения~$\psi$~(см.~разд.~\ref{subsubsec:point_refinement}) и его
  1353. качество~$\lambda$; предпоследняя запись в блоке итераций имеет номер
  1354. итерации~${-1}$ и является окончательным приближением, выбранным из приближений
  1355. полученных из разных начальных точек; последняя запись в блоке итераций имеет
  1356. номер итерации~${-2}$ и содержит координаты <<настоящей>> искомой точки, а
  1357. последнее число это эвклидово расстояние до наилучшего выбранного
  1358. приближения~(т.~н.~ошибка). Данные значения в таком порядке машиночитаемы и
  1359. могут быть использованы для визуализации шагов алгоритма с помощью сценариев из
  1360. раздела~\ref{subsubsec:prototype_particular_case_visualisation}.\par\medskip}
  1361. {\NmCnvDescript \verb|_PTRC_TS_VERBOSE_MODE|\\* значение данного
  1362. макроопределения несущественно. В случае если данное макроопределение
  1363. определено, будет производится человекочитаемый вывод о действиях алгоритма при
  1364. работе функции \verb|_ptrc_recoverPoint()|, что позволяет убедиться в
  1365. соответствии функции \verb|_ptrc_recoverPoint()| описанию алгоритма. Данная
  1366. настройка сделана исключительно в демонстрационных целях. Рекомендуется
  1367. использовать её только в случае проверки единственного частного случая. Не
  1368. рекомендуется определять данное макроопределение в любых других случаях, так
  1369. как это приводит к объёмному избыточному выводу.\par\medskip}
  1370. \subsubsection[Регресс-оценка прототипа]{Регресс\nobreakdash-оценка прототипа}
  1371. \label{subsubsec:prototype_regress_estimation}
  1372. Визуализация регресс\nobreakdash-оценки прототипа реализована в следующих
  1373. файлах:\par\nopagebreak
  1374. \noindent\begin{samepage}\begin{minipage}[t]{\linewidth}
  1375. {\small\dirtree{%
  1376. .1 iterative\_point\_recovery/.
  1377. .2 \ldots.
  1378. .2 visualisation/.
  1379. .3 Scilab/.
  1380. .4 \ldots.
  1381. .4 ptrc\_statistics.sce\DTcomment{\\\hspace*{\fill}%
  1382. \begin{minipage}[t]{0.6666667\linewidth}сценарий Scilab для визуализации
  1383. результата работы проверочного комплекта для
  1384. регресс\nobreakdash-оценки алгоритма.\end{minipage}}.
  1385. .4 \ldots.
  1386. .3 Wolfram\_Mathematica/.
  1387. .4 \ldots.
  1388. .4 ptrc\_statistics.wls\DTcomment{\\\hspace*{\fill}%
  1389. \begin{minipage}[t]{0.6666667\linewidth}сценарий Wolfram~Mathematica для
  1390. визуализации результата работы проверочного комплекта для
  1391. регресс\nobreakdash-оценки алгоритма.\end{minipage}}.
  1392. .4 \ldots.
  1393. .3 example\_stat\_report.txt\DTcomment{демонстрационные данные.}.
  1394. .3 example\_stat\_report0.txt\DTcomment{демонстрационные данные.}.
  1395. .2 \ldots.
  1396. }}
  1397. \end{minipage}\end{samepage}
  1398. Визуализация регресс\nobreakdash-оценки реализована для пакетов Scilab и
  1399. Wolfram~Mathematica, описание приводится для пакета Scilab, однако всё
  1400. написанное справедливо и для сценария Wolfram~Mathematica, за исключением прямо
  1401. оговорённых отличий.
  1402. Регресс\nobreakdash-оценка предназначения для общей статистической оценки
  1403. изменения корректности сформированного алгоритмом приближения после внесения
  1404. изменений в параметры алгоритма или изменения его отдельных частей. Для
  1405. регресс\nobreakdash-оценки необходимо, используя проверочный комплект,
  1406. сформировать два файла: первый~--~содержит статистические данные для текущей
  1407. версии алгоритма, а второй~--~для изменённой.
  1408. \begin{samepage}
  1409. Рекомендуемые настройки проверочного комплекта для
  1410. регресс\nobreakdash-оценки:\par\nopagebreak
  1411. \begin{Verbatim}[samepage=true,fontsize=\small,commandchars=\\\{\}]
  1412. #define _PTRC_TS_DIMENSIONALITY \textit{по условиям испытаний}
  1413. #define _PTRC_TS_NUM_OF_SPHERES \textit{по условиям испытаний}
  1414. #define _PTRC_TS_NUM_OF_RUNS \textit{по условиям испытаний}
  1415. #define _PTRC_TS_RANGE_MULTIPLIER 1.0f
  1416. #define _PTRC_TS_MIN_SENSOR_UNCERTAINTY 0.0f
  1417. #define _PTRC_TS_MAX_SENSOR_UNCERTAINTY 0.5f
  1418. #define _PTRC_TS_SENSOR_UNCERTAINTY_INCREMENT 0.01f
  1419. #define _PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT 10000ul
  1420. #define _PTRC_MAX_ITERATIONS_ON_SPHERE 100ul
  1421. #define _PTRC_TS_STATISTICS_FILENAME "stat_report.txt"
  1422. #define _PTRC_TS_STATISTICS_DISCRETISATION_STEP 0.001f
  1423. #define _PTRC_TS_FLOAT_OUTFORM "%.7f"
  1424. // #define _PTRC_TS_DATA_OUTPUT_MODE
  1425. // #define _PTRC_TS_VERBOSE_MODE
  1426. \end{Verbatim}
  1427. \end{samepage}
  1428. \noindent После установки настроек проверочного комплекта, необходимо
  1429. осуществить его сборку в порядке указанном~в~разделе~\ref{subsubsec:test_suite}
  1430. и запустить полученный исполняемый файл. В результате будет сформирован файл
  1431. статистики \verb|stat_report.txt|, который сохраняется отдельно как данные о
  1432. текущей версии алгоритма. В демонстрационных целях для размерности~$5$ и
  1433. количества известных сфер~$6$ сформирован такой файл и сохранён как\\*
  1434. \centerline{\small%
  1435. \Verb|iterative\_point\_recovery/visualisation/example\_stat\_report0.txt|}
  1436. Затем необходимо внести желаемые изменения в алгоритм или его настройки,
  1437. пересобрать проверочный комплект и снова запустить. Так,
  1438. в~разделе~\ref{sec:introduction} был выражен тезис <<\textit{\ldots в
  1439. прикладных задачах часто есть возможность получить данные не с
  1440. ${n+1}$~датчиков, дающих неточные значения, а с большего их (датчиков)
  1441. количества \ldots\ дополнительная информация может (и должна) улучшать
  1442. приближение искомой точки\ldots}>>. Для демонстрации справедливости этого
  1443. тезиса для размерности~$5$ и количества известных сфер~$9$ сформирован файл
  1444. статистики и сохранён как\\*
  1445. \centerline{\small%
  1446. \Verb|iterative\_point\_recovery/visualisation/example\_stat\_report1.txt|}
  1447. Иными словами, далее в примерах сравнивается точность работы алгоритма при
  1448. поиске точки в пятимерном пространстве при 6\nobreakdash-ти и 9\nobreakdash-ти
  1449. известных сферах (парах <<точка\nobreakdash-расстояние>>).
  1450. На данном этапе доступны два файла: первый~--~со статистической оценкой
  1451. исходной версии прототипа (\verb|example_stat_report0.txt|); второй~--~со
  1452. статистической оценкой изменённой версии прототипа
  1453. (\verb|example_stat_report1.txt|). Теперь в
  1454. файле (для сценария Scilab):\par\nopagebreak
  1455. \indent\verb|visualisation/Scilab/ptrc_statistics.sce|\par\noindent%
  1456. либо (для сценария Wolfram~Mathematica):\par\nopagebreak
  1457. \indent\verb|visualisation/Wolfram_Mathematica/ptrc_statistics.wls|\par%
  1458. \nopagebreak\noindent%
  1459. необходимо изменить значения переменных\par\nopagebreak
  1460. \begin{Verbatim}[samepage=true]
  1461. dataFile0="../example_stat_report0.txt";
  1462. dataFile1="../example_stat_report1.txt";
  1463. \end{Verbatim}
  1464. \par\nopagebreak\noindent%
  1465. на актуальные. Здесь \verb|dataFile0|~--~путь к первому файлу с данными текущей
  1466. версии прототипа, и, соответственно, \verb|dataFile1|~--~путь к второму файлу с
  1467. данными изменённого прототипа. После чего сохраните файл и выполните его
  1468. командой (для сценария Scilab):\par\nopagebreak
  1469. \indent\indent\verb|scilab -f ptrc_statistics.sce -quit|\par\noindent%
  1470. либо (для сценария Wolfram~Mathematica):\par\nopagebreak
  1471. \indent\indent\verb|wolframscript -f ptrc_statistics.wls|\par\noindent%
  1472. Для сценария Scilab можно не указывать ключ \verb|-quit|, а в дальнейшем
  1473. перезапускать сценарий из открытой оболочки Scilab. Для сценария
  1474. Wolfram~Mathematica, чтобы сохранить сценарий открытым в оболочке с
  1475. возможностью перезапуска откройте его командой:\par\nopagebreak
  1476. \indent\indent\verb|Mathematica ptrc_statistics.wls|\par\noindent%
  1477. В результате выполнения данного сценария будут сохранены файлы
  1478. \verb|errors.png|, \verb|errors.svg| и \verb|solves.png|, \verb|solves.svg|.
  1479. \paragraph[Визуализация регресс-оценки по ошибкам приближений]%
  1480. {Визуализация регресс\nobreakdash-оценки по ошибкам приближений.}
  1481. \label{par:vis_errors}
  1482. Рассмотрим для начала файл \verb|errors.png| (или \verb|svg| в векторном
  1483. представлении). Содержимое файла выглядит примерно как на
  1484. рис.~\ref{fig:fig2_errors}.
  1485. \begin{figure}[!ht]
  1486. \includegraphics[width=\linewidth]{fig2_errors.eps}%
  1487. \captionsetup{format=hang}%
  1488. \caption{Статистика ошибок приближений.}%
  1489. \label{fig:fig2_errors}
  1490. \end{figure}
  1491. Сплошная синяя линия описывает математическое
  1492. ожидание величины ошибки для условий описанных в легенде к графику, в
  1493. приведённом примере это: размерность~$5$, известных сфер~$6$, множитель
  1494. интервала выбора точек~${1.0}$, количество проверенных начальных
  1495. приближений~$6$; погрешность датчика при оценке изменялась от~$0$ до~${0.5}$ с
  1496. шагом приращения~${0.01}$, для каждой погрешности было испытано~${10 000}$
  1497. случаев, частота дискретизации значений ошибки~${0.001}$. Как и было указано в
  1498. разделе~\ref{sec:introduction} <<\textit{алгоритм должен демонстрировать прямую
  1499. корреляцию качества своей работы и точности датчиков выдающих расстояния~$R$, а
  1500. в таком случае оценка расстояния между алгоритмически вычисленной и искомой
  1501. точкой будет не оценкой алгоритма, а оценкой точности датчиков, причём
  1502. косвенной}>>, что и можно наблюдать в данном примере, так как видно, что
  1503. математическое ожидание ошибки растёт с ростом погрешности датчика, однако
  1504. очевидно, чем алгоритм лучше, тем математической ожидание ошибки при оценке
  1505. должно быть ниже. Светло\nobreakdash-синяя пунктирная линия это, согласно
  1506. легенде, сумма математического ожидания с одним среднеквадратичным
  1507. (стандартным) отклонением, чем она ближе к математическому ожиданию, тем
  1508. алгоритм лучше. Светло\nobreakdash-синие точечные линии это минимумы и
  1509. максимумы, соответственно. С одной стороны, чем ближе минимумы и максимумы к
  1510. математическому ожиданию, тем лучше, но с другой стороны большинство таких
  1511. максимизированных выбросов обусловлены не качеством алгоритма как такового, а
  1512. ситуациями, когда выбранные для оценки точки находятся близко к одной
  1513. гиперплоскости, что приводит к возникновению нескольких областей с примерно
  1514. одинаковыми качествами приближений и неопределённости в выборе (подобный пример
  1515. будет рассмотрен в
  1516. разделе~\ref{subsubsec:prototype_particular_case_visualisation}).
  1517. Представляется очевидным, что, в случае если известные точки принадлежат одной
  1518. гиперплоскости, местонахождение искомой точки становится полностью
  1519. неопределённым, поэтому при решении практических задач необходимо следить,
  1520. чтобы датчики\nobreakdash-источники расстояний по возможности не принадлежали и
  1521. не находились близко к одной гиперплоскости.
  1522. Сплошная красная, пунктирная и точечная светло\nobreakdash-красные линии
  1523. отображают, соответственно, математическое ожидание, сумму математического
  1524. ожидания и среднеквадратичного отклонения, минимумы и максимумы для испытаний
  1525. второго варианта алгоритма или условий. Так, из легенды к графику можно видеть,
  1526. что условия для испытаний, при которых получены красные показатели, отличаются
  1527. только количеством известных сфер. По сравнению с $6$\nobreakdash-ю~известными
  1528. сферами $9$~известных сфер снижают математическое ожидание ошибки и уменьшают
  1529. среднеквадратичное отклонение ошибки.
  1530. Увеличение точности приближений с ростом количества известных сфер ожидаемо, но
  1531. не бесплатно, стоимость такого увеличения точности рассматривается в следующем
  1532. параграфе.
  1533. \paragraph[Визуализация регресс-оценки по количеству произведённых действий]%
  1534. {Визуализация регресс\nobreakdash-оценки по количеству произведённых действий.}
  1535. \label{par:vis_solves}
  1536. Для данного варианта алгоритма самым затратным повторяющимся шагом является
  1537. расчёт
  1538. формулы~$\chi$~(разд.~\ref{subsubsec:line-sphere_intersection_equation}~%
  1539. \eqref{eq:line-sphere_intersection}~и~\eqref{eq:chi}) с последующим вычислением
  1540. качества~$\lambda$~(разд.~\ref{subsubsec:point_quality}~\eqref{eq:lambda}) для
  1541. двух приближений при осуществлении выбора. Так как для каждого
  1542. вычисления~$\chi$ производится вычисление~$\lambda$, в проверочном комплекте в
  1543. глобальной переменной~\verb|fSolves| осуществляется подсчёт таких шагов для
  1544. каждого испытанного случая. Полученная статистика отображается на графике в
  1545. файле \verb|solves.png| (или \verb|svg| в векторном представлении). Содержимое
  1546. файла выглядит примерно как на рис.~\ref{fig:fig3_solves}.
  1547. \begin{figure}[!ht]
  1548. \includegraphics[width=\linewidth]{fig3_solves.eps}%
  1549. \captionsetup{format=hang}%
  1550. \caption{Статистика количеств расчётов формулы~$\chi$.}%
  1551. \label{fig:fig3_solves}
  1552. \end{figure}
  1553. Цветовые обозначения и формы линий аналогичны таковым при визуализации
  1554. статистики ошибок приближений. Так линии синего и светло\nobreakdash-синего
  1555. цветов соответствуют данным первого набора испытаний (эталонного), а линии
  1556. красного и светло\nobreakdash-красного цвета соответствуют данным второго
  1557. набора испытаний (для изменённого алгоритма или условий). Сплошная линия в
  1558. контексте данного графика обозначает математическое ожидание количества шагов
  1559. (вычислений~$\chi$) к погрешности датчика\nobreakdash-источника расстояний,
  1560. пунктирная линия показывает сумму математического ожидания и стандартного
  1561. отклонения количества шагов, точечные линии отображают минимумы и максимумы
  1562. соответственно их расположению.
  1563. Из представленного примера видно, что при изменении условий исполнения
  1564. алгоритма от~$6$\nobreakdash-и к $9$\nobreakdash-и известным сферам количество
  1565. расчётов увеличилось. Иными словами, изменение количества известных сфер делает
  1566. найденное приближение точнее, но увеличивает время выполнения алгоритма для
  1567. одного случая. Необходимо учитывать данное обстоятельство при формировании
  1568. входящих данных для алгоритма, так, например, при ограничении времени и наличии
  1569. нескольких датчиков\nobreakdash-источников расстояний имеет смысл не
  1570. использовать все известные сферы, а выбирать, только ${n+1}$~тех из них, центры
  1571. которых, которые наиболее удалены от одной гиперплоскости. Окончательный выбор
  1572. входных данных должен производится исходя из отмеченного обстоятельства
  1573. зависимости точности и времени исполнения, объективных ограничений и рисков
  1574. обстановки исполнения алгоритма.
  1575. \paragraph[Данные по каждому испытанию]{Данные по каждому испытанию.}
  1576. \label{par:cases_raw_data}
  1577. Конкретные предполагаемые условия эксплуатации алгоритма могут потребовать
  1578. дополнительной обработки и более тонких манипуляций со статистикой испытаний,
  1579. поэтому в файле со статистикой сохраняются значения ошибок и количество шагов
  1580. для каждого испытанного случая.
  1581. \begin{samepage}
  1582. Значения ошибок представлены в виде:\par\nopagebreak
  1583. \begin{Verbatim}[samepage=true,fontsize=\small]
  1584. Sensor_uncertainty Raw_Deltas
  1585. 0.0000000 0.0000018 0.0000024 0.0000140 ...
  1586. 0.0100000 0.0380290 0.0628870 0.0381434 ...
  1587. 0.0200000 0.1352121 0.2248735 0.0489258 ...
  1588. ... ... ... ...
  1589. \end{Verbatim}
  1590. \end{samepage}
  1591. Здесь число в первом столбце это значение погрешности
  1592. датчика\nobreakdash-источника расстояний, далее до конца строки значения
  1593. ошибок для каждого испытанного случая. При этом надо иметь в виду, что могут
  1594. возникать ситуации, когда количество значений ошибки меньше, чем
  1595. \verb|_PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT|, так как не все точки могут быть
  1596. восстановлены (см.~\hyperref[par:note_about_restrictions]{замечание} на
  1597. стр.~\pageref{par:note_about_restrictions}).
  1598. \begin{samepage}
  1599. Значения количеств шагов представлены в виде:\par\nopagebreak
  1600. \begin{Verbatim}[samepage=true,fontsize=\small]
  1601. Sensor_uncertainty Raw_Solves
  1602. 0.0000000 2566 2885 710 ...
  1603. 0.0100000 866 546 994 ...
  1604. 0.0200000 997 935 570 ...
  1605. 0.0300000 1231 2668 463 ...
  1606. ... ... ... ...
  1607. \end{Verbatim}
  1608. \end{samepage}
  1609. Здесь число в первом столбце это значение погрешности
  1610. датчика\nobreakdash-источника расстояний, далее до конца строки значения
  1611. количеств предпринятых шагов для каждого испытанного случая. При этом надо
  1612. иметь в виду, что при малых
  1613. значениях~$w$~(см.~разд.~\ref{subsubsec:the_last_iteration_condition}%
  1614. ~\eqref{eq:zed_with_total_uncertainty} и~\hyperref[impNote:on_w]{замечание} к
  1615. разделу~\ref{subsubsec:prototype_settings}) большинство значений не будет
  1616. превышать~${\left(wm\right)+\symrm{const}}$.
  1617. Исходя их этих данных можно строить иные показатели качества алгоритма,
  1618. например, композитный показатель отношения точности к количеству шагов или иные
  1619. согласно предполагаемым условиям эксплуатации алгоритма.
  1620. \subsubsection{Визуализация одного частного случая}
  1621. \label{subsubsec:prototype_particular_case_visualisation}
  1622. Визуализация частного случая работы алгоритма реализована в следующих
  1623. файлах:\par\nopagebreak
  1624. \noindent\begin{samepage}\begin{minipage}[t]{\linewidth}
  1625. {\small\dirtree{%
  1626. .1 iterative\_point\_recovery/.
  1627. .2 \ldots.
  1628. .2 visualisation/.
  1629. .3 Scilab/.
  1630. .4 \ldots.
  1631. .4 ptrc\_one\_sample\_vis-2d-anim.sce\DTcomment{\\\hspace*{\fill}%
  1632. \begin{minipage}[t]{0.6666667\linewidth}сценарий Scilab для
  1633. анимированной визуализации двухмерного случая работы
  1634. алгоритма.\end{minipage}}.
  1635. .4 ptrc\_one\_sample\_vis-2d.sce\DTcomment{\\\hspace*{\fill}%
  1636. \begin{minipage}[t]{0.6666667\linewidth}сценарий Scilab для визуализации
  1637. двухмерного случая работы алгоритма.\end{minipage}}.
  1638. .4 ptrc\_one\_sample\_vis-3d.sce\DTcomment{\\\hspace*{\fill}%
  1639. \begin{minipage}[t]{0.6666667\linewidth}сценарий Scilab для визуализации
  1640. трёхмерного случая работы алгоритма.\end{minipage}}.
  1641. .4 sample\_data\_parser.sce\DTcomment{\\\hspace*{\fill}%
  1642. \begin{minipage}[t]{0.6666667\linewidth}сценарий Scilab для чтения и
  1643. разбора данных частного случая, сформированных проверочным
  1644. комплектом.\end{minipage}}.
  1645. .4 \ldots.
  1646. .3 Wolfram\_Mathematica/.
  1647. .4 \ldots.
  1648. .4 ptrc\_one\_sample\_vis-2d-anim.wls\DTcomment{\\\hspace*{\fill}%
  1649. \begin{minipage}[t]{0.6666667\linewidth}сценарий Wolfram~Mathematica для
  1650. анимированной визуализации двухмерного случая оценки
  1651. алгоритма.\end{minipage}}.
  1652. .4 ptrc\_one\_sample\_vis-2d.wls\DTcomment{\\\hspace*{\fill}%
  1653. \begin{minipage}[t]{0.6666667\linewidth}сценарий Wolfram~Mathematica для
  1654. визуализации двухмерного случая оценки алгоритма.\end{minipage}}.
  1655. .4 ptrc\_one\_sample\_vis-3d.wls\DTcomment{\\\hspace*{\fill}%
  1656. \begin{minipage}[t]{0.6666667\linewidth}сценарий Wolfram~Mathematica для
  1657. визуализации трёхмерного случая оценки алгоритма.\end{minipage}}.
  1658. .4 sample\_data\_parser.wl\DTcomment{\\\hspace*{\fill}%
  1659. \begin{minipage}[t]{0.6666667\linewidth}сценарий Wolfram~Mathematica для
  1660. чтения и разбора данных частного случая, сформированных проверочным
  1661. комплектом.\end{minipage}}.
  1662. .4 \ldots.
  1663. .3 one\_case\_data-2d\_\#.txt\DTcomment{демонстрационные данные.}.
  1664. .3 one\_case\_data-3d\_\#.txt\DTcomment{демонстрационные данные.}.
  1665. .2 \ldots.
  1666. }}
  1667. \end{minipage}\end{samepage}
  1668. Визуализация регресс\nobreakdash-оценки реализована для пакетов Scilab и
  1669. Wolfram~Mathematica, описание приводится для пакета Scilab, однако всё
  1670. написанное справедливо и для сценария Wolfram~Mathematica, за исключением прямо
  1671. оговорённых отличий.
  1672. Визуализация одного частного случая не имеет значительной практической пользы и
  1673. сделана в разъяснительных целях для понимания алгоритма лицами, склонными к
  1674. пространственно\nobreakdash-геометрическому мышлению больше, нежели к
  1675. синтаксическому. Учитывая, что человек способен достаточно полно воспринимать
  1676. только двухмерное пространство, визуализация частного случая сделана только для
  1677. двухмерного и ограниченно для трёхмерного случая. Теоретически можно сделать
  1678. визуализации случаев и больших размерностей, разбивая их на проекции, но так
  1679. как в целом практической пользы от такой визуализации нет или крайне мало, для
  1680. случаев с размерностью выше трёх сценарии визуализации не создавались.
  1681. \paragraph[Визуализация двухмерного частного случая работы
  1682. алгоритма]{Визуализация двухмерного частного случая работы алгоритма.}
  1683. \label{par:one_2d_case_vis}
  1684. \begin{samepage}
  1685. Рекомендуемые настройки проверочного комплекта для визуализации одного
  1686. двухмерного частного случая работы алгоритма:\par\nopagebreak
  1687. \begin{Verbatim}[samepage=true,fontsize=\small,commandchars=\\\{\}]
  1688. #define _PTRC_TS_DIMENSIONALITY 2ul
  1689. #define _PTRC_TS_NUM_OF_SPHERES \textit{по условиям испытаний}
  1690. #define _PTRC_TS_NUM_OF_RUNS 3ul
  1691. #define _PTRC_TS_RANGE_MULTIPLIER 1.0f
  1692. #define _PTRC_TS_MIN_SENSOR_UNCERTAINTY \textit{по условиям испытаний}
  1693. #define _PTRC_TS_MAX_SENSOR_UNCERTAINTY \textit{равно предыдущему значению}
  1694. #define _PTRC_TS_SENSOR_UNCERTAINTY_INCREMENT 0.01f
  1695. #define _PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT 1ul
  1696. #define _PTRC_MAX_ITERATIONS_ON_SPHERE 100ul
  1697. #define _PTRC_TS_STATISTICS_FILENAME "stat_report.txt"
  1698. #define _PTRC_TS_STATISTICS_DISCRETISATION_STEP 0.001f
  1699. #define _PTRC_TS_FLOAT_OUTFORM "%.7f"
  1700. #define _PTRC_TS_DATA_OUTPUT_MODE
  1701. //#define _PTRC_TS_VERBOSE_MODE
  1702. \end{Verbatim}
  1703. \end{samepage}
  1704. \noindent После установки настроек проверочного комплекта, необходимо
  1705. осуществить его сборку в порядке указанном
  1706. в~разделе~\ref{subsubsec:test_suite}. Затем из выполните сценарий Scilab
  1707. командой:\par\nopagebreak
  1708. \indent\indent\verb|scilab -f ptrc_one_sample_vis-2d.sce|\par\noindent%
  1709. либо сценарий Wolfram~Mathematica командой:\par\nopagebreak
  1710. \indent\indent\verb|Mathematica -f ptrc_one_sample_vis-2d.wls|\par\noindent%
  1711. После выполнения сценария останется открытая оболочка и графические окна с
  1712. визуализацией. В данном случае открытые оболочки остаются специально, чтобы
  1713. можно было в интерактивных графических окнах масштабировать изображение, так
  1714. как часть визуализации достаточно мала и неразборчива на общем плане. В
  1715. сценарии первые строки представляют собой присвоение значений двум
  1716. переменным\par\nopagebreak
  1717. \begin{Verbatim}[samepage=true]
  1718. fileName="one_case_data-2d.txt";
  1719. generateNewCase=1;
  1720. \end{Verbatim}
  1721. \par\nopagebreak\noindent%
  1722. Первая их них \verb|fileName| определяет путь к и имя файла, куда будут
  1723. сохранены результаты запуска проверочного комплекта, выведенные в стандартный
  1724. вывод; вторая \verb|generateNewCase|~--~указывает сценарию производить ли новый
  1725. запуск проверочного комплекта (значение~\verb|1|) или работать с
  1726. файлом~\verb|fileName| без его изменения (значение~\verb|0|).
  1727. Для начала рассмотрим случай, когда начальные условия достаточно корректны. Так
  1728. на рис.~\ref{fig:fig4_closed_case} показан случай, когда в результате ошибок
  1729. датчиков\nobreakdash-источников расстояний образуется закрытая область.
  1730. \begin{figure}[!h]
  1731. \begin{minipage}[h]{0.49\linewidth}
  1732. \center{\includegraphics[width=1\linewidth]%
  1733. {fig4_sample_start_point_1.eps}} (a)\\
  1734. \end{minipage}
  1735. \hfill
  1736. \begin{minipage}[h]{0.49\linewidth}
  1737. \center{\includegraphics[width=1\linewidth]{fig4_sample_start_point_2.eps}}
  1738. (b)\\
  1739. \end{minipage}
  1740. \vfill
  1741. \begin{minipage}[h]{0.49\linewidth}
  1742. \center{\includegraphics[width=1\linewidth]%
  1743. {fig4_sample_start_point_3.eps}} (c)\\
  1744. \end{minipage}
  1745. \hfill
  1746. \begin{minipage}[h]{0.49\linewidth}
  1747. \center{\includegraphics[width=1\linewidth]%
  1748. {fig4_sample_start_point_1_zoom.eps}} (d)\\
  1749. \end{minipage}
  1750. \captionsetup{format=hang}%
  1751. \caption{Визуализация работы алгоритма в случае закрытой области.}%
  1752. \label{fig:fig4_closed_case}
  1753. \end{figure}
  1754. Визуализация строится на фоне тепловой карты значений
  1755. функции~$\lambda$~(разд.~\ref{subsubsec:point_quality}~\eqref{eq:lambda}).
  1756. Известные окружности и их центры (расположение датчиков\nobreakdash-источников
  1757. расстояний) обозначены оттенками цветов (в данном случае
  1758. тёмно\nobreakdash-красным, тёмно\nobreakdash-зелёным и
  1759. тёмно\nobreakdash-синим). Символом~$\bigotimes$ обозначается начальное
  1760. приближение. Чёрные линии показывают переход от приближения к приближению в
  1761. ходе выполнения алгоритма. Последнее приближение для данного начального
  1762. обведено чёрной окружностью. Фиолетовым символом~$+$ обозначается наилучшее
  1763. приближение выбранное среди всех результатов работы из разных начальных
  1764. приближений. Фиолетовым символом~$\ast$ обозначается <<настоящая>> искомая
  1765. точка. На рис.~\ref{fig:fig4_closed_case} изображение (a) показывает
  1766. <<путь>> улучшения приближений для первого начального приближения и последующие
  1767. два изображения (b) и (c) для 2\nobreakdash-ого и 3\nobreakdash-его
  1768. соответственно. Последнее изображение (d) это увеличенный фрагмент первого
  1769. изображения, где продемонстрирована замкнутая область, образованная
  1770. окружностями построенными из неточных расстояний. Можно видеть, как на
  1771. четвёртом изображении алгоритм попадает в замкнутую область и завершается. В
  1772. результате, как написано в заголовках изображений, расстояние от найденного
  1773. приближения до искомой точки составляет~$0.0048018$.
  1774. Аналогично на рис.~\ref{fig:fig5_open_case} продемонстрирован случай, когда по
  1775. расстояниям с ошибками построены сферы образующие незамкнутую (открытую
  1776. область), где алгоритм находит наилучшее приближение. Завершение работы
  1777. алгоритма можно видеть на рис.~\ref{fig:fig5_open_case} изображение~(d).
  1778. \begin{figure}[!h]
  1779. \begin{minipage}[h]{0.49\linewidth}
  1780. \center{\includegraphics[width=1\linewidth]%
  1781. {fig5_sample_start_point_1.eps}} (a)\\
  1782. \end{minipage}
  1783. \hfill
  1784. \begin{minipage}[h]{0.49\linewidth}
  1785. \center{\includegraphics[width=1\linewidth]{fig5_sample_start_point_2.eps}}
  1786. (b)\\
  1787. \end{minipage}
  1788. \vfill
  1789. \begin{minipage}[h]{0.49\linewidth}
  1790. \center{\includegraphics[width=1\linewidth]%
  1791. {fig5_sample_start_point_3.eps}} (c)\\
  1792. \end{minipage}
  1793. \hfill
  1794. \begin{minipage}[h]{0.49\linewidth}
  1795. \center{\includegraphics[width=1\linewidth]%
  1796. {fig5_sample_start_point_1_zoom.eps}} (d)\\
  1797. \end{minipage}
  1798. \captionsetup{format=hang}%
  1799. \caption{Визуализация работы алгоритма в случае открытой области.}%
  1800. \label{fig:fig5_open_case}
  1801. \end{figure}
  1802. Можно и далее приводить различные случаи и классифицировать их, включая
  1803. случаи, когда есть полузакрытая область или случаи, когда окружности не
  1804. пересекаются, но в целом в большинстве таких случаев алгоритм ведёт себя
  1805. правильно и даёт хорошее приближение. Интереснее рассмотреть случаи, когда
  1806. условия выполнения алгоритма действительно плохие и на тепловой карте явно
  1807. образованы 2 (иногда больше) экстремумов функции~$\lambda$, что, как было
  1808. сказано выше, происходит, если датчики\nobreakdash-источники расстояний
  1809. расположены на одной или близко к одной гиперплоскости. На таких случаях
  1810. становятся видны преимущества нескольких запусков алгоритма из разных начальных
  1811. приближений. Так на рис.~\ref{fig:fig6_hard_case} можно видеть, что
  1812. датчики\nobreakdash-источники расстояний (центры сфер) расположены почти на
  1813. одной гиперплоскости (прямой для двухмерного случая), что приводит к появлению
  1814. двух примерно равных экстремумов на севере и юго\nobreakdash-востоке
  1815. изображения, причём искомая точка расположена на юго\nobreakdash-востоке.
  1816. \begin{figure}[!h]
  1817. \begin{minipage}[h]{0.49\linewidth}
  1818. \center{\includegraphics[width=1\linewidth]%
  1819. {fig6_sample_start_point_1.eps}} (a)\\
  1820. \end{minipage}
  1821. \hfill
  1822. \begin{minipage}[h]{0.49\linewidth}
  1823. \center{\includegraphics[width=1\linewidth]{fig6_sample_start_point_2.eps}}
  1824. (b)\\
  1825. \end{minipage}
  1826. \vfill
  1827. \begin{minipage}[h]{0.49\linewidth}
  1828. \center{\includegraphics[width=1\linewidth]%
  1829. {fig6_sample_start_point_3.eps}} (c)\\
  1830. \end{minipage}
  1831. \hfill
  1832. \begin{minipage}[h]{0.49\linewidth}
  1833. \center{\includegraphics[width=1\linewidth]%
  1834. {fig6_sample_start_point_2_zoom.eps}} (d)\\
  1835. \end{minipage}
  1836. \captionsetup{format=hang}%
  1837. \caption{Визуализация работы алгоритма в случае двух экстремумов
  1838. функции~$\lambda$ и нахождении <<хорошего>> приближения.}%
  1839. \label{fig:fig6_hard_case}
  1840. \end{figure}
  1841. Можно видеть, что на изображении~(a)~рис.~\ref{fig:fig6_hard_case} из первого
  1842. начального приближения алгоритм приходит в область между двумя экстремумами и в
  1843. отсутствии улучшения
  1844. функции~$\lambda$~(разд.~\ref{subsubsec:point_quality}~\eqref{eq:lambda})
  1845. прекращает поиск, возвращая плохое приближение. Но при проверке второго
  1846. начального приближения на изображении~(b)~рис.~\ref{fig:fig6_hard_case},
  1847. алгоритм приходит в <<правильный>> экстремум функции~$\lambda$ и возвращает
  1848. <<хорошее>> приближение искомой точки, завершение чего можно видеть на
  1849. масштабированном изображении~(d)~рис.~\ref{fig:fig6_hard_case}. И при проверке
  1850. третьего начального приближения алгоритм уходит к <<неправильному>> северному
  1851. экстремуму функции~$\lambda$, где и завершается. И только выбор из этих трёх
  1852. финальных приближений позволяет выбрать наилучшее, соответствующее
  1853. изображению~(b).
  1854. В отдельных случаях, когда датчики\nobreakdash-источники расстояний расположены
  1855. на одной или близко к одной гиперплоскости может образоваться область, в
  1856. которой значение функции~$\lambda$ выше, чем в области с искомой точкой. В
  1857. таком случае алгоритм вернёт очень <<плохое>> приближение. Подобный пример
  1858. приведён на рис.~\ref{fig:fig7_bad_case}.
  1859. \begin{figure}[!h]
  1860. \begin{minipage}[h]{0.49\linewidth}
  1861. \center{\includegraphics[width=1\linewidth]%
  1862. {fig7_sample_start_point_1.eps}} (a)\\
  1863. \end{minipage}
  1864. \hfill
  1865. \begin{minipage}[h]{0.49\linewidth}
  1866. \center{\includegraphics[width=1\linewidth]{fig7_sample_start_point_2.eps}}
  1867. (b)\\
  1868. \end{minipage}
  1869. \vfill
  1870. \begin{minipage}[h]{0.49\linewidth}
  1871. \center{\includegraphics[width=1\linewidth]%
  1872. {fig7_sample_start_point_3.eps}} (c)\\
  1873. \end{minipage}
  1874. \hfill
  1875. \begin{minipage}[h]{0.49\linewidth}
  1876. \center{\includegraphics[width=1\linewidth]%
  1877. {fig7_sample_start_point_1_zoom.eps}} (d)\\
  1878. \end{minipage}
  1879. \captionsetup{format=hang}%
  1880. \caption{Визуализация работы алгоритма в случае двух экстремумов
  1881. функции~$\lambda$ и нахождении ошибочного приближения.}%
  1882. \label{fig:fig7_bad_case}
  1883. \end{figure}
  1884. Интересным в приведённом примере является то, что при исполнении алгоритма от
  1885. третьего начального приближения на изображении~(c) видно как алгоритм пришёл в
  1886. область близкую к искомой точке, но после сравнения качества финальных первого
  1887. и третьего приближений было выбрано первое, то есть значение функции~$\lambda$
  1888. оказалось выше в экстремуме противоположном области с искомой точкой. Как можно
  1889. попытаться избегать подобных ситуаций, будет описано в
  1890. разделе~\ref{sec:possible_advances}.
  1891. \paragraph[Анимированная визуализация двухмерного частного случая работы
  1892. алгоритма]{Анимированная визуализация двухмерного частного случая работы
  1893. алгоритма.}
  1894. \label{par:one_2d_case_anim_vis}
  1895. Анимированная визуализация двухмерного частного случая осуществляется с теми же
  1896. настройками, что и статическая визуализация, описанная в предыдущем параграфе.
  1897. Сценарий анимированной визуализации использует сценарий статической
  1898. визуализации, поэтому настройки переменных
  1899. \verb|fileName|~и~\verb|generateNewCase| необходимо менять в соответствующих
  1900. файлах \verb|ptrc_one_sample_vis-2d.sce| или \verb|.wls|. Имя файла с анимацией
  1901. определено в сценарии \verb|ptrc_one_sample_vis-2d-anim.sce| для Scilab или
  1902. \verb|.wls| для Wolfram~Mathematica переменной\par\nopagebreak
  1903. \begin{Verbatim}[samepage=true]
  1904. animationFileName="animation.gif";
  1905. \end{Verbatim}
  1906. \par\nopagebreak\noindent%
  1907. Сценарий Scilab, создающий анимированный gif\nobreakdash-файл, запускается
  1908. командой:\par\nopagebreak
  1909. \indent\indent%
  1910. \verb|scilab -f ptrc_one_sample_vis-2d-anim.sce -quit|\par\noindent%
  1911. а сценарий Wolfram~Mathematica командой:\par\nopagebreak
  1912. \indent\indent%
  1913. \verb|Mathematica ptrc_one_sample_vis-2d-anim.wls|\par\noindent%
  1914. В результате выполнения данной команды в каталоге появится файл
  1915. \verb|animation.gif|, где и будет анимированная визуализация одного двухмерного
  1916. случая.
  1917. Сценарий Scilab формирует gif\nobreakdash-файл с помощью пакета
  1918. ImageMagic~({\href{https://imagemagick.org}%
  1919. {\nolinkurl{https://imagemagick.org}}}), который должен быть установлен и
  1920. доступен.
  1921. Сценарий Wolfram~Mathematica формирует gif\nobreakdash-файл собственными
  1922. средствами, но есть нюанс: так как формирование gif\nobreakdash-файла
  1923. производится модулем на Java, при большом количестве кадров сценарий может
  1924. использовать очень много оперативной памяти вплоть до 200 гигабайт. В связи с
  1925. изложенным рекомендуется запускать сценарий с ограничением по оперативной
  1926. памяти, например, в ОС~Linux это можно сделать с помощью контрольных групп
  1927. командами:\par\nopagebreak
  1928. \begin{Verbatim}[samepage=true,fontsize=\small]
  1929. sudo cgcreate -t user:user -a user:user -g memory:mem2G
  1930. echo 2048M > /sys/fs/cgroup/memory/mem2G/memory.limit_in_bytes
  1931. \end{Verbatim}
  1932. \par\nopagebreak\noindent%
  1933. А затем запустить сценарий при данных ограничениях:\par\nopagebreak
  1934. \begin{Verbatim}[samepage=true,fontsize=\small]
  1935. cgexec -g memory:mem2G Mathematica ptrc_one_sample_vis-2d-anim.wls
  1936. \end{Verbatim}
  1937. \paragraph[Визуализация трёхмерного частного случая работы
  1938. алгоритма]{Визуализация трёхмерного частного случая работы алгоритма.}
  1939. \label{par:one_3d_case_vis}
  1940. \begin{samepage}
  1941. Рекомендуемые настройки проверочного комплекта для визуализации одного
  1942. трёхмерного частного случая работы алгоритма:\par\nopagebreak
  1943. \begin{Verbatim}[samepage=true,fontsize=\small,commandchars=\\\{\}]
  1944. #define _PTRC_TS_DIMENSIONALITY 3ul
  1945. #define _PTRC_TS_NUM_OF_SPHERES \textit{по условиям испытаний}
  1946. #define _PTRC_TS_NUM_OF_RUNS 3ul
  1947. #define _PTRC_TS_RANGE_MULTIPLIER 1.0f
  1948. #define _PTRC_TS_MIN_SENSOR_UNCERTAINTY \textit{по условиям испытаний}
  1949. #define _PTRC_TS_MAX_SENSOR_UNCERTAINTY \textit{равно предыдущему значению}
  1950. #define _PTRC_TS_SENSOR_UNCERTAINTY_INCREMENT 0.01f
  1951. #define _PTRC_TS_NUM_OF_CASES_FOR_ONE_INCREMENT 1ul
  1952. #define _PTRC_MAX_ITERATIONS_ON_SPHERE 100ul
  1953. #define _PTRC_TS_STATISTICS_FILENAME "stat_report.txt"
  1954. #define _PTRC_TS_STATISTICS_DISCRETISATION_STEP 0.001f
  1955. #define _PTRC_TS_FLOAT_OUTFORM "%.7f"
  1956. #define _PTRC_TS_DATA_OUTPUT_MODE
  1957. //#define _PTRC_TS_VERBOSE_MODE
  1958. \end{Verbatim}
  1959. \end{samepage}
  1960. \noindent После установки настроек проверочного комплекта, необходимо
  1961. осуществить его сборку в порядке указанном
  1962. в~разделе~\ref{subsubsec:test_suite}. Затем из выполните сценарий Scilab
  1963. командой:\par\nopagebreak
  1964. \indent\indent\verb|scilab -f ptrc_one_sample_vis-3d.sce|\par\noindent%
  1965. либо сценарий Wolfram~Mathematica командой:\par\nopagebreak
  1966. \indent\indent\verb|Mathematica -f ptrc_one_sample_vis-3d.wls|\par\noindent%
  1967. После выполнения сценария останется открытая оболочка и графические окна с
  1968. визуализацией. В данном случае открытые оболочки остаются специально, чтобы
  1969. можно было в интерактивных графических окнах масштабировать изображение, так
  1970. как часть визуализации достаточно мала и неразборчива на общем плане. В
  1971. сценарии первые строки представляют собой присвоение значений двум
  1972. переменным\par\nopagebreak
  1973. \begin{Verbatim}[samepage=true]
  1974. fileName="one_case_data-3d.txt";
  1975. generateNewCase=1;
  1976. \end{Verbatim}
  1977. \par\nopagebreak\noindent%
  1978. Первая их них \verb|fileName| определяет путь к и имя файла, куда будут
  1979. сохранены результаты запуска проверочного комплекта, выведенные в стандартный
  1980. вывод; вторая \verb|generateNewCase|~--~указывает сценарию производить ли новый
  1981. запуск проверочного комплекта (значение~\verb|1|) или работать с
  1982. файлом~\verb|fileName| без его изменения (значение~\verb|0|).
  1983. Для визуализации трёхмерного случая тепловая карта функции~$\lambda$ не
  1984. строится. В целом визуализация трёхмерного случая весьма неинформативна и после
  1985. построения требуется посмотреть с нескольких точек обзора, чтобы понять, как
  1986. происходило улучшение приближений. В сценарии визуализации для Scilab сферы
  1987. отображаются с помощью сетки, частоту которой регулирует
  1988. переменная~\verb|meshSize|, а в сценарии визуализации для Wolfram~Mathematica
  1989. поверхности сфер отображаются полностью, но введён регулятор прозрачности
  1990. поверхности сфер.
  1991. Сложность восприятия визуализации трёхмерного случая можно понять из
  1992. рис.~\ref{fig:fig8_one_3d_case}.
  1993. \begin{figure}[!h]
  1994. \begin{minipage}[h]{0.49\linewidth}
  1995. \center{\includegraphics[width=1\linewidth]%
  1996. {fig8_sample_start_point_1_SL.eps}} (a)\\
  1997. \end{minipage}
  1998. \hfill
  1999. \begin{minipage}[h]{0.49\linewidth}
  2000. \center{\includegraphics[width=1\linewidth]%
  2001. {fig8_sample_start_point_1_zoom_SL.eps}} (b)\\
  2002. \end{minipage}
  2003. \captionsetup{format=hang}%
  2004. \vfill
  2005. \begin{minipage}[h]{0.49\linewidth}
  2006. \center{\includegraphics[width=1\linewidth]%
  2007. {fig8_sample_start_point_1_WM.eps}} (c)\\
  2008. \end{minipage}
  2009. \hfill
  2010. \begin{minipage}[h]{0.49\linewidth}
  2011. \center{\includegraphics[width=1\linewidth]%
  2012. {fig8_sample_start_point_1_zoom_WM.eps}} (d)\\
  2013. \end{minipage}
  2014. \captionsetup{format=hang}%
  2015. \caption{Визуализация работы алгоритма в трёхмерном
  2016. случае.\newline (a), (b)~--~Scilab. (c), (d)~--~Wolfram~Mathematica.}%
  2017. \label{fig:fig8_one_3d_case}
  2018. \end{figure}
  2019. \subsection{Исходный код документации и сопутствующие файлы}
  2020. \label{subsec:prototype_documentation_source}
  2021. Данная документация предоставляется в виде исходных кодов в следующих
  2022. файлах:\par\nopagebreak
  2023. \noindent\begin{samepage}\begin{minipage}[t]{\linewidth}
  2024. {\small\dirtree{%
  2025. .1 iterative\_point\_recovery/.
  2026. .2 \ldots.
  2027. .2 documentation/.
  2028. .3 fonts/\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}каталог,
  2029. содержащий шрифты и их настройки.\end{minipage}}.
  2030. .3 images/\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}каталог,
  2031. содержащий иллюстрации документации и исходные файлы для построения
  2032. иллюстраций.\end{minipage}}.
  2033. .3 build\_script\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}сценарий
  2034. сборки документации.\end{minipage}}.
  2035. .3 ipr\_doc.cls\DTcomment{\begin{minipage}[t]{0.6666667\linewidth}файл с
  2036. определениями стиля документации.\end{minipage}}.
  2037. .3 iterative\_point\_recovery\_documentation-russian.tex\DTcomment{\\%
  2038. \hspace*{\fill}%
  2039. \begin{minipage}[t]{0.6666667\linewidth}исходный код
  2040. документации.\end{minipage}}.
  2041. .2 \ldots.
  2042. }}
  2043. \end{minipage}\end{samepage}
  2044. Документация собирается отдельно. Для её сборки необходима система вёрстки
  2045. \XeTeX /\XeLaTeX\ или иная \TeX /\LaTeX\nobreakdash-система. Система \XeTeX\ и
  2046. сопутствующие пакеты поставляются в составе дистрибутива
  2047. \TeX~Live~({\href{https://www.tug.org/texlive/}%
  2048. {\nolinkurl{https://www.tug.org/texlive/}}}). Использование системы отличной от
  2049. \XeTeX\ может потребовать внесения изменений в исходный код документации.
  2050. Сама сборка документации осуществляется из каталога
  2051. \verb|iterative_point_recovery/documentation| запуском сценария сборки\par
  2052. \indent\indent\verb|./build_script|\par
  2053. \noindent%
  2054. Если в ходе исполнения данного сценария не возникло ошибок, то в каталоге
  2055. \verb|iterative_point_recovery/documentation/build| появится файл\par
  2056. \indent\indent%
  2057. \verb|iterative_point_recovery_documentation-russian.pdf|\par
  2058. \noindent%
  2059. с документацией.
  2060. При сборке будут использованы шрифты семейства IBM~Plex, но можно вернуться к
  2061. базовому семейству Computer~Modern просто раскомментировав
  2062. строку\par\nopagebreak
  2063. \begin{Verbatim}[samepage=true]
  2064. \input{fonts/font_settings-Computer_Modern.tex}
  2065. \end{Verbatim}
  2066. \par\nopagebreak\noindent%
  2067. в преамбуле исходного кода документации.
  2068. \section{Основные направления возможных доработок}
  2069. \label{sec:possible_advances}
  2070. При реализации алгоритма для конкретных условий работы прежде всего необходима
  2071. ревизия предположений из раздела~\ref{subsec:assumptions}, так как приведённые
  2072. предположения могут не соответствовать известным условиям работы алгоритма и
  2073. требовать пересмотра. В настоящее время они сформулированы достаточно общо, что
  2074. оставляет маневр для уточнения в конкретных реализациях. При изменении
  2075. подходов, описанных в разделе~\ref{subsec:assumptions}, рекомендуется проводить
  2076. регресс\nobreakdash-оценку на случайном или специфичном задачам проверочном
  2077. множестве.
  2078. Для избегания ситуаций неправильного выбора приближения в случаях когда,
  2079. экстремум
  2080. функции~$\lambda$~(разд.~\ref{subsubsec:point_quality}~\eqref{eq:lambda})
  2081. находится на удалении от искомой точки, а возможности удовлетворительного
  2082. выбора датчиков\nobreakdash-источников расстояний нет, рассматривается
  2083. возможность сохранения и выбора из нескольких приближений, исходя из
  2084. дополнительной информации, например, о предыдущем положении искомой точки.
  2085. \newpage
  2086. \tableofcontents
  2087. \end{document}