{"id":297805,"date":"2020-01-28T09:00:40","date_gmt":"2020-01-28T09:00:40","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=297805"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=297805","title":{"rendered":"\u0427\u0435\u0440\u0435\u0437 \u0432\u0441\u044e \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u044e: \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0438 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/485776\/\">\n<h2>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0432\u0430\u0441, \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435!<\/h2>\n<blockquote><p><i>\u00ab\u2026 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0441\u0443\u0434\u043d\u0430 \u0445\u043e\u0442\u044f \u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043d\u043e \u043e\u043d\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u043e\u043d\u043e \u0435\u0441\u0442\u044c, \u043d\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0432 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0435\u00bb \u0410\u043b\u0435\u043a\u0441\u0438\u0448\u0438\u043d \u0412. \u0413. \u0438 \u0434\u0440. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u0434\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435, 2006. \u0441\u0442\u0440. 71<\/i>  <\/p><\/blockquote>\n<p>  <\/p>\n<blockquote><p><i>\u00ab\u0421 \u0434\u0432\u0443\u0445 \u043a\u0440\u0430\u0435\u0432 \u0433\u0430\u043b\u0430\u043a\u0442\u0438\u043a\u0438 \u0432\u044b\u0448\u043b\u0438 \u043f\u0435\u0448\u0435\u0445\u043e\u0434\u044b&#8230;\u00bb (\u0421) \u0421\u0435\u0440\u0433\u0435\u0439 \u041f\u043e\u043f\u043e\u0432 (\u0410\u0441\u0442\u0440\u043e\u0444\u0438\u0437\u0438\u043a)<\/i><\/p><\/blockquote>\n<p>  \u0412 \u0441\u0432\u0435\u0442\u0435 \u043d\u043e\u0432\u044b\u0445 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0439 <s>\u0441\u0442\u0438\u043b\u044f \u0430\u0440\u0442-\u043d\u0443\u0432\u043e<\/s> \u044f \u0445\u043e\u0442\u0435\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u0437\u0435\u043c\u043b\u0435. \u041d\u043e \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0430 \u0437\u0435\u043c\u043b\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u043e\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0440\u0435\u0441\u044c\u044e \u0438 \u043a\u0440\u0430\u043c\u043e\u043b\u043e\u0439, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f \u043f\u0440\u0438\u043e\u0431\u0449\u0438\u0442\u044c\u0441\u044f \u043a \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043c\u043e\u0434\u0435\u043b\u044f\u043c.<\/p>\n<ul>\n<li>\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438<\/li>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439, \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0434\u043e \u043d\u0435\u0435 \u0438 \u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u0433\u043b\u0443<\/li>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u043c \u0434\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (TOA, TOF)<\/li>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 (TDOA)<\/li>\n<\/ul>\n<p>  \u0412\u0441\u0435 \u044d\u0442\u043e \u043d\u0430 C#, Rust \u0438 Matlab, \u043d\u0430 \u0441\u0444\u0435\u0440\u0435 \u0438 \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u0430\u0445, \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438, \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c\u0438, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u2014 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.<\/p>\n<p>  \u0410 \u044d\u0442\u043e, \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u0430\u044f \u041a\u0414\u041f\u0412:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/s7\/y0\/rt\/s7y0rtxlbym7-pzjbbyvqulqhx4.png\"><br \/>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u043f\u0435\u0448\u0438\u0442 (\u044f \u0438 \u0441\u0430\u043c \u0442\u0430\u043a\u043e\u0439), \u0432\u043e\u0442 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\" rel=\"nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 GitHub<\/a>, \u0433\u0434\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438.<\/p>\n<p>  \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u0442\u0440\u0435\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0430\u043f\u043a\u0435:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/tree\/master\/CSharp\" rel=\"nofollow\">C#<\/a> <\/li>\n<li><a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/tree\/master\/Rust\" rel=\"nofollow\">Rust<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/tree\/master\/Matlab\" rel=\"nofollow\">Matlab<\/a><\/li>\n<\/ul>\n<p>  \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 C#: \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432 \u043d\u0435\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0442.\u043d. \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u043d\u043e\u0439 \u0431\u0430\u0437\u044b \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043f\u043e\u0434\u0432\u0438\u0436\u0435\u043d, \u0438 \u0435\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e \u043d\u0435\u0433\u043e \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0438 \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442, \u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0437\u0432\u0435\u0434\u043a\u0443 \u0431\u043e\u0435\u043c, \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0435\u043c\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u044b:<\/p>\n<ul>\n<li>\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/tree\/master\/CSharp\/UCNLNav_Tests\" rel=\"nofollow\">\u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 C#<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_tests.m\" rel=\"nofollow\">\u0422\u0435\u0441\u0442<\/a> \u0432\u0441\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 Matlab<\/li>\n<li>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_TOA_TDOA_2D_demo.m\" rel=\"nofollow\">\u0441\u043a\u0440\u0438\u043f\u0442<\/a> \u043f\u043e TOA\/TDOA \u0441 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u043d\u0430 Matlab<\/li>\n<li><a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_Haversine_Vs_Vincenty_demo.m\" rel=\"nofollow\">\u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Matlab<\/a> \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u0441\u0444\u0435\u0440\u0435 (Haversine equations) \u0438 \u043d\u0430 \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u0435 (Vincenty Equations)<\/li>\n<li>\u0414\u043b\u044f <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Rust\/src\/lib.rs\" rel=\"nofollow\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Rust<\/a> \u0432 \u043a\u043e\u0434\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0435\u0441\u0442\u044b. \u0418 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u00abCargo -test\u00bb<\/li>\n<\/ul>\n<p>  \u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0438 \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a (\u0441\u043e\u0441\u043b\u0430\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u043a\u043e\u043d\u0435\u0447\u043d\u043e), \u043d\u0435 \u0442\u0430\u0441\u043a\u0430\u044f \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435.<br \/>  \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0433\u043b\u044b \u2014 \u0432 \u0440\u0430\u0434\u0438\u0430\u043d\u0430\u0445, \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043c\u0435\u0442\u0440\u0430\u0445, \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043d\u0430\u0447\u043d\u0435\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441 \u043d\u0430\u0447\u0430\u043b\u0430:<\/p>\n<h2>\u0413\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438<\/h2>\n<p>  \u0415\u0441\u0442\u044c \u0434\u0432\u0435 \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438: \u043f\u0440\u044f\u043c\u0430\u044f \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u0437\u043d\u0430\u044e \u0441\u0432\u043e\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b (\u0448\u0438\u0440\u043e\u0442\u0443 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0443), \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0448\u0430\u0433\u0430\u043b 1000 <s>\u043a\u0438\u043b\u043e<\/s>\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0442\u0440\u043e\u0433\u043e \u043d\u0430 \u0441\u0435\u0432\u0435\u0440\u043e-\u0432\u043e\u0441\u0442\u043e\u043a, \u043d\u0443 \u0438\u043b\u0438 \u043d\u0430 \u0441\u0435\u0432\u0435\u0440. \u041a\u0430\u043a\u0438\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b? \u2014 \u0423\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u0443\u044e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c: <i>\u041f\u0440\u044f\u043c\u0430\u044f \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u044d\u0442\u043e \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439, \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u0434\u0438\u0440\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u043c\u0443 \u0443\u0433\u043b\u0443.<\/i><\/p>\n<p>  \u0421 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0432\u0441\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u0441\u0432\u043e\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0448\u0430\u0433\u0430\u043b \u0441\u043a\u043e\u043b\u044c\u043a\u043e-\u0442\u043e \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u0439 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u0441\u0432\u043e\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u041d\u0430\u0439\u0442\u0438, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u0440\u043e\u0448\u0435\u043b \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c: <i>\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u044d\u0442\u043e \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438.<\/i><\/p>\n<p>  \u0420\u0435\u0448\u0430\u0442\u044c \u044d\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c.<\/p>\n<p>  \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e \u0437\u0435\u043c\u043b\u044f <s>\u043f\u043b\u043e\u0441\u043a\u0430\u044f<\/s> \u2014 \u044d\u0442\u043e \u0441\u0444\u0435\u0440\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c.<br \/>  \u0412\u043e\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 (<a href=\"https:\/\/www.movable-type.co.uk\/scripts\/latlong.html\" rel=\"nofollow\">\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/a>):  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/691\/294\/b31\/691294b317bf908cd8836acba19c6cc1.svg\" alt=\"$\\phi_2=arcsin(sin\\phi_1cos\\delta+cos\\phi_1sin\\delta cos\\theta)$\" data-tex=\"display\"><\/math><\/p>\n<\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/cf4\/6d6\/267\/cf46d6267d9238fddc14910890e2893b.svg\" alt=\"$\\lambda_2=\\lambda_1+atan2(sin\\theta sin\\delta cos\\phi_1, cos\\delta-sin\\phi_1sin\\phi_2)$\" data-tex=\"display\"><\/math><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/733\/f18\/89b\/733f1889b3dbde9e508ec195a291428e.svg\" alt=\"$\\phi_1$\" data-tex=\"inline\"><\/math>, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/346\/257\/64b\/34625764b44bfa50f27daff570fd1143.svg\" alt=\"$\\lambda_1$\" data-tex=\"inline\"><\/math> \u2014 \u0448\u0438\u0440\u043e\u0442\u0430 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ff2\/c64\/99d\/ff2c6499d038a61a41d7ce75cd78788f.svg\" alt=\"$\\theta$\" data-tex=\"inline\"><\/math> \u2014 \u0434\u0438\u0440\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0443\u0433\u043e\u043b, \u043e\u0442\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043f\u043e \u0447\u0430\u0441\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0435\u043b\u043a\u0435 \u043e\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0435\u0432\u0435\u0440 (\u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0432\u0435\u0440\u0445\u0443), <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/dd8\/a86\/2f5\/dd8a862f53583925b661220cb68f577b.svg\" alt=\"$\\delta$\" data-tex=\"inline\"><\/math> \u2014 \u0443\u0433\u043b\u043e\u0432\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 d\/R. d \u2014 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0435 (\u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u043e\u0435) \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 R \u2014 \u0440\u0430\u0434\u0438\u0443\u0441 \u0437\u0435\u043c\u043b\u0438. <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2af\/2ec\/0ce\/2af2ec0ce8327cdb628a86b1c0939f48.svg\" alt=\"$\\phi_2$\" data-tex=\"inline\"><\/math>, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f5a\/862\/c4c\/f5a862c4c150f2044a293e178fd2ea5b.svg\" alt=\"$\\lambda_2$\" data-tex=\"inline\"><\/math> \u2014 \u0448\u0438\u0440\u043e\u0442\u0430 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0430 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 (\u0442\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438).<\/p>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0430\u044f (\u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430):  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/27b\/49b\/fd6\/27b49bfd61be95731b5a0e037a350e18.svg\" alt=\"$a=sin^2(\\Delta\\phi\/2)+cos\\phi_1 cos\\phi_2 sin^2(\\Delta\\lambda\/2)$\" data-tex=\"display\"><\/math><\/p>\n<\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c02\/73d\/4c0\/c0273d4c082b6734fe8cc3e03e7d838f.svg\" alt=\"$d=R * atan2(\\sqrt a,\\sqrt{1-a})$\" data-tex=\"display\"><\/math><\/p>\n<p>  \u0413\u0434\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/733\/f18\/89b\/733f1889b3dbde9e508ec195a291428e.svg\" alt=\"$\\phi_1$\" data-tex=\"inline\"><\/math>, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/346\/257\/64b\/34625764b44bfa50f27daff570fd1143.svg\" alt=\"$\\lambda_1$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2af\/2ec\/0ce\/2af2ec0ce8327cdb628a86b1c0939f48.svg\" alt=\"$\\phi_2$\" data-tex=\"inline\"><\/math>, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f5a\/862\/c4c\/f5a862c4c150f2044a293e178fd2ea5b.svg\" alt=\"$\\lambda_2$\" data-tex=\"inline\"><\/math> -\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a, R \u2014 \u0437\u0435\u043c\u043d\u043e\u0439 \u0440\u0430\u0434\u0438\u0443\u0441.<\/p>\n<p>  \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f Haversine Equations.<\/p>\n<ul>\n<li>\u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 C# \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <b>HaversineDirect<\/b> \u0438 <b>HaversineInverse<\/b> \u0438 \u0436\u0438\u0432\u0443\u0442 \u0432 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/CSharp\/UCNLNav\/Algorithms.cs\" rel=\"nofollow\">Algorithms.cs<\/a>.<\/li>\n<li>\u0412 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Rust\/src\/lib.rs\" rel=\"nofollow\">\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Rust<\/a> \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>haversine_direct<\/b> \u0438 <b>haversine_inverse<\/b>.<\/li>\n<li>\u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430 Matlab \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u0432\u043e\u0442 \u043e\u0431\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<br \/>   <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_haversine_direct.m\" rel=\"nofollow\">HaversineDirect<\/a> \u0438 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_haversine_inverse.m\" rel=\"nofollow\">HaversineInverse<\/a><\/li>\n<\/ul>\n<p>  \u0414\u043b\u044f C# \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0444\u0430\u0439\u043b, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f. \u0414\u043b\u044f Rust \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u043a\u043e\u043b\u044c \u0441\u043a\u043e\u0440\u043e \u0432\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435), \u0430 \u0434\u043b\u044f Matlab \u2014 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 Matlab \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u2014 \u043e\u0434\u0438\u043d \u0441\u043a\u0440\u0438\u043f\u0442.<\/p>\n<p>  \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u043e\u0434\u0432\u043e\u0445: \u0437\u0435\u043c\u043b\u044f \u043d\u0435 \u0441\u0444\u0435\u0440\u0430, <s>\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c<\/s> \u0438 \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u0442\u0438\u0445 \u0444\u043e\u0440\u043c\u0443\u043b \u0438\/\u0438\u043b\u0438 \u043d\u0430 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. <\/p>\n<p>  \u0418 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e. \u041d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c, \u043d\u0443\u0436\u043d\u043e \u0441 \u0447\u0435\u043c-\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c.<br \/>  \u0415\u0449\u0435 \u0432 1975 \u0433\u043e\u0434\u0443 \u0422\u0430\u0434\u0435\u0443\u0448 \u0412\u0438\u043d\u0446\u0435\u043d\u0442\u0438 (Thaddeus Vincenty) <a href=\"http:\/\/www.ngs.noaa.gov\/PUBS_LIB\/inverse.pdf\" rel=\"nofollow\">\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b<\/a> \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0441\u0444\u0435\u0440\u043e\u0438\u0434\u0430 (\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434 \u043d\u0438\u043a\u043e\u043c <s><a href=\"https:\/\/www.merriam-webster.com\/dictionary\/ellipsoid%20of%20revolution\" rel=\"nofollow\">\u042d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434 \u0420\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u0438, \u0442\u043e\u0432\u0430\u0440\u0438\u0449!<\/a><\/s> \u042d\u043b\u043b\u0438\u0441\u043e\u0438\u0434 \u0412\u0440\u0430\u0449\u0435\u043d\u0438\u044f), \u0441\u0442\u0430\u0432\u0448\u0435\u0435 \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c.<\/p>\n<p>  \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0442\u044f\u043d\u0435\u0442 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0443\u0441\u044c \u043b\u0438\u0448\u044c \u043e\u0442\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 <a href=\"http:\/\/www.ngs.noaa.gov\/PUBS_LIB\/inverse.pdf\" rel=\"nofollow\">\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0412\u0438\u043d\u0446\u0435\u043d\u0442\u0438<\/a> \u0438 \u043d\u0430 <a href=\"https:\/\/www.movable-type.co.uk\/scripts\/latlong-vincenty.html\" rel=\"nofollow\">\u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440<\/a> \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.<\/p>\n<p>  \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 UCNLNav \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c \u0412\u0438\u043d\u0446\u0435\u043d\u0442\u0438 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445:<\/p>\n<ul>\n<li>C#: <b>VincentyDirect<\/b> \u0438 <b>VincentyInverse<\/b> \u0432 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/CSharp\/UCNLNav\/Algorithms.cs\" rel=\"nofollow\">Algorithms.cs<\/a>.<\/li>\n<li>Rust: <b>vincenty_inverse<\/b> \u0438 <b>vincenty_direct<\/b><\/li>\n<li>Matlab: <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_vincenty_direct.m\" rel=\"nofollow\">Nav_vincenty_direct<\/a> \u0438 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_vincenty_inverse.m\" rel=\"nofollow\">Nav_vincenty_inverse<\/a>.<\/li>\n<\/ul>\n<p>  \u0422.\u043a. \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0412\u0438\u043d\u0446\u0435\u043d\u0442\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435, \u0442\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 (it_limit), \u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u2014 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0440\u043e\u0433, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 (epsilon). \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 10 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u0447\u0442\u0438 \u0430\u043d\u0442\u0438\u043f\u043e\u0434\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (\u043a\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0438 \u044e\u0436\u043d\u044b\u0439 \u043f\u043e\u043b\u044e\u0441\u0430) \u043c\u0435\u0442\u043e\u0434 \u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043b\u043e\u0445\u043e, \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e 2000 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0444\u0435\u0440\u043e\u0438\u0434\u0435, \u0438 \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0433\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442.<\/p>\n<p>  \u0412\u043e \u0432\u0441\u0435\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u043e\u0432. (\u0421\u043f\u043b\u043e\u0448\u044c \u0438 \u0440\u044f\u0434\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f WGS84 [https:\/\/en.wikipedia.org\/wiki\/World_Geodetic_System] \u0438 \u0435\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430):<\/p>\n<ul>\n<li>\u041d\u0430 C#: \u0412 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/CSharp\/UCNLNav\/Algorithms.cs\" rel=\"nofollow\">Algorithms.cs<\/a> \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043b\u0435 Algorithms.WGS84Ellipsoid \u2014 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043c\u0435\u0442\u043e\u0434\u044b.<\/li>\n<li>\u041d\u0430 Rust:\n<pre><code class=\"rust\">let el: Ellipsoid = Ellipsoid::from_descriptor(&amp;WGS84_ELLIPSOID_DESCRIPTOR);<\/code><\/pre>\n<\/li>\n<li>\u041d\u0430 Matlab:\n<pre><code class=\"matlab\">el = Nav_build_standard_ellipsoid(\u2018WGS84\u2019);<\/code><\/pre>\n<\/li>\n<\/ul>\n<p>  \u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0435\u044f\u0441\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0435\u0433\u043e \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u0444\u0435\u0440\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u043b\u043b\u0438\u043f\u0441\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 Matlab \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_Haversine_Vs_Vincenty_demo.m\" rel=\"nofollow\">\u0441\u043a\u0440\u0438\u043f\u0442<\/a>. <br \/>  \u0412 Matlab \u0431\u0435\u0437\u0443\u043c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u043e\u0435 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0442\u0435\u043b\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0435\u0433\u043e \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u041b\u043e\u0433\u0438\u043a\u0430 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<p>  1. \u0411\u0435\u0440\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438  <\/p>\n<pre><code class=\"matlab\">sp_lat_rad = degtorad(48.527683); sp_lon_rad = degtorad(44.558815);<\/code><\/pre>\n<p>  \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (\u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u0437\u0430\u043f\u0430\u0434):  <\/p>\n<pre><code class=\"matlab\">fwd_az_rad = 1.5 * pi + (rand * pi \/ 4 - pi \/ 8);<\/code><\/pre>\n<p>  2. \u0428\u0430\u0433\u0430\u0435\u043c \u043e\u0442 \u043d\u0435\u0435 \u043d\u0430 \u0432\u0441\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044e. \u0414\u043b\u044f \u0447\u0435\u0433\u043e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0434\u0430\u0435\u043c\u0441\u044f \u0447\u0438\u0441\u043b\u043e\u043c \u0448\u0430\u0433\u043e\u0432 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0448\u0430\u0433\u0430:  <\/p>\n<pre><code class=\"matlab\">n_samples = 10000; step_m = 1000; % meters distances = (1:n_samples) .* step_m;<\/code><\/pre>\n<p>  3. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0440\u0435\u0448\u0430\u0435\u043c \u043f\u0440\u044f\u043c\u0443\u044e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0441\u0444\u0435\u0440\u0435 \u0438 \u043d\u0430 \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u0435, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u0441\u043a\u043e\u043c\u0443\u044e \u0442\u043e\u0447\u043a\u0443:<\/p>\n<pre><code class=\"matlab\"> [ h_lats_rad(idx), h_lons_rad(idx) ] = Nav_haversine_direct(sp_lat_rad,...             sp_lon_rad,...             distances(idx),...             fwd_az_rad,...             el.mjsa_m);          [ v_lats_rad(idx), v_lons_rad(idx), v_rev_az_rad, v_its ] = Nav_vincenty_direct(sp_lat_rad,...             sp_lon_rad,...             fwd_az_rad,...             distances(idx),...             el,...             VNC_DEF_EPSILON, VNC_DEF_IT_LIMIT); <\/code><\/pre>\n<p>  4. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0440\u0435\u0448\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0435 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0444\u0435\u0440\u0435 \u0438 \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u0435:<\/p>\n<pre><code class=\"matlab\"> [ v_dist(idx) a_az_rad, a_raz_rad, its, is_ok ] = Nav_vincenty_inverse(h_lats_rad(idx),...             h_lons_rad(idx),...             v_lats_rad(idx),...             v_lons_rad(idx),...             el,...             VNC_DEF_EPSILON, VNC_DEF_IT_LIMIT);<\/code><\/pre>\n<p>  5.\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u044f\u043c\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043e\u0431\u043e\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"matlab\"> [ ip_v_dist(idx) a_az_rad, a_raz_rad, its, is_ok ] = Nav_vincenty_inverse(sp_lat_rad,...             sp_lon_rad,...             v_lats_rad(idx),...             v_lons_rad(idx),...             el,...             VNC_DEF_EPSILON, VNC_DEF_IT_LIMIT);          ip_h_dist(idx) = Nav_haversine_inverse(sp_lat_rad,...             sp_lon_rad,...             v_lats_rad(idx),...             v_lons_rad(idx),...             el.mjsa_m);<\/code><\/pre>\n<p>  \u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u044d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043b\u044f \u0448\u0430\u0433\u0430 = 1000 \u043c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0434\u043b\u044f \u0448\u0430\u0433\u0430 = 1 \u043c\u0435\u0442\u0440.<\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u044f\u043c\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c (\u0448\u0438\u0440\u043e\u0442\u0435 \u0438 \u0434\u043e\u043b\u0433\u043e\u0442\u0435), \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u044b \u00ab\u0434\u0435\u043b\u044c\u0442\u00bb, \u0431\u043b\u0430\u0433\u043e \u043d\u0430 Matlab \u0432\u0441\u0435 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443:  <\/p>\n<pre><code class=\"matlab\"> d_lat_deg = radtodeg(v_lats_rad - h_lats_rad); % \u0434\u0435\u043b\u044c\u0442\u044b \u043f\u043e \u0448\u0438\u0440\u043e\u0442\u0435 (\u0432 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u0445) d_lon_deg = radtodeg(v_lons_rad - h_lons_rad); % \u0434\u0435\u043b\u044c\u0442\u044b \u043f\u043e \u0434\u043e\u043b\u0433\u043e\u0442\u0435 (\u0432 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u0445) <\/code><\/pre>\n<p>  \u041f\u043e \u043e\u0441\u0438 \u0430\u0431\u0446\u0438\u0441\u0441 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435, \u0442.\u043a. \u0443 \u043d\u0430\u0441 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0442 1 \u0434\u043e 10000 \u043a\u043c:<\/p>\n<pre><code class=\"matlab\">figure semilogx(distances, d_lat_deg, 'r'); title('Direct geodetic problem: Vincenty vs. Haversine (Latitude difference)'); xlabel('Distance, m'); ylabel('Difference, \u00b0');  figure semilogx(distances, d_lon_deg, 'r'); title('Direct geodetic problem: Vincenty vs. Haversine (Longitude difference)'); xlabel('Distance, m'); ylabel('Difference, \u00b0');<\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0434\u043b\u044f \u0448\u0438\u0440\u043e\u0442\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/m8\/98\/tu\/m898tuhi6xxqeanr7lqu1_zfmqi.png\"><\/p>\n<p>  \u0418 \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0442\u044b:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fk\/w2\/ue\/fkw2uecc_7ikkcyi-kbirx_uky8.png\"><\/p>\n<p>  \u042f \u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0432 \u0433\u0440\u0430\u0434\u0443\u0441\u0430\u0445, \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443\u044e\u0441\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043a\u0438\u0434\u043a\u0438 \u00ab\u043d\u0430 \u0433\u043b\u0430\u0437\u043e\u043a\u00bb: <br \/>  <i>1\u00b0 \u0447\u0435\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u044d\u0442\u043e \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c 100-110 \u043a\u043c. \u0418 \u0435\u0441\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043d\u043e\u0439 \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0441\u0442\u043e\u0442\u044b\u0441\u044f\u0447\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0433\u0440\u0430\u0434\u0443\u0441\u0430 \u2014 \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438.<\/i><\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0438 \u0442\u043e\u0447\u043a\u043e\u0439, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c \u0434\u043b\u044f \u0441\u0444\u0435\u0440\u044b \u0438 \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u0430. \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c \u0412\u0438\u043d\u0446\u0435\u043d\u0442\u0438 (\u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u043c \u2014 \u0430\u0432\u0442\u043e\u0440 \u043e\u0431\u0435\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043c\u0438\u043b\u043b\u0438\u043c\u0435\u0442\u0440\u0430\u0445). \u0413\u0440\u0430\u0444\u0438\u043a\u0438 \u0432 \u043c\u0435\u0442\u0440\u0430\u0445 \u0438 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440\u0430\u0445 \u044d\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043e\u0441\u044f\u0437\u0430\u0435\u043c\u043e \u0438 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e:<\/p>\n<pre><code class=\"matlab\">figure semilogx(distances, v_dist, 'r'); title('Direct geodetic problem: Vincenty vs. Haversine (Endpoint difference by Vincenty)'); xlabel('Distance, m'); ylabel('Difference, m');<\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fc\/3p\/ys\/fc3pysy6z7at0txrcktv3nlw7ps.png\"><\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u0445 10000 \u043a\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 10 \u043a\u043c. <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0434\u043b\u044f \u0448\u0430\u0433\u0430 \u0432 1000 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435, \u0442.\u0435. \u043a\u043e\u0433\u0434\u0430 \u0432\u0435\u0441\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e \u043e\u0441\u0438 \u0425 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 10000 \u043a\u043c \u0430 \u0432\u0441\u0435\u0433\u043e 10 \u043a\u043c, \u0442\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yy\/na\/dv\/yynadv21qgcxeixfuwnzoduvctu.png\"><\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c, \u043d\u0430 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 10 \u043a\u043c \u043d\u0430\u0431\u0435\u0433\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 20 \u043c\u0435\u0442\u0440\u043e\u0432, \u0430 \u043d\u0430 1-2 \u043c\u0435\u0442\u0440\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 1000 \u043c\u0435\u0442\u0440\u043e\u0432.<br \/>  \u0412\u044b\u0432\u043e\u0434 \u043a\u0430\u043f\u0438\u0442\u0430\u043d\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c: \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u044c \u0444\u043e\u0440\u043c\u0443\u043b \u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0441\u0444\u0435\u0440\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438\u0445 \u2014 \u043e\u043d\u0438 \u043f\u0440\u043e\u0449\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  \u041d\u0443, \u0430 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043c\u0438\u043b\u043b\u0438\u043c\u0435\u0442\u0440\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0432 2013 \u0433\u043e\u0434\u0443 <a href=\"https:\/\/arxiv.org\/abs\/1109.4448\" rel=\"nofollow\">\u0431\u044b\u043b\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430<\/a> \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043d\u0430\u043d\u043e\u043c\u0435\u0442\u0440\u043e\u0432\u043e\u0439 (!) \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e. \u041d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u043c\u043e\u0433\u0443 \u0441\u0445\u043e\u0434\u0443 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u0433\u0434\u0435 \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u2014 \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u043f\u0440\u0438 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f\u0445 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e-\u0432\u043e\u043b\u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e ).<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0432\u043a\u0443\u0441\u043d\u043e\u043c\u0443:<\/p>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447<\/h2>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0443\u043c\u0435\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c:<\/p>\n<ul>\n<li>\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u043c \u0434\u043e \u0442\u043e\u0447\u0435\u043a, \u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0432 2D \u0438 3D. \u0422\u0430\u043a\u043e\u0435 \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 TOA \u2014 Time Of Arrival (\u0438\u043b\u0438 \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e TOF \u2014 Time Of Flight)<\/li>\n<li>\u041c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044f\u043c \u0432\u0440\u0435\u043c\u0435\u043d \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0432 2D \u0438 3D. \u0422\u0430\u043a\u043e\u0435 \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c TDOA (Time Difference Of Arrival).<\/li>\n<\/ul>\n<p>  \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 (\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0438\u0445 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438) \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438, \u0441 \u0448\u0443\u043c\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0447\u0438\u0441\u043b\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u2014 \u044d\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438. \u041c\u0435\u0442\u043e\u0434 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 <s>\u0438 \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u043e\u0442 \u0432\u0441\u0435<\/s>.<\/p>\n<p>  \u0422\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043d\u0435\u0432\u044f\u0437\u043a\u0438. <\/p>\n<p>  \u0414\u043b\u044f \u0437\u0430\u0434\u0430\u0447 TOA \u043e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a23\/7f1\/106\/a237f1106ae7a16001db5ac4651aa18d.svg\" alt=\"$argmin\\epsilon(x,y,z)=\\sum_{i=1}^{N}[\\sqrt{(x-x_i)^2+(y-y_i)^2+(z-z_i)^2)}-r_i]^2$\" data-tex=\"display\"><\/math><\/p>\n<p>  \u0413\u0434\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/862\/758\/a49\/862758a49ce54222a88d6b92cdf7b89f.svg\" alt=\"$\\epsilon(x,y,z)$\" data-tex=\"inline\"><\/math> \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0432\u044f\u0437\u043a\u0438 \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2e9\/fcc\/c57\/2e9fccc57219983d1efb86c767a87232.svg\" alt=\"$(x,y,z)$\" data-tex=\"inline\"><\/math>; N \u2014 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ea4\/a7d\/814\/ea4a7d814c85d72e1d24d4c7574df8f4.svg\" alt=\"$(x_i,y_i,z_i)$\" data-tex=\"inline\"><\/math>, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/300\/742\/edf\/300742edf17955ccd51dad394dde8966.svg\" alt=\"$r_i$\" data-tex=\"inline\"><\/math> \u2014 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0442 \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0434\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>  \u0410 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 TDOA \u0432\u043e\u0442 \u0442\u0430\u043a:  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/461\/035\/28d\/46103528d160551c712f968bebf9d8ae.svg\" alt=\"$argmin\\epsilon(x,y,z)=\\sum_{i=1,j=2,i\\neq j}^{N}[\\sqrt{(x-x_i)^2+(y-y_i)^2+(z-z_i)^2)}- \\\\ \\sqrt{(x-x_j)^2+(y-y_j)^2+(z-z_j)^2)}-\\nu(t_{Ai}-t_{Aj})]^2 $\" data-tex=\"display\"><\/math><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u0440\u044b \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/654\/810\/052\/654810052056b1949e2f6e87ebd9bd36.svg\" alt=\"$t_{Ai}$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/051\/5f1\/145\/0515f1145cc6323ef62e770907f4e0de.svg\" alt=\"$t_{Aj}$\" data-tex=\"inline\"><\/math>, \u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/313\/297\/0e9\/3132970e90a27c37a54815016bf5081d.svg\" alt=\"$\\nu$\" data-tex=\"inline\"><\/math> \u2014 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430. <\/p>\n<p>  \u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0432 \u043a\u043e\u0434\u0435:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0430 C#:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary&gt; \/\/\/ TOA problem residual function \/\/\/ &lt;\/summary&gt; \/\/\/ &lt;param name=&quot;basePoints&quot;&gt;base points with known locations and distances to them&lt;\/param&gt; \/\/\/ &lt;param name=&quot;x&quot;&gt;current x coordinate&lt;\/param&gt; \/\/\/ &lt;param name=&quot;y&quot;&gt;current y coordinate&lt;\/param&gt; \/\/\/ &lt;param name=&quot;z&quot;&gt;current z coordinate&lt;\/param&gt; \/\/\/ &lt;returns&gt;value of residual function in specified location&lt;\/returns&gt; public static double Eps_TOA3D(TOABasePoint[] basePoints, double x, double y, double z) {      double result = 0;      double eps = 0;      for (int i = 0; i &lt; basePoints.Length; i++)     {          eps =  Math.Sqrt((basePoints[i].X - x) * (basePoints[i].X - x) +                                  (basePoints[i].Y - y) * (basePoints[i].Y - y) +                                  (basePoints[i].Z - z) * (basePoints[i].Z - z)) - basePoints[i].D;          result += eps * eps;     }     return result; }  \/\/\/ &lt;summary&gt; \/\/\/ TDOA problem residual function \/\/\/ &lt;\/summary&gt; \/\/\/ &lt;param name=&quot;baseLines&quot;&gt;base lines, each represented by two base points with known locations and times of arrival&lt;\/param&gt; \/\/\/ &lt;param name=&quot;x&quot;&gt;current x coordinate&lt;\/param&gt; \/\/\/ &lt;param name=&quot;y&quot;&gt;current y coordinate&lt;\/param&gt; \/\/\/ &lt;param name=&quot;z&quot;&gt;current z coordinate&lt;\/param&gt; \/\/\/ &lt;returns&gt;value of residual function in specified location&lt;\/returns&gt; public static double Eps_TDOA3D(TDOABaseline[] baseLines, double x, double y, double z) {      double result = 0;      double eps;      for (int i = 0; i &lt; baseLines.Length; i++)      {           eps = Math.Sqrt((baseLines[i].X1 - x) * (baseLines[i].X1 - x) +                                  (baseLines[i].Y1 - y) * (baseLines[i].Y1 - y) +                                  (baseLines[i].Z1 - z) * (baseLines[i].Z1 - z)) -                    Math.Sqrt((baseLines[i].X2 - x) * (baseLines[i].X2 - x) +                                  (baseLines[i].Y2 - y) * (baseLines[i].Y2 - y) +                                  (baseLines[i].Z2 - z) * (baseLines[i].Z2 - z)) - baseLines[i].PRD;           result += eps * eps;       }       return result; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0430 Rust:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"rust\"> pub fn eps_toa3d(base_points: &amp;Vec&lt;(f64, f64, f64, f64)&gt;, x: f64, y: f64, z: f64) -&gt; f64 {          let mut result: f64 = 0.0;          for base_point in base_points {         result += (((base_point.0 - x).powi(2) +                     (base_point.1 - y).powi(2) +                     (base_point.2 - z).powi(2)).sqrt() - base_point.3).powi(2);     }      result }   pub fn eps_tdoa3d(base_lines: &amp;Vec&lt;(f64, f64, f64, f64, f64, f64, f64)&gt;, x: f64, y: f64, z: f64) -&gt; f64 {      let mut result: f64 = 0.0;          for base_line in base_lines {         result += (((base_line.0 - x).powi(2) +                     (base_line.1 - y).powi(2) +                     (base_line.2 - z).powi(2)).sqrt() -                                      ((base_line.3 - x).powi(2) +                     (base_line.4 - y).powi(2) +                     (base_line.5 - z).powi(2)).sqrt() - base_line.6).powi(2);             }      result } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0430 Matlab:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"matlab\"> % base_points(n, c) % n - a base point index % c = 1 -&gt; x % c = 2 -&gt; y % c = 3 -&gt; z % c = 4 -&gt; estimated distance  function [ result ] = Nav_eps_toa3d(base_points, x, y, z) result = 0.0; for n = 1:length(base_points)     result = result + (sqrt((base_points(n, 1) - x)^2 +...                             (base_points(n, 2) - y)^2 +...                             (base_points(n, 3) - z)^2) - base_points(n, 4))^2; end  function [ result ] = Nav_eps_tdoa3d(base_lines, x, y, z) result = 0.0; for n = 1:length(base_lines)    result = result + (sqrt((base_lines(n, 1) - x)^2 +...                            (base_lines(n, 2) - y)^2 +...                            (base_lines(n, 3) - z)^2) -...                       sqrt((base_lines(n, 4) - x)^2 +...                            (base_lines(n, 5) - y)^2 +...                            (base_lines(n, 6) - z)^2) -...                       base_lines(n, 7))^2; end <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u043e\u0431\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438\u043b\u0438 \u043b\u0438\u043d\u0438\u0439. \u0412\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435, \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0432\u044f\u0437\u043a\u0438 \u0442\u043e\u0436\u0435. <br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435\u0432\u044f\u0437\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043b\u043e\u0432.<\/p>\n<h3>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/h3>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 2D \u0438 3D \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0438 \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c.<br \/>  \u0423 \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0438\u043f\u043e\u0441\u0442\u0430\u0441\u0438: 2D \u0438 3D \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u0438, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Nelder%E2%80%93Mead_method\" rel=\"nofollow\">\u041d\u0435\u043b\u0434\u0435\u0440\u0430-\u041c\u0438\u0434\u0430<\/a> \u0438\u043b\u0438, \u043a\u0430\u043a \u0435\u0449\u0435 \u0435\u0433\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u043c\u0435\u0442\u043e\u0434\u0430 \u0421\u0438\u043c\u043f\u043b\u0435\u043a\u0441\u0430.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445 (\u0442.\u043d. <a href=\"https:\/\/en.wikipedia.org\/wiki\/Derivative-free_optimization\" rel=\"nofollow\">derivative-free minimization<\/a>), \u0442\u043e \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0432\u044f\u0437\u043a\u0438 \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u041f\u043b\u044e\u0441, \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  \u0412 C# \u0438 Rust 2D \u0438 3D \u0420\u0435\u0448\u0430\u0442\u0435\u043b\u0438 \u2014 Generic-\u043c\u0435\u0442\u043e\u0434\u044b:<\/p>\n<pre><code class=\"cs\">public static void NLM2D_Solve&lt;T&gt;(Func&lt;T[], double, double, double, double&gt; eps,     T[] baseElements,...  \/\/ \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0432\u044f\u0437\u043a\u0438 \u0432 \u0442\u0435\u043b\u0435 \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u044f: fxi[0] = eps(baseElements, xix[0], xiy[0], z); <\/code><\/pre>\n<p>  \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u044f:  <\/p>\n<pre><code class=\"cs\">public static void TOA_NLM2D_Solve(TOABasePoint[] basePoints,                                            double xPrev, double yPrev, double z,                                            int maxIterations, double precisionThreshold, double simplexSize,                                            out double xBest, out double yBest, out double radialError, out int itCnt) {      NLM2D_Solve&lt;TOABasePoint&gt;(Eps_TOA3D,                                basePoints, xPrev, yPrev, z,                                maxIterations, precisionThreshold, simplexSize,                                out xBest, out yBest, out radialError, out itCnt); } <\/code><\/pre>\n<p>  \u041d\u0430 Rust\u2026  <\/p>\n<pre><code class=\"rust\"> pub fn nlm_2d_solve&lt;T&gt;(eps: Eps3dFunc&lt;T&gt;, base_elements: &amp;Vec&lt;T&gt;... <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e, \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u044f\u0437\u044b\u043a\u0430.<\/p>\n<p>  \u0412 Matlabe \u0436\u0435, \u0441 \u043f\u0440\u0438\u0441\u0443\u0449\u0438\u043c \u0435\u043c\u0443 \u0432\u043e\u043b\u044e\u043d\u0442\u0430\u0440\u0438\u0437\u043c\u043e\u043c, \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0447\u0442\u043e \u0437\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0430\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435\u0432\u044f\u0437\u043a\u0438 \u0438 \u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0431\u044b\u043b\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b:  <\/p>\n<pre><code class=\"matlab\"> function [ x_best, y_best, rerr, it_cnt ] = Nav_nlm_2d_solve(eps, base_elements, .... <\/code><\/pre>\n<p>  \u0418 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u044b\u0437\u043e\u0432 \u0440\u0435\u0448\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"matlab\"> function [ x_best, y_best, rerr, it_cnt ] = Nav_toa_nlm_2d_solve(base_points, x_prev, y_prev, z,...     max_iterations, precision_threshold, simplex_size)     [ x_best, y_best, rerr, it_cnt ] = Nav_nlm_2d_solve(@Nav_eps_toa3d, base_points, x_prev, y_prev, z,...         max_iterations, precision_threshold, simplex_size); end <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f TOA \u0438 TDOA \u0437\u0430\u0434\u0430\u0447 \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 <a href=\"https:\/\/github.com\/ucnl\/UCNLNav\/blob\/master\/Matlab\/Nav_TOA_TDOA_2D_demo.m\" rel=\"nofollow\">\u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Matlab<\/a>.<\/p>\n<p>  \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432 2D \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u2014 \u044f \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d \u0447\u0442\u043e \u043c\u043e\u0433\u0443 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435\u0432\u044f\u0437\u043a\u0438 =)<\/p>\n<p>  \u0418\u0442\u0430\u043a. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c:  <\/p>\n<pre><code class=\"matlab\"> %% parameters n_base_points = 4;              % \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a  area_width_m = 1000;         % \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 max_depth_m = 100;           % \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 (\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Z) propagation_velocity = 1500;% \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c - \u0433\u0438\u0434\u0440\u043e\u0430\u043a\u0443\u0441\u0442\u0438\u043a\u0430  max_iterations = 2000;         % \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439  precision_threshold = 1E-9;   % \u043f\u043e\u0440\u043e\u0433 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 simplex_size = 1;                 % \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0438\u043c\u043f\u043b\u0435\u043a\u0441\u0430 \u0432 \u043c\u0435\u0442\u0440\u0430\u0445  contour_levels = 32;             % \u0447\u0438\u0441\u043b\u043e \u043b\u0438\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f  range_measurements_error = 0.01; % 0.01 means 1% of corresponding slant range                                                     % \u0430\u043c\u043b\u0438\u0442\u0443\u0434\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 - \u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043c 1% <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438:  <\/p>\n<pre><code class=\"matlab\"> %% actual target location r_ = rand * area_width_m \/ 2; az_ = rand * 2 * pi; actual_target_x = r_ * cos(az_); actual_target_y = r_ * sin(az_); actual_target_z = rand * max_depth_m; <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u043e\u043f\u043e\u0440\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044e \u043e\u0442 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0434\u043e \u043d\u0438\u0445 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c \u0432\u0441\u0435:  <\/p>\n<pre><code class=\"matlab\"> %% base points figure hold on grid on  base_points = zeros(n_base_points, 4);  for n = 1:n_base_points    r_ = area_width_m \/ 2 - rand * area_width_m \/ 4;    az_ = (n - 1) * 2 * pi \/ n_base_points;    base_x = r_ * cos(az_);    base_y = r_ * sin(az_);    base_z = rand * max_depth_m;    dist_to_target = Nav_dist_3d(base_x, base_y, base_z, actual_target_x, actual_target_y, actual_target_z);    base_points(n, :) = [ base_x base_y base_z dist_to_target ];    end  N =1:n_base_points; plot3(actual_target_x, actual_target_y, actual_target_z,...     'p',...     'MarkerFaceColor', 'red',...     'MarkerEdgeColor', 'blue',...     'MarkerSize', 15);  plot3(base_points(N, 1), base_points(N, 2), base_points(N, 3),...     'o',...     'MarkerFaceColor', 'green',...     'MarkerEdgeColor', 'blue',...     'MarkerSize', 15);  for n = 1:n_base_points    line([ actual_target_x, base_points(n, 1) ], [ actual_target_y, base_points(n, 2) ], [ actual_target_z, base_points(n, 3) ]);  end  view(45, 15); legend('target', 'base points'); title('Placement of base stations and the target'); xlabel('X coordinate, m'); ylabel('Y coordinate, m'); zlabel('Z coordinate, m'); <\/code><\/pre>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/sj\/fx\/to\/sjfxtoirvt7lz8zvsdxsnz8rlb0.png\"><\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043c \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438:  <\/p>\n<pre><code class=\"matlab\"> % adding range measurement errors base_points(N, 4) = base_points(N, 4) + base_points(N, 4) *...     (rand * range_measurements_error - range_measurements_error \/ 2); <\/code><\/pre>\n<p>  \u0421\u0442\u0440\u043e\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435\u0432\u044f\u0437\u043a\u0438 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441 \u043d\u0435\u043a\u043e\u0435\u0439 \u0434\u0435\u0446\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u2014 \u0438\u043d\u0430\u0447\u0435 \u0440\u0430\u0441\u0447\u0435\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0449\u0443\u0442\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 1000 \u0445 1000 \u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0441\u0447\u0438\u0442\u0430\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435\u0432\u044f\u0437\u043a\u0438 \u043f\u043e \u0432\u0441\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 10 \u043c\u0435\u0442\u0440\u043e\u0432:  <\/p>\n<pre><code class=\"matlab\"> % error surface tiles tile_size_m = 10; n_tiles = area_width_m \/ tile_size_m;  %% TOA solution error_surface_toa = zeros(n_tiles, n_tiles); for t_x = 1:n_tiles    for t_y = 1:n_tiles             error_surface_toa(t_x, t_y) = Nav_eps_toa3d(base_points,...           t_x * tile_size_m - area_width_m \/ 2,...           t_y * tile_size_m - area_width_m \/ 2,...           actual_target_z);    end end  figure surf_a = [1:n_tiles] * tile_size_m - area_width_m \/ 2; surf(surf_a, surf_a, error_surface_toa); title('TOA solution: Residual function'); xlabel('X coordinate, m'); ylabel('Y coordinate, m'); view(45, 15); <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435\u0432\u044f\u0437\u043a\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pk\/kc\/37\/pkkc37w64ludj35mxxgjmkpmsxs.png\"><\/p>\n<p>  \u042f \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u0443\u043a\u0430\u0432\u0438\u043b \u2014 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \u0432\u044b\u043f\u0443\u043a\u043b\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443 \u0441 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0438. \u0412\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u0438\u043d \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. <br \/>  \u0412\u044a\u0435\u0434\u043b\u0438\u0432\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0435\u0449\u0435\u0439 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u043e\u0440\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0438\u0441\u043a\u043e\u043c\u0443\u044e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435. \u041d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u2014 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u0432\u0441\u0435 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c \u0441\u0440\u0435\u0437\u0435:  <\/p>\n<pre><code class=\"matlab\"> figure hold on contourf(surf_a, surf_a, error_surface_toa, contour_levels); plot(actual_target_x, actual_target_y,...     'p',...     'MarkerFaceColor', 'red',...     'MarkerEdgeColor', 'blue',...     'MarkerSize', 15);  plot(base_points(N, 1), base_points(N, 2),...     'o',...     'MarkerFaceColor', 'green',...     'MarkerEdgeColor', 'blue',...     'MarkerSize', 15);  [ x_prev, y_prev ] = Nav_toa_circles_1d_solve(base_points, actual_target_z, pi \/ 180, 10, 0.1);  [ x_best, y_best, rerr, it_cnt ] = Nav_toa_nlm_2d_solve(base_points, x_prev, y_prev, actual_target_z,...     max_iterations, precision_threshold, simplex_size);  plot(x_best, y_best,...     'd',...     'MarkerFaceColor', 'yellow',...     'MarkerEdgeColor', 'blue',...     'MarkerSize', 7);  title(sprintf('TOA Solution: Residual function. Target location estimated with E_{radial} = %.3f m in %d iterations', rerr, it_cnt)); xlabel('X coordinate, m'); ylabel('Y coordinate, m'); legend('Residual function value', 'Actual target location', 'Base points', 'Estimated target location'); <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kj\/gc\/um\/kjgcumst2ekjhlp7wrtofim4lj8.png\"><\/p>\n<p>  \u0412 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0434\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u2014 \u043a\u043e\u0440\u0435\u043d\u044c \u0438\u0437 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0432\u044f\u0437\u043a\u0438. \u041d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u043d\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u043e. <br \/>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438:  <\/p>\n<pre><code class=\"matlab\"> figure hold on grid on  dx = actual_target_x - x_best; dy = actual_target_y - y_best;  plot(0, 0,...     'p',...     'MarkerFaceColor', 'red',...     'MarkerEdgeColor', 'blue',...     'MarkerSize', 15);  plot(dx, dy,...     'd',...     'MarkerFaceColor', 'yellow',...     'MarkerEdgeColor', 'blue',...     'MarkerSize', 7);  plot(-dx * 2, -dy * 2, '.w'); plot(dx * 2, dy * 2, '.w');  d_delta = Nav_dist_3d(actual_target_x, actual_target_y, actual_target_z, x_best, y_best, actual_target_z); title(sprintf('TOA Solution: Actual vs. Estimated location, distance: %.3f m', d_delta)); xlabel('X coordinate, m'); ylabel('Y coordinate, m'); legend('Actual target location', 'Estimated target location'); <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-7\/ox\/mu\/-7oxmusy37tiv9hpctnmc-ahfjo.png\"><\/p>\n<p>  \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u2014 1% \u043e\u0442 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c ~200-400 \u043c\u0435\u0442\u0440\u043e\u0432, \u0442.\u0435. \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 2-4 \u043c\u0435\u0442\u0440\u043e\u0432. \u041f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u044b \u043e\u0448\u0438\u0431\u043b\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u043d\u0430 70 \u0441\u0430\u043d\u0442\u0438\u043c\u0435\u0442\u0440\u043e\u0432. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 TDOA \u043d\u0430 \u0442\u0435\u0445 \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0442\u0432\u043e\u0440\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0441 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043e\u043f\u043e\u0440\u043d\u044b\u0435 (\u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u2014 \u043d\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e) \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043d\u0430\u0448\u0438 \u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u2014 \u0432\u0430\u0436\u043d\u044b \u043b\u0438\u0448\u044c \u0438\u0445 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0430 \u043d\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b.  <\/p>\n<pre><code class=\"matlab\"> % since TDOA works with time difference of arriaval, % we must recalculate base point's distances to times base_points(N,4) = base_points(N,4) \/ propagation_velocity; base_lines = Nav_build_base_lines(base_points, propagation_velocity); <\/code><\/pre>\n<p>  \u0421\u0442\u0440\u043e\u0438\u043c \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a:  <\/p>\n<pre><code class=\"matlab\"> error_surface_tdoa = zeros(n_tiles, n_tiles); for t_x = 1:n_tiles    for t_y = 1:n_tiles             error_surface_tdoa(t_x, t_y) = Nav_eps_tdoa3d(base_lines,...           t_x * tile_size_m - area_width_m \/ 2,...           t_y * tile_size_m - area_width_m \/ 2,...           actual_target_z);    end end  figure surf(surf_a, surf_a, error_surface_tdoa); title('TDOA Solution: Residual function'); xlabel('X coordinate, m'); ylabel('Y coordinate, m'); view(45, 15); <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/s7\/y0\/rt\/s7y0rtxlbym7-pzjbbyvqulqhx4.png\"><\/p>\n<p>  \u0418 \u0432\u0438\u0434 \u00ab\u0441\u0432\u0435\u0440\u0445\u0443\u00bb \u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438, \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wn\/hb\/qm\/wnhbqmtyg3a3l93ncl_s2zwo4e0.png\"><\/p>\n<p>  \u0418 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e, \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/sk\/vz\/xt\/skvzxtrsqgako1ewjptwwdout-4.png\"><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e TDOA \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0434\u0430\u0436\u0435 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043f\u043e TOA \u2014 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 0.3 \u043c\u0435\u0442\u0440\u0430. <\/p>\n<p>  \u0425\u043e\u0440\u043e\u0448\u043e \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u0448\u044c, \u0433\u0434\u0435 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0438\u0441\u043a\u043e\u043c\u0430\u044f \u0442\u043e\u0447\u043a\u0430. \u041d\u0430 \u0432\u043e\u0437\u0434\u0443\u0445\u0435 \u0445\u0443\u0436\u0435 \u2014 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u0435\u043a \u0437\u0440\u0435\u043d\u0438\u044f, \u043f\u043e\u0434 \u0432\u043e\u0434\u043e\u0439 \u0442\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043b \u0438 \u0432\u0441\u0435 \u2014 \u0432 99% \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u043e\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0435\u0433\u043e (\u044d\u0442\u043e \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435) \u0442\u043e\u0436\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c \u043d\u0430\u0448\u0438 \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u0440\u043e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<h2>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043a\u043a\u043e\u0440\u0434<\/h2>\n<p>  \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438:<\/p>\n<ul>\n<li>\u043f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u043e\u043f\u043e\u0440\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 GNSS-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0438 \u0438 \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0445 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b<\/li>\n<li>\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043d\u0430\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 (3D \u0417\u0430\u0434\u0430\u0447\u0430)<\/li>\n<li>\u043c\u044b \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442<\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0442\u0435\u0441\u0442\u0435 \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445. \u042f \u043a\u0430\u043a-\u0442\u043e \u043e\u0431\u0434\u0435\u043b\u0438\u043b Rust, \u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043d\u0430 \u043d\u0435\u043c. <\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0442\u0435\u0441\u0442 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043c\u0435\u0441\u0442\u043e \u0432 \u043f\u0430\u0440\u043a\u0435, \u0433\u0434\u0435 \u0447\u0430\u0441\u0442\u043e \u0433\u0443\u043b\u044f\u044e \u0441 \u0441\u043e\u0431\u0430\u043a\u043e\u0439.<\/p>\n<pre><code class=\"rust\"> #[test] fn test_tdoa_locate_3d() {    let el: Ellipsoid = Ellipsoid::from_descriptor(&amp;WGS84_ELLIPSOID_DESCRIPTOR);     let base_number = 4; \/\/ 4 \u043e\u043f\u043e\u0440\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438    let start_base_z_m: f64 = 1.5; \/\/ \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Z \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0437 \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a    let base_z_step_m = 5.0; \/\/ \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 5 \u043c\u0435\u0442\u0440\u043e\u0432     let actual_target_lat_deg: f64 = 48.513724 \/\/ singed degrees    let actual_target_lon_deg: f64 = 44.553248; \/\/ signed degrees    let actual_target_z_m: f64 = 25.0;          \/\/ meters - \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e, \u043d\u0435 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0437\u0435\u043c\u043b\u0438!     \/\/ generate base points via Vincenty equations    let mut base_points = Vec::new();     let start_dst_projection_m = 500.0;          \/\/ \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0430 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 500 \u043c\u0435\u0442\u0440\u043e\u0432    let dst_inc_step_m = 50.0;                      \/\/ \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f - \u043d\u0430 50 \u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u0430\u043b\u044c\u0448\u0435                           \/\/ azimuth step    let azimuth_step_rad = PI2 \/ base_number as f64; \/\/ \u043e\u043f\u043e\u0440\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u0438\u0441\u043a\u043e\u043c\u043e\u0439     let actual_target_lat_rad = actual_target_lat_deg.to_radians();    let actual_target_lon_rad = actual_target_lon_deg.to_radians();     \/\/ signal propagation speed    let velocity_mps = 1450.0; \/\/ m\/s, \u044f \u043f\u0440\u0438\u0432\u044b\u043a \u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0437\u0432\u0443\u043a\u0430 \u0432 \u0432\u043e\u0434\u0435     \/\/ \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a    for base_idx in 0..base_number {        \/\/ \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u043d\u0430\u043a\u043b\u043e\u043d\u043d\u043e\u0439 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0437\u0435\u043c\u043b\u0438        let dst_projection_m = start_dst_projection_m + dst_inc_step_m * base_idx as f64;        \/\/ \u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043e\u043f\u043e\u0440\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443        let azimuth_rad = azimuth_step_rad * base_idx as f64;        \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u043f\u043e\u0440\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c Vincenty        let vd_result = vincenty_direct(actual_target_lat_rad, actual_target_lon_rad,             azimuth_rad, dst_projection_m,             &amp;el,             VNC_DEF_EPSILON, VNC_DEF_IT_LIMIT);                         \/\/ \u043f\u0440\u0438\u0440\u0430\u0449\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 Z        let base_z_m = start_base_z_m + base_z_step_m * base_idx as f64;        \/\/ \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u043a\u043b\u043e\u043d\u043d\u043e\u0439 \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438        let dz_m = actual_target_z_m - base_z_m;        \/\/ \u043d\u0430\u043a\u043b\u043e\u043d\u043d\u0430\u044f \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0442\u0435\u043e\u0440\u0435\u043c\u0435 \u041f\u0438\u0444\u0430\u0433\u043e\u0440\u0430        let slant_range_m = (dst_projection_m * dst_projection_m + dz_m * dz_m).sqrt();                \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u043f\u043e\u0440\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443. \u0418 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0435\u043b\u0438\u0432 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0432\u0443\u043a\u0430      Rust \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0440\u0430\u0434\u0443\u0435\u0442 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e\u043c!        base_points.push((vd_result.0.to_degrees(), vd_result.1.to_degrees(), base_z_m, slant_range_m \/ velocity_mps));    }              \/\/ \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e - \u0432\u0441\u0435 \u043f\u0440\u0438\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c NAN-\u0430\u043c     let lat_prev_deg = f64::NAN;     let lon_prev_deg = f64::NAN;     let prev_z_m = f64::NAN;      \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435     let tdoa_3d_result = tdoa_locate_3d(&amp;base_points,     lat_prev_deg, lon_prev_deg, prev_z_m,        NLM_DEF_IT_LIMIT, NLM_DEF_PREC_THRLD, 10.0, &amp;el, velocity_mps);      \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043a\u043e\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e     let vi_result = vincenty_inverse(actual_target_lat_rad, actual_target_lon_rad,         tdoa_3d_result.0.to_radians(), tdoa_3d_result.1.to_radians(),        &amp;el, VNC_DEF_EPSILON, VNC_DEF_IT_LIMIT);              assert!(vi_result.0 &lt; start_dst_projection_m * 0.01, &quot;Estimated location is farer than limit (1%): {}&quot;, vi_result.0);     assert_approx_eq!(tdoa_3d_result.2, actual_target_z_m, start_dst_projection_m * 0.05);              assert!(tdoa_3d_result.3 &lt; start_dst_projection_m * 0.01, &quot;Residual function greater than limit (1%): {}&quot;, tdoa_3d_result.3);     assert!(tdoa_3d_result.4 &lt; NLM_DEF_IT_LIMIT, &quot;Method did not converge: iterations limit exeeded {}&quot;, tdoa_3d_result.4); } <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0438\u043c\u0435\u0435\u043c:<br \/>  \u0420\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (Lat, Lon, Z): 48.513724 44.553248 25<br \/>  \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (Lat, Lon, Z): 48.513726 44.553252 45.6<br \/>  \u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043f\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 (\u043c): 0.389 <br \/>  \u0420\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 Z (\u043c): 20.6<\/p>\n<p>  \u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u00ab\u0432 \u043f\u043b\u0430\u043d\u0435\u00bb \u2014 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0435, \u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 40 \u0441\u0430\u043d\u0442\u0438\u043c\u0435\u0442\u0440\u043e\u0432, \u0430 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 \u2014 20 \u043c\u0435\u0442\u0440\u043e\u0432. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c =)<\/p>\n<h2>P.S.<\/h2>\n<p>  \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u2014 \u0447\u0438\u0441\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435. \u0412 \u043f\u043b\u0430\u043d\u0430\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 C \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u043e\u0431\u044a\u0435\u043c\u043b\u044e\u0449\u0435\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435 \u043e\u0442\u043a\u043b\u0430\u043d\u044f\u0442\u044c\u0441\u044f, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0411\u0443\u0434\u0443 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0440\u0430\u0434 \u043b\u044e\u0431\u043e\u043c\u0443 feedback. <br \/>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0441\u0442\u0430\u0442\u044c\u044f \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b.<br \/>  \u041f\u0440\u043e \u043b\u044e\u0431\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 (\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435) \u0441\u043e\u043e\u0431\u0449\u0430\u0439\u0442\u0435 \u2014 \u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044e.<\/p>\n<h2>P.P.S<\/h2>\n<p>  \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0437\u0434\u0435\u0441\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u043d\u043b\u0430\u0439\u043d (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u044b Matlab\/Octave, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0441\u0430\u043c:  <\/p>\n<ul>\n<li><a href=\"https:\/\/www.tutorialspoint.com\/execute_matlab_online.php\" rel=\"nofollow\">Online Octave Compiler<\/a> <\/li>\n<li><a href=\"https:\/\/octave-online.net\/\" rel=\"nofollow\">Octave online<\/a><\/li>\n<li><a href=\"http:\/\/www.gnu.org\/software\/octave\/\" rel=\"nofollow\">GNU Octave<\/a><\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/485776\/\"> https:\/\/habr.com\/ru\/post\/485776\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/485776\/\">\n<h2>\u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0432\u0430\u0441, \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435!<\/h2>\n<blockquote><p><i>\u00ab\u2026 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0441\u0443\u0434\u043d\u0430 \u0445\u043e\u0442\u044f \u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043d\u043e \u043e\u043d\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u043e\u043d\u043e \u0435\u0441\u0442\u044c, \u043d\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u0432 \u043a\u0430\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0435\u00bb \u0410\u043b\u0435\u043a\u0441\u0438\u0448\u0438\u043d \u0412. \u0413. \u0438 \u0434\u0440. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u0443\u0434\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435, 2006. \u0441\u0442\u0440. 71<\/i>  <\/p><\/blockquote>\n<p>  <\/p>\n<blockquote><p><i>\u00ab\u0421 \u0434\u0432\u0443\u0445 \u043a\u0440\u0430\u0435\u0432 \u0433\u0430\u043b\u0430\u043a\u0442\u0438\u043a\u0438 \u0432\u044b\u0448\u043b\u0438 \u043f\u0435\u0448\u0435\u0445\u043e\u0434\u044b&#8230;\u00bb (\u0421) \u0421\u0435\u0440\u0433\u0435\u0439 \u041f\u043e\u043f\u043e\u0432 (\u0410\u0441\u0442\u0440\u043e\u0444\u0438\u0437\u0438\u043a)<\/i><\/p><\/blockquote>\n<p>  \u0412 \u0441\u0432\u0435\u0442\u0435 \u043d\u043e\u0432\u044b\u0445 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0439 <s>\u0441\u0442\u0438\u043b\u044f \u0430\u0440\u0442-\u043d\u0443\u0432\u043e<\/s> \u044f \u0445\u043e\u0442\u0435\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u0437\u0435\u043c\u043b\u0435. \u041d\u043e \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0430 \u0437\u0435\u043c\u043b\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0430\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u043e\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0440\u0435\u0441\u044c\u044e \u0438 \u043a\u0440\u0430\u043c\u043e\u043b\u043e\u0439, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f \u043f\u0440\u0438\u043e\u0431\u0449\u0438\u0442\u044c\u0441\u044f \u043a \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043c\u043e\u0434\u0435\u043b\u044f\u043c.<\/p>\n<ul>\n<li>\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438<\/li>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439, \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0434\u043e \u043d\u0435\u0435 \u0438 \u0430\u0437\u0438\u043c\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u0433\u043b\u0443<\/li>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044f\u043c \u0434\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a (TOA, TOF)<\/li>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043f\u043e \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 (TDOA)<\/li>\n<\/ul>\n<p>  \u0412\u0441\u0435 \u044d\u0442\u043e \u043d\u0430 C#, Rust \u0438 Matlab, \u043d\u0430 \u0441\u0444\u0435\u0440\u0435 \u0438 \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u0438\u0434\u0430\u0445, \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438, \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c\u0438, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u2014 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c.<\/p>\n<p>  \u0410 \u044d\u0442\u043e, \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u0430\u044f \u041a\u0414\u041f\u0412:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/s7\/y0\/rt\/s7y0rtxlbym7-pzjbbyvqulqhx4.png\">  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-297805","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=297805"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297805\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=297805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=297805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=297805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}