{"id":456883,"date":"2025-04-22T09:00:08","date_gmt":"2025-04-22T09:00:08","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=456883"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=456883","title":{"rendered":"<span>\u0420\u0435\u043b\u044f\u0442\u0438\u0432\u0438\u0441\u0442\u0441\u043a\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9eb\/25a\/630\/9eb25a63057318171c202bc6b8a9b1b4.png\" width=\"780\" height=\"440\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9eb\/25a\/630\/9eb25a63057318171c202bc6b8a9b1b4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9eb\/25a\/630\/9eb25a63057318171c202bc6b8a9b1b4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u043c\u0443, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u0438 \u0431\u0435\u0437 \u0441\u043c\u0441, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u043d\u0443\u044e \u0434\u044b\u0440\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 OpenGL, \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u041e\u0422\u041e.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0435\u0439 \u0441\u0432\u0435\u0442\u0430, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440 \u0420\u0443\u043d\u0433\u0435-\u041a\u0443\u0442\u0442\u044b \u043d\u0430 <a href=\"https:\/\/www.khronos.org\/opengl\/wiki\/OpenGL_Shading_Language\" rel=\"noopener noreferrer nofollow\">GLSL<\/a>, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0432 \u043e\u0434\u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043c <a href=\"https:\/\/www.khronos.org\/opengl\/wiki\/Fragment_Shader\" rel=\"noopener noreferrer nofollow\">\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043f\u0443\u0442\u044c \u043b\u0443\u0447\u0435\u0439, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430\u0437\u0430\u0434 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430: \u043c\u0435\u0442\u0440\u0438\u043a\u0430, \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u0438 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/408\/aec\/258\/408aec25871f72f65a78dc3bcccf3e98.png\" alt=\"\u0413\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043b\u0438\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\" title=\"\u0413\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043b\u0438\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\" width=\"799\" height=\"600\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/408\/aec\/258\/408aec25871f72f65a78dc3bcccf3e98.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/408\/aec\/258\/408aec25871f72f65a78dc3bcccf3e98.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043b\u0438\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0441\u0432\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u0432\u0434\u043e\u043b\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e &#171;\u043f\u0440\u044f\u043c\u0430\u044f&#187; &#8212; \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435. \u0422\u0430\u043a, \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439 \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438 \u0441\u0430\u043c\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0435 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0440\u0430), \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 &#171;\u043f\u0440\u044f\u043c\u0430\u044f&#187; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c, \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cf5\/1ce\/dc7\/cf51cedc788c82542d15744c8f0c4fce.png\" alt=\"&quot;\u041f\u0440\u044f\u043c\u0430\u044f&quot; \u043d\u0430 \u0442\u043e\u0440\u0435\" title=\"&quot;\u041f\u0440\u044f\u043c\u0430\u044f&quot; \u043d\u0430 \u0442\u043e\u0440\u0435\" width=\"591\" height=\"484\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cf5\/1ce\/dc7\/cf51cedc788c82542d15744c8f0c4fce.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cf5\/1ce\/dc7\/cf51cedc788c82542d15744c8f0c4fce.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>&#171;\u041f\u0440\u044f\u043c\u0430\u044f&#187; \u043d\u0430 \u0442\u043e\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u043a\u0443\u044e \u043a\u0440\u0438\u0432\u0443\u044e &#171;\u043f\u0440\u044f\u043c\u043e\u0439&#187;? \u0421\u0430\u043c\u043e\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 &#8212; \u0432\u0437\u044f\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0435\u0451 \u0442\u043e\u0447\u043a\u0435, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439, \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432\u0434\u043e\u043b\u044c \u044d\u0442\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0442\u0430\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043e \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 &#8212; \u0442\u043e \u043a\u0440\u0438\u0432\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439<\/em>, \u0438 \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0431\u043b\u0438\u0437\u043a\u043e\u0435 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043a \u043f\u043e\u043d\u044f\u0442\u0438\u044e \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438.<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0434\u043b\u044f \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438  &#8212; \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0443\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0443. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b <a href=\"https:\/\/docs.sympy.org\/latest\/index.html\" rel=\"noopener noreferrer nofollow\">sympy<\/a>.<\/p>\n<pre><code class=\"python\">from sympy import * from sympy.diffgeom import * import numpy as np <\/code><\/pre>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/docs.sympy.org\/latest\/modules\/diffgeom.html\" rel=\"noopener noreferrer nofollow\">sympy.diffgeom<\/a> \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u0435\u043d \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438, \u044f \u0431\u044b \u0434\u0430\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, \u0443\u0440\u043e\u0434\u043b\u0438\u0432, \u043d\u043e \u043e\u043d \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u0441\u044f\u043a\u0438\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f\u0445, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Atlas_(topology)\" rel=\"noopener noreferrer nofollow\">\u0430\u0442\u043b\u0430\u0441\u043e\u043c<\/a>. \u041d\u0430\u0448 \u0430\u0442\u043b\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443, \u043d\u043e \u0441 \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 &#8212; \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0442.\u043a. \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0435\u0439 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u0428\u0432\u0430\u0440\u0446\u0448\u0438\u043b\u044c\u0434\u0430), \u0438 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u043e\u0439 &#8212; \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043b\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442:<\/p>\n<pre><code class=\"python\">t_, x_, y_, z_ = symbols(\"t x y z\") rho_, theta_, phi_ = symbols(\"\\\\rho \\\\theta \\\\phi\") <\/code><\/pre>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441 <code>_<\/code> \u0434\u043b\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0431\u044b\u043b\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>\u0421\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b:<\/p>\n<pre><code class=\"python\">x = rho_ * sin(theta_) * sin(phi_) y = rho_ * sin(theta_) * cos(phi_) z = rho_ * cos(theta_) print(latex(x_) + \" = \" + latex(x)) print(latex(y_) + \" = \" + latex(y)) print(latex(z_) + \" = \" + latex(z)) <\/code><\/pre>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{array}l x = \\rho \\sin{\\left(\\phi \\right)} \\sin{\\left(\\theta \\right)} \\\\ y = \\rho \\sin{\\left(\\theta \\right)} \\cos{\\left(\\phi \\right)} \\\\ z = \\rho \\cos{\\left(\\theta \\right)} \\\\ \\end{array}\" alt=\"\\begin{array}l x = \\rho \\sin{\\left(\\phi \\right)} \\sin{\\left(\\theta \\right)} \\\\ y = \\rho \\sin{\\left(\\theta \\right)} \\cos{\\left(\\phi \\right)} \\\\ z = \\rho \\cos{\\left(\\theta \\right)} \\\\ \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b52\/51b\/bc1\/b5251bbc1acd0cd0e9b66406eaf8ab89.svg\" width=\"167\" height=\"80\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b52\/51b\/bc1\/b5251bbc1acd0cd0e9b66406eaf8ab89.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b52\/51b\/bc1\/b5251bbc1acd0cd0e9b66406eaf8ab89.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c 4\u0445-\u043c\u0435\u0440\u043d\u043e\u0435 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 <code>spacetime<\/code>, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0435\u0433\u043e \u0430\u0442\u043b\u0430\u0441 \u043a\u0430\u0440\u0442\u0443 <code>patch<\/code>, \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u043d\u0430 \u043d\u0435\u0439 \u0434\u0432\u0435 \u043d\u0430\u0448\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u0443:<\/p>\n<pre><code class=\"cpp\">spacetime = Manifold(\"spacetime\", 4) patch = Patch(\"patch\", spacetime)  relation_dict = {     (\"spherical\", \"cart\"): [(x_, y_, z_, t_), (x, y, z, t_)] }  coord_sh = CoordSystem(\"spherical\", patch, (t_, rho_, theta_, phi_), relation_dict) coord_cart = CoordSystem(\"cart\", patch, (x_, y_, z_, t_), relation_dict)<\/code><\/pre>\n<p>\u041e\u0434\u043d\u043e \u0438\u0437 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432 sympy.diffgeom \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435\u043c. \u041d\u0443\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043e\u0442\u0442\u0443\u0434\u0430 \u043d\u043e\u0432\u044b\u0435:<\/p>\n<pre><code class=\"python\">c_t, c_rho, c_theta, c_phi = coord_sh.base_scalars() print(\",\".join(map(latex, (c_t, c_rho, c_theta, c_phi))))<\/code><\/pre>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\mathbf{t},\\mathbf{\\rho},\\mathbf{\\theta},\\mathbf{\\phi}\" alt=\"\\mathbf{t},\\mathbf{\\rho},\\mathbf{\\theta},\\mathbf{\\phi}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d13\/f04\/e18\/d13f04e18161b739df34f1d7e5cbcf18.svg\" width=\"66\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d13\/f04\/e18\/d13f04e18161b739df34f1d7e5cbcf18.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d13\/f04\/e18\/d13f04e18161b739df34f1d7e5cbcf18.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u044d\u0442\u043e \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 sympy.giffgeom.<\/p>\n<p>\u0417\u0430\u0434\u0430\u0434\u0438\u043c \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u0428\u0432\u0430\u0440\u0446\u0448\u0438\u043b\u044c\u0434\u0430:<\/p>\n<pre><code class=\"python\">Rs = symbols(\"r_s\")  d_t, d_rho, d_theta, d_phi = coord_sh.base_oneforms()  TP = TensorProduct metric = (     + (1 - Rs\/c_rho) * TP(d_t, d_t)     - 1 \/ (1 - Rs \/ c_rho) * TP(d_rho, d_rho)     - (c_rho**2) * TP(d_theta, d_theta)     - (c_rho**2) * (sin(c_theta)**2) * TP(d_phi, d_phi))  print(latex(metric))<\/code><\/pre>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\left(- \\frac{r_{s}}{\\mathbf{\\rho}} + 1\\right) \\operatorname{d}t \\otimes \\operatorname{d}t - \\sin^{2}{\\left(\\mathbf{\\theta} \\right)} \\mathbf{\\rho}^{2} \\operatorname{d}\\phi \\otimes \\operatorname{d}\\phi - \\mathbf{\\rho}^{2} \\operatorname{d}\\theta \\otimes \\operatorname{d}\\theta - \\frac{\\operatorname{d}\\rho \\otimes \\operatorname{d}\\rho}{- \\frac{r_{s}}{\\mathbf{\\rho}} + 1}\" alt=\"\\left(- \\frac{r_{s}}{\\mathbf{\\rho}} + 1\\right) \\operatorname{d}t \\otimes \\operatorname{d}t - \\sin^{2}{\\left(\\mathbf{\\theta} \\right)} \\mathbf{\\rho}^{2} \\operatorname{d}\\phi \\otimes \\operatorname{d}\\phi - \\mathbf{\\rho}^{2} \\operatorname{d}\\theta \\otimes \\operatorname{d}\\theta - \\frac{\\operatorname{d}\\rho \\otimes \\operatorname{d}\\rho}{- \\frac{r_{s}}{\\mathbf{\\rho}} + 1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f6b\/21d\/e45\/f6b21de45f7b2ce250fdac077b674870.svg\" width=\"576\" height=\"57\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f6b\/21d\/e45\/f6b21de45f7b2ce250fdac077b674870.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f6b\/21d\/e45\/f6b21de45f7b2ce250fdac077b674870.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 &#8212; \u044d\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e <code>simpy.diffgeom<\/code>. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0434\u0430\u0439\u0442\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u043e\u0440\u043c\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0442\u0435\u043d\u0437\u043e\u0440\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"g_{ij}\" alt=\"g_{ij}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3a\/3a9\/3a9c0e52292d6e16e516190177a376f2.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3a\/3a9\/3a9c0e52292d6e16e516190177a376f2.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3a\/3a9\/3a9c0e52292d6e16e516190177a376f2.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043d\u043e \u043d\u0435\u0442. \u0422\u043e\u043b\u044c\u043a\u043e \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b, \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0430\u0440\u0434\u043a\u043e\u0440!<\/p>\n<p>\u041a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0439 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Connection_(mathematics)\" rel=\"noopener noreferrer nofollow\">\u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u0438<\/a> (\u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043a\u0430\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0444\u0435\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u043e\u0434\u0430). \u041c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c &#8212; \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043a \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0443 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0435\u043d\u0437\u043e\u0440 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\u043d. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0433\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Covariant_derivative\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f<\/a> \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u044e (\u043d\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0442\u0435\u043d\u0437\u043e\u0440\u0430 \u0432 \u043a\u0440\u0438\u0432\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f).<\/p>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c simpy.diffgeom \u0443\u0441\u043b\u0443\u0436\u043b\u0438\u0432\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0444\u0435\u043b\u044f <code>metric_to_Christoffel_2nd<\/code>:<\/p>\n<pre><code class=\"python\">christoffel = simplify(metric_to_Christoffel_2nd(metric))  print(\"\\\\begin{cases}\") for (i,j,k) in np.ndindex(*np.shape(christoffel)):     if not christoffel[i,j,k].is_zero:         print(f\"\\\\Gamma_{{{i}{j}{k}}} =\" + latex(christoffel[i,j,k]) + \" \\\\\\\\\") print(\"\\\\end{cases}\")<\/code><\/pre>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{cases}\\Gamma_{001} =\\frac{r_{s}}{2 \\left(- r_{s} + \\mathbf{\\rho}\\right) \\mathbf{\\rho}} \\\\\\Gamma_{010} =\\frac{r_{s}}{2 \\left(- r_{s} + \\mathbf{\\rho}\\right) \\mathbf{\\rho}} \\\\\\Gamma_{100} =\\frac{r_{s} \\left(- r_{s} + \\mathbf{\\rho}\\right)}{2 \\mathbf{\\rho}^{3}} \\\\\\Gamma_{111} =\\frac{r_{s}}{2 \\left(r_{s} - \\mathbf{\\rho}\\right) \\mathbf{\\rho}} \\\\\\Gamma_{122} =r_{s} - \\mathbf{\\rho} \\\\\\Gamma_{133} =\\left(r_{s} - \\mathbf{\\rho}\\right) \\sin^{2}{\\left(\\mathbf{\\theta} \\right)} \\\\\\Gamma_{212} =\\frac{1}{\\mathbf{\\rho}} \\\\\\Gamma_{221} =\\frac{1}{\\mathbf{\\rho}} \\\\\\Gamma_{233} =- \\frac{\\sin{\\left(2 \\mathbf{\\theta} \\right)}}{2} \\\\\\Gamma_{313} =\\frac{1}{\\mathbf{\\rho}} \\\\\\Gamma_{323} =\\frac{1}{\\tan{\\left(\\mathbf{\\theta} \\right)}} \\\\\\Gamma_{331} =\\frac{1}{\\mathbf{\\rho}} \\\\\\Gamma_{332} =\\frac{1}{\\tan{\\left(\\mathbf{\\theta} \\right)}}\\end{cases}\" alt=\"\\begin{cases}\\Gamma_{001} =\\frac{r_{s}}{2 \\left(- r_{s} + \\mathbf{\\rho}\\right) \\mathbf{\\rho}} \\\\\\Gamma_{010} =\\frac{r_{s}}{2 \\left(- r_{s} + \\mathbf{\\rho}\\right) \\mathbf{\\rho}} \\\\\\Gamma_{100} =\\frac{r_{s} \\left(- r_{s} + \\mathbf{\\rho}\\right)}{2 \\mathbf{\\rho}^{3}} \\\\\\Gamma_{111} =\\frac{r_{s}}{2 \\left(r_{s} - \\mathbf{\\rho}\\right) \\mathbf{\\rho}} \\\\\\Gamma_{122} =r_{s} - \\mathbf{\\rho} \\\\\\Gamma_{133} =\\left(r_{s} - \\mathbf{\\rho}\\right) \\sin^{2}{\\left(\\mathbf{\\theta} \\right)} \\\\\\Gamma_{212} =\\frac{1}{\\mathbf{\\rho}} \\\\\\Gamma_{221} =\\frac{1}{\\mathbf{\\rho}} \\\\\\Gamma_{233} =- \\frac{\\sin{\\left(2 \\mathbf{\\theta} \\right)}}{2} \\\\\\Gamma_{313} =\\frac{1}{\\mathbf{\\rho}} \\\\\\Gamma_{323} =\\frac{1}{\\tan{\\left(\\mathbf{\\theta} \\right)}} \\\\\\Gamma_{331} =\\frac{1}{\\mathbf{\\rho}} \\\\\\Gamma_{332} =\\frac{1}{\\tan{\\left(\\mathbf{\\theta} \\right)}}\\end{cases}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3b2\/d33\/52b\/3b2d3352b87e5c148a62bac06ef43807.svg\" width=\"216\" height=\"406\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3b2\/d33\/52b\/3b2d3352b87e5c148a62bac06ef43807.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3b2\/d33\/52b\/3b2d3352b87e5c148a62bac06ef43807.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0432\u044b\u0432\u043e\u0434 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u0438\u043c. \u041e\u043d, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439.<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u043a\u0440\u0438\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u0430\u043a <img decoding=\"async\" class=\"formula inline\" source=\"x^\\mu(t)\" alt=\"x^\\mu(t)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c9\/c91\/c91474f071365e2ee206e97b159b237a.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c9\/c91\/c91474f071365e2ee206e97b159b237a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c\/c9\/c91\/c91474f071365e2ee206e97b159b237a.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e\u0433\u0434\u0430 \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a \u043d\u0435\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <img decoding=\"async\" class=\"formula inline\" source=\"\\dot{x}^\\mu(t) = \\frac{d}{dt}x^\\mu(t)\" alt=\"\\dot{x}^\\mu(t) = \\frac{d}{dt}x^\\mu(t)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/db\/db7\/db7f23bd1bc8b6d33c7a153ad0889ab3.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/db\/db7\/db7f23bd1bc8b6d33c7a153ad0889ab3.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/db\/db7\/db7f23bd1bc8b6d33c7a153ad0889ab3.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.\u041f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432\u0434\u043e\u043b\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u044e:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\nabla_{\\dot{x}} \\dot{x} = 0\" alt=\"\\nabla_{\\dot{x}} \\dot{x} = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/56f\/95c\/7a3\/56f95c7a3be572aebb392b4147afac12.svg\" width=\"74\" height=\"20\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/56f\/95c\/7a3\/56f95c7a3be572aebb392b4147afac12.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/56f\/95c\/7a3\/56f95c7a3be572aebb392b4147afac12.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0420\u0430\u0441\u043a\u0440\u043e\u0435\u043c \u0435\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0444\u0435\u043b\u044f:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\nabla_{\\dot{x}} \\dot{x}=\\left( \\frac{\\partial}{\\partial{x^\\mu}} \\dot{x}^\\nu + \\Gamma^{\\nu}_{\\kappa\\mu}\\dot{x}^\\kappa \\right) \\dot{x}^\\mu=\\left( \\frac{\\partial}{\\partial{x^\\mu}} \\frac{dx^\\nu}{dt} \\right) \\frac{dx^\\mu}{dt}+\\Gamma^{\\nu}_{\\kappa\\mu} \\frac{dx^\\kappa}{dt} \\frac{dx^\\mu}{dt}\" alt=\"\\nabla_{\\dot{x}} \\dot{x}=\\left( \\frac{\\partial}{\\partial{x^\\mu}} \\dot{x}^\\nu + \\Gamma^{\\nu}_{\\kappa\\mu}\\dot{x}^\\kappa \\right) \\dot{x}^\\mu=\\left( \\frac{\\partial}{\\partial{x^\\mu}} \\frac{dx^\\nu}{dt} \\right) \\frac{dx^\\mu}{dt}+\\Gamma^{\\nu}_{\\kappa\\mu} \\frac{dx^\\kappa}{dt} \\frac{dx^\\mu}{dt}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/47\/47a\/47a7d96f84b717735b728dcb64f3727c.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/47\/47a\/47a7d96f84b717735b728dcb64f3727c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/47\/47a\/47a7d96f84b717735b728dcb64f3727c.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u043c \u043f\u043e\u043c\u0435\u043d\u044fe\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0446\u0435\u043f\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\left( \\frac{\\partial}{\\partial{x^\\mu}} \\frac{dx^\\nu}{dt} \\right) \\frac{dx^\\mu}{dt}=\\frac{dx^\\mu}{dt}\\frac{\\partial}{\\partial{x^\\mu}} \\left( \\frac{dx^\\nu}{dt} \\right)=\\frac{d}{dt}\\left( \\frac{dx^\\nu}{dt} \\right)=\\frac{d^2 x^\\nu}{dt^2}\" alt=\"\\left( \\frac{\\partial}{\\partial{x^\\mu}} \\frac{dx^\\nu}{dt} \\right) \\frac{dx^\\mu}{dt}=\\frac{dx^\\mu}{dt}\\frac{\\partial}{\\partial{x^\\mu}} \\left( \\frac{dx^\\nu}{dt} \\right)=\\frac{d}{dt}\\left( \\frac{dx^\\nu}{dt} \\right)=\\frac{d^2 x^\\nu}{dt^2}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3fc\/3fc5b45fcf5c097b8743a07e581e58a5.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3fc\/3fc5b45fcf5c097b8743a07e581e58a5.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3f\/3fc\/3fc5b45fcf5c097b8743a07e581e58a5.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\frac{d^2 x^\\nu}{dt^2} + \\Gamma^{\\nu}_{\\kappa\\mu} \\frac{dx^\\kappa}{dt} \\frac{dx^\\mu}{dt}= 0\" alt=\"\\frac{d^2 x^\\nu}{dt^2} + \\Gamma^{\\nu}_{\\kappa\\mu} \\frac{dx^\\kappa}{dt} \\frac{dx^\\mu}{dt}= 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d3\/d3b\/d3b6a72d7f7a760281b830e7bf260344.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d3\/d3b\/d3b6a72d7f7a760281b830e7bf260344.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d3\/d3b\/d3b6a72d7f7a760281b830e7bf260344.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0418\u043b\u0438, \u043f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\boxed{\\ddot{x}^\\nu =-\\Gamma^{\\nu}_{\\kappa\\mu} \\dot{x}^\\kappa \\dot{x}^\\mu}\" alt=\"\\boxed{\\ddot{x}^\\nu =-\\Gamma^{\\nu}_{\\kappa\\mu} \\dot{x}^\\kappa \\dot{x}^\\mu}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/48\/483\/4834c3d1288bc90138e5938b60beac24.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/48\/483\/4834c3d1288bc90138e5938b60beac24.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/48\/483\/4834c3d1288bc90138e5938b60beac24.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435:<\/p>\n<pre><code class=\"python\">def geo_second_derivatives(christoffel, derivatives):     '''     Parameters:         christoffel: tensor of rank 3 - analytical expression of christoffel symbol in given coordinates         derivatives: iterable consisting of sympy symbols corresponding to each first derivative of a coordinate variable     '''     d2u = np.zeros(len(derivatives), dtype='object')     for n,k,m in np.ndindex(*np.shape(christoffel)):         d2u[n] -= christoffel[n,k,m] * derivatives[k] * derivatives[m]     return d2u ```<\/code><\/pre>\n<pre><code class=\"python\">d2_t, d2_rho, d2_theta, d2_phi = geo_second_derivatives(christoffel, symbols(\"t' \\\\rho' \\\\theta' \\\\phi'\"))  print(\"\\\\begin{array}{l}\") print(f\"{{{latex(c_t)}}}'' = {latex(d2_t)} \\\\\\\\\") print(f\"{{{latex(c_rho)}}}'' = {latex(d2_rho)} \\\\\\\\\") print(f\"{{{latex(c_theta)}}}'' = {latex(d2_theta)} \\\\\\\\\") print(f\"{{{latex(c_phi)}}}'' = {latex(d2_phi)} \\\\\\\\\") print(\"\\\\end{array}\")<\/code><\/pre>\n<p><img decoding=\"async\" class=\"formula\" source=\"\\begin{array}{l} {\\mathbf{t}}'' = - \\frac{\\rho' r_{s} t'}{\\left(- r_{s} + \\mathbf{\\rho}\\right) \\mathbf{\\rho}} \\\\ {\\mathbf{\\rho}}'' = - \\phi'^{2} \\left(r_{s} - \\mathbf{\\rho}\\right) \\sin^{2}{\\left(\\mathbf{\\theta} \\right)} - \\frac{\\rho'^{2} r_{s}}{2 \\left(r_{s} - \\mathbf{\\rho}\\right) \\mathbf{\\rho}} - \\theta'^{2} \\left(r_{s} - \\mathbf{\\rho}\\right) - \\frac{r_{s} t'^{2} \\left(- r_{s} + \\mathbf{\\rho}\\right)}{2 \\mathbf{\\rho}^{3}} \\\\ {\\mathbf{\\theta}}'' = \\frac{\\phi'^{2} \\sin{\\left(2 \\mathbf{\\theta} \\right)}}{2} - \\frac{2 \\rho' \\theta'}{\\mathbf{\\rho}} \\\\ {\\mathbf{\\phi}}'' = - \\frac{2 \\phi' \\rho'}{\\mathbf{\\rho}} - \\frac{2 \\phi' \\theta'}{\\tan{\\left(\\mathbf{\\theta} \\right)}} \\\\ \\end{array}\" alt=\"\\begin{array}{l} {\\mathbf{t}}'' = - \\frac{\\rho' r_{s} t'}{\\left(- r_{s} + \\mathbf{\\rho}\\right) \\mathbf{\\rho}} \\\\ {\\mathbf{\\rho}}'' = - \\phi'^{2} \\left(r_{s} - \\mathbf{\\rho}\\right) \\sin^{2}{\\left(\\mathbf{\\theta} \\right)} - \\frac{\\rho'^{2} r_{s}}{2 \\left(r_{s} - \\mathbf{\\rho}\\right) \\mathbf{\\rho}} - \\theta'^{2} \\left(r_{s} - \\mathbf{\\rho}\\right) - \\frac{r_{s} t'^{2} \\left(- r_{s} + \\mathbf{\\rho}\\right)}{2 \\mathbf{\\rho}^{3}} \\\\ {\\mathbf{\\theta}}'' = \\frac{\\phi'^{2} \\sin{\\left(2 \\mathbf{\\theta} \\right)}}{2} - \\frac{2 \\rho' \\theta'}{\\mathbf{\\rho}} \\\\ {\\mathbf{\\phi}}'' = - \\frac{2 \\phi' \\rho'}{\\mathbf{\\rho}} - \\frac{2 \\phi' \\theta'}{\\tan{\\left(\\mathbf{\\theta} \\right)}} \\\\ \\end{array}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f96\/365\/c93\/f96365c936607233a1956c66d7a086ac.svg\" width=\"538\" height=\"164\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f96\/365\/c93\/f96365c936607233a1956c66d7a086ac.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f96\/365\/c93\/f96365c936607233a1956c66d7a086ac.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043b\u0438\u043d\u0438\u0439.<\/p>\n<h2>\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e48\/671\/419\/e486714197d43ea46077d2268faeec98.png\" alt=\"\u0420\u0430\u0437\u0434\u0432\u043e\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044e\u0441\u0430 \u0441\u0444\u0435\u0440\u044b\" title=\"\u0420\u0430\u0437\u0434\u0432\u043e\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044e\u0441\u0430 \u0441\u0444\u0435\u0440\u044b\" width=\"793\" height=\"596\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e48\/671\/419\/e486714197d43ea46077d2268faeec98.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e48\/671\/419\/e486714197d43ea46077d2268faeec98.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0420\u0430\u0437\u0434\u0432\u043e\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044e\u0441\u0430 \u0441\u0444\u0435\u0440\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0442\u0430\u043a, \u043b\u0443\u0447\u0438 \u0441\u0432\u0435\u0442\u0430 (\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438 \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u043e\u043b\u0435) \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043f\u043e &#171;\u043f\u0440\u044f\u043c\u044b\u043c&#187; \u043b\u0438\u043d\u0438\u044f\u043c, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043b\u0443\u0447\u0438\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0438 \u043d\u0435\u043f\u0440\u0438\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043f\u0438\u0442\u043e\u043d\u0435, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c <a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/integrate.html\" rel=\"noopener noreferrer nofollow\">scipy.integrate<\/a>.<\/p>\n<p>\u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c <strong>\u0443\u0432\u0438\u0434\u0435\u0442\u044c<\/strong> \u0447\u0435\u0440\u043d\u0443\u044e \u0434\u044b\u0440\u0443? \u0415\u0441\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e \u043b\u0443\u0447\u0438\u043a\u0443 \u0441\u0432\u0435\u0442\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u044d\u043a\u0440\u0430\u043d\u0430, \u0442\u043e \u043e\u043d\u0438 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0447\u0435\u0440\u043d\u043e\u0439 \u0434\u044b\u0440\u044b, \u0438 \u0443\u043f\u0430\u0434\u0443\u0442 \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0435. \u0410 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e \u043c\u044b \u043a\u0430\u043a \u0431\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u043b\u0443\u0447\u0438, \u0438\u0441\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c!<\/p>\n<p>\u041d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 &#8212; \u043d\u0435\u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435. \u0415\u0441\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u0440\u0443\u0442\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 \u043a\u0443\u0447\u0435\u0439 \u044f\u0434\u0435\u0440. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 GPU.<\/p>\n<p>\u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043e\u043a\u043d\u0430 \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043b\u044f GPU &#8212; \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b. \u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c OpenGL, \u0438 \u0435\u0433\u043e \u044f\u0437\u044b\u043a GLSL.<\/p>\n<p>\u041f\u043b\u0430\u043d \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 &#8212; \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u043d\u0443\u044e \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 \u0447\u0435\u0440\u043d\u043e\u0439 \u0434\u044b\u0440\u044b, \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0435 \u043a\u0430\u043c\u0435\u0440\u0443, \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b \u043b\u0443\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0438\u0431\u043e \u0443\u043f\u0430\u0434\u0443\u0442 \u043d\u0430 \u044d\u0442\u0443 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443, \u043e\u043a\u0440\u0430\u0441\u0438\u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0446\u0432\u0435\u0442, \u043b\u0438\u0431\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<h3>\u0423\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432 GLSL&#8230;<\/h3>\n<p>\u041f\u0435\u0440\u0435\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0432 sympy, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u0430\u043b\u043e \u043a\u043e\u043c\u0443 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u043d\u043e \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/docs.sympy.org\/latest\/modules\/codegen.html\" rel=\"noopener noreferrer nofollow\">ccode<\/a>, \u0430 \u0432 \u043b\u044e\u0431\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0435\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0437\u0430\u043c\u0435\u043d\u0430 \u043d\u0430\u0448\u0438\u0445 latex-\u0444\u0440\u0435\u0434\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u0438\u0447\u0435\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0440\u0443\u043a\u0430\u043c\u0438, \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"p'' = f(p, p')\" alt=\"p'' = f(p, p')\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/796\/796b62a9ae41ff4ae9c4a67fa32ec066.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/796\/796b62a9ae41ff4ae9c4a67fa32ec066.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/796\/796b62a9ae41ff4ae9c4a67fa32ec066.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043d\u0430 GLSL \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">vec4 d2p(vec4 p, vec4 dp) {     float t = p[0];     float rho = p[1];     float theta = p[2];     float phi = p[3];      float D_t = dp[0];     float D_rho = dp[1];     float D_theta = dp[2];     float D_phi = dp[3];      \/\/ Geodesics equation:     float D2_t = - (D_rho * rs * D_t) \/ (rho * (rho - rs));     float D2_rho = (rho - rs) * (         + pow(D_phi * sin(theta), 2)         + pow(D_theta, 2)         - (rs * pow(D_t, 2)) \/ (2 * pow(rho, 3))     )     + (rs * pow(D_rho, 2)) \/ (2 * rho * (rho - rs));     float D2_theta = pow(D_phi, 2) * sin(theta) * cos(theta) - (2 * D_rho * D_theta) \/ rho;     float D2_phi = -(2 * D_phi * D_theta) \/ tan(theta) - (2 * D_rho * D_phi) \/ rho;      vec4 d2p = {D2_t, D2_rho, D2_theta, D2_phi};     return d2p; }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u043b\u0443\u0447\u0430 \u0438 4-\u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u0434\u043e\u043b\u044c \u043d\u0435\u0433\u043e. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0432\u0434\u043e\u043b\u044c \u043b\u0443\u0447\u0430.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 &#8212; \u0432\u0438\u0434\u0438\u0442\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"tan(\\theta)\" alt=\"tan(\\theta)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d8\/d85\/d85da21b0edec9cdf166fec615cc1698.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d8\/d85\/d85da21b0edec9cdf166fec615cc1698.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d\/d8\/d85\/d85da21b0edec9cdf166fec615cc1698.svg 781w\" loading=\"lazy\" decode=\"async\"\/>? \u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u0443\u0433\u043e\u043b \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u044e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e. \u0422\u0430\u043a\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u043b <img decoding=\"async\" class=\"formula inline\" source=\"\\theta\" alt=\"\\theta\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/25\/255\/2554a2bb846cffd697389e5dc8912759.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/25\/255\/2554a2bb846cffd697389e5dc8912759.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/25\/255\/2554a2bb846cffd697389e5dc8912759.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043e\u043a\u043e\u043b\u043e\u043d\u0443\u043b\u0435\u0432\u043e\u0439 &#8212; \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u044f\u0434\u0435\u0442. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041c\u044b \u0435\u0435 \u0440\u0435\u0448\u0438\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u0447\u0435\u0440\u043d\u043e\u0439 \u0434\u044b\u0440\u044b \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c, \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041d\u043e <s>\u043c\u043d\u0435 \u043b\u0435\u043d\u044c<\/s> \u044d\u0442\u043e \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0443\u044e \u043b\u044e\u0431\u043e\u0439 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 <code>p<\/code> c 4-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e <code>dp<\/code>. \u042d\u0442\u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f 4-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0443 \u0442\u043e\u0447\u043a\u0443, \u0430 4-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432 \u043a\u0430\u043a\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043c\u044b \u043f\u043e\u043f\u0430\u0434\u0435\u043c. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h3>&#8230; \u0438 \u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u043f\u043e\u0438\u0441\u043a\u0435 \u0445\u0440\u0443\u043f\u043a\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u044f \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Runge%E2%80%93Kutta_methods#Adaptive_Runge%E2%80%93Kutta_methods\" rel=\"noopener noreferrer nofollow\">\u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0420\u0443\u043d\u0433\u0435-\u041a\u0443\u0442\u0442\u044b<\/a> 3-4 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432.<\/p>\n<p>\u0421\u0443\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0420\u0443\u043d\u0433\u0435-\u041a\u0443\u0442\u0442\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 3-\u0433\u043e \u0438 4-\u0433\u043e). \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438, \u0438 \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0433 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0430\u044f &#8212; \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f &#8212; \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c.<\/p>\n<p>\u0412\u0434\u0432\u043e\u0439\u043d\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0442\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041f\u043e\u0434\u0431\u043e\u0440 \u044d\u0442\u0438\u0445 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 &#8212; \u0446\u0435\u043b\u0430\u044f \u043d\u0430\u0443\u043a\u0430 \u0438 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0435 \u043e\u0434\u043d\u0430 \u0441\u043e\u0442\u043d\u044f \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<p>\u042f \u044d\u0442\u0438 \u0441\u043e\u0442\u043d\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u0447\u0438\u0442\u0430\u0442\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u0441\u0442\u0430\u043b. \u041f\u043e \u0440\u0430\u0431\u043e\u0447\u0435-\u043a\u0440\u0435\u0441\u0442\u044c\u044f\u043d\u0441\u043a\u0438 \u044f \u0432\u0437\u044f\u043b \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 RK4 \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0435\u0442\u043e\u0434, \u0438 \u044d\u043c\u043f\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043e\u0433\u043d\u0430\u043b \u043c\u0435\u0442\u043e\u0434 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0447\u0442\u043e\u0431\u044b \u043f\u043e-\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e \u043c\u0435\u0442\u043e\u0434\u0435 RK4<\/summary>\n<div class=\"spoiler__content\">\n<p>RK4 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0443\u044e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%9A%D0%BE%D1%88%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0434\u0430\u0447\u0443 \u041a\u043e\u0448\u0438<\/a> (initial value problem), \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u0440\u0438\u0432\u0443\u044e <img decoding=\"async\" class=\"formula inline\" source=\"y(t)\" alt=\"y(t)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/07\/070\/0707669836d19443cf6c5cc89ca963e6.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/07\/070\/0707669836d19443cf6c5cc89ca963e6.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/07\/070\/0707669836d19443cf6c5cc89ca963e6.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0443\u044e \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e <img decoding=\"async\" class=\"formula inline\" source=\"y'(t) = f(t, y(t))\" alt=\"y'(t) = f(t, y(t))\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/17d\/17dc8fcf9aa2847c3fb0215cf6464e72.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/17d\/17dc8fcf9aa2847c3fb0215cf6464e72.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/17\/17d\/17dc8fcf9aa2847c3fb0215cf6464e72.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 <img decoding=\"async\" class=\"formula inline\" source=\"(t_0, y_0)\" alt=\"(t_0, y_0)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/793\/793302b1d58e9d12d085bcdfb616a967.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/793\/793302b1d58e9d12d085bcdfb616a967.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/79\/793\/793302b1d58e9d12d085bcdfb616a967.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0421\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u042d\u0439\u043b\u0435\u0440\u0430:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"y_{i+1} = y_{i} + f(t_{i}, y_{i}) \\Delta t\" alt=\"y_{i+1} = y_{i} + f(t_{i}, y_{i}) \\Delta t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0e\/0e7\/0e745ec820eb4f6d3948963ff2944547.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0e\/0e7\/0e745ec820eb4f6d3948963ff2944547.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/0e\/0e7\/0e745ec820eb4f6d3948963ff2944547.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0435\u043c \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u0432\u044b\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"y\" alt=\"y\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/41\/415\/415290769594460e2e485922904f345d.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/41\/415\/415290769594460e2e485922904f345d.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4\/41\/415\/415290769594460e2e485922904f345d.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043a\u0440\u0438\u0432\u0430\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0438\u0437\u0433\u0438\u0431\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 &#8212; \u0430 \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u0447\u043a\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"(t_{i}, y_{i})\" alt=\"(t_{i}, y_{i})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9e\/9e9\/9e9579b8617f9262721ef3de87e77416.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9e\/9e9\/9e9579b8617f9262721ef3de87e77416.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9e\/9e9\/9e9579b8617f9262721ef3de87e77416.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u043d\u043e \u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0435. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u0440\u0443\u043a\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"a = f(t_i,y_i)\" alt=\"a = f(t_i,y_i)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e6\/e62\/e62175028dff7bb5f8552ddf67871bc8.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e6\/e62\/e62175028dff7bb5f8552ddf67871bc8.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e6\/e62\/e62175028dff7bb5f8552ddf67871bc8.svg 781w\" loading=\"lazy\" decode=\"async\"\/> &#8212; \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0447\u0442\u043e \u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u042d\u0439\u043b\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"b=f\\left( t_{i} + \\frac{\\Delta t}{2}, y_{i} + a \\frac{\\Delta t}{2} \\right)\" alt=\"b=f\\left( t_{i} + \\frac{\\Delta t}{2}, y_{i} + a \\frac{\\Delta t}{2} \\right)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b5\/b58\/b58835d68fe6b0fc65eda63b19c5bbd1.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b5\/b58\/b58835d68fe6b0fc65eda63b19c5bbd1.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b\/b5\/b58\/b58835d68fe6b0fc65eda63b19c5bbd1.svg 781w\" loading=\"lazy\" decode=\"async\"\/> &#8212; \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0443\u044e \u0432 \u0442\u043e\u0447\u043a\u0435 \u043d\u0430 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043e\u0442\u0440\u0435\u0437\u043a\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u0431\u044b \u043f\u043e \u043c\u0435\u0442\u043e\u0434\u0443 \u042d\u0439\u043b\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"b\" alt=\"b\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/92\/92e\/92eb5ffee6ae2fec3ad71c777531578f.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/92\/92e\/92eb5ffee6ae2fec3ad71c777531578f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/92\/92e\/92eb5ffee6ae2fec3ad71c777531578f.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438: <img decoding=\"async\" class=\"formula inline\" source=\"y_{b} = y_{i} + b \\frac{\\Delta t}{2}\" alt=\"y_{b} = y_{i} + b \\frac{\\Delta t}{2}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1e4\/1e48bfb4f49679d9a0558459981d8083.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1e4\/1e48bfb4f49679d9a0558459981d8083.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1e4\/1e48bfb4f49679d9a0558459981d8083.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<\/li>\n<li>\n<p><img decoding=\"async\" class=\"formula inline\" source=\"c=f\\left( t_{i} + \\frac{\\Delta t}{2}, y_{i} + b \\frac{\\Delta t}{2} \\right)\" alt=\"c=f\\left( t_{i} + \\frac{\\Delta t}{2}, y_{i} + b \\frac{\\Delta t}{2} \\right)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/28\/280\/280482f52cc9df1cce35a5188ed0c6f0.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/28\/280\/280482f52cc9df1cce35a5188ed0c6f0.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2\/28\/280\/280482f52cc9df1cce35a5188ed0c6f0.svg 781w\" loading=\"lazy\" decode=\"async\"\/> &#8212; \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0439 \u0443\u0436\u0435 \u0432 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0443\u0436\u0435 \u0441 \u044d\u0442\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u0448\u0430\u0433 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0443\u044e \u0442\u0430\u043c: <img decoding=\"async\" class=\"formula inline\" source=\"d = f(t_{i} + \\Delta t, y_{i} + c \\Delta t)\" alt=\"d = f(t_{i} + \\Delta t, y_{i} + c \\Delta t)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/75\/759\/759f2992d4dcb0d8c98b205201ecb620.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/75\/759\/759f2992d4dcb0d8c98b205201ecb620.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/75\/759\/759f2992d4dcb0d8c98b205201ecb620.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0431\u0435\u0440\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 <img decoding=\"async\" class=\"formula inline\" source=\"a,b,c,d\" alt=\"a,b,c,d\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6b\/6b2\/6b2c3772e956bd7d191e4e9417c49700.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6b\/6b2\/6b2c3772e956bd7d191e4e9417c49700.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6b\/6b2\/6b2c3772e956bd7d191e4e9417c49700.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0438 \u0443\u0436\u0435 \u0435\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0439 \u0432 \u0442\u043e\u0447\u043a\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"(t_{i}, y_{i})\" alt=\"(t_{i}, y_{i})\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9e\/9e9\/9e9579b8617f9262721ef3de87e77416.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9e\/9e9\/9e9579b8617f9262721ef3de87e77416.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9\/9e\/9e9\/9e9579b8617f9262721ef3de87e77416.svg 781w\" loading=\"lazy\" decode=\"async\"\/>: <img decoding=\"async\" class=\"formula inline\" source=\"y_{i}'(t) = \\frac{1}{6}(a + 2b + 2c + d)\" alt=\"y_{i}'(t) = \\frac{1}{6}(a + 2b + 2c + d)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c7\/3c7419092cb16cc4cb0840e3662c9012.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c7\/3c7419092cb16cc4cb0840e3662c9012.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3\/3c\/3c7\/3c7419092cb16cc4cb0840e3662c9012.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<\/li>\n<\/ol>\n<p>\u0418 \u0443\u0436\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0435 \u043a\u0440\u0438\u0432\u043e\u0439:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"y_{i+1} = y_{i} + \\frac{1}{6}(a + 2b + 2c + d) \\Delta t\" alt=\"y_{i+1} = y_{i} + \\frac{1}{6}(a + 2b + 2c + d) \\Delta t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dd4\/00b\/810\/dd400b810cb687554aa4daf9bf9acb66.svg\" width=\"286\" height=\"43\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dd4\/00b\/810\/dd400b810cb687554aa4daf9bf9acb66.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dd4\/00b\/810\/dd400b810cb687554aa4daf9bf9acb66.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 RK4 \u043c\u0435\u0442\u043e\u0434\u0430 3-\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u0432\u0437\u044f\u043b<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"y_{i+1} = y_{i} + \\frac{1}{6}(a + 2b + 3c) \\Delta t\" alt=\"y_{i+1} = y_{i} + \\frac{1}{6}(a + 2b + 3c) \\Delta t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/808\/76c\/770\/80876c770aa865ddc07498c6abaccf4f.svg\" width=\"251\" height=\"43\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/808\/76c\/770\/80876c770aa865ddc07498c6abaccf4f.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/808\/76c\/770\/80876c770aa865ddc07498c6abaccf4f.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/div>\n<\/details>\n<p>\u041d\u043e \u043f\u043e\u0433\u043e\u0434\u0438\u0442\u0435, \u0432\u0435\u0434\u044c RK4 \u0440\u0435\u0448\u0430\u0435\u0442 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f 1-\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u0430 \u0443 \u043d\u0430\u0441-\u0442\u043e &#8212; \u0432\u0442\u043e\u0440\u043e\u0433\u043e! \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041b\u044e\u0431\u043e\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0430<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"p'' = f(\\tau, p, p')\" alt=\"p'' = f(\\tau, p, p')\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6d\/6d3\/6d33929ee0249a991ca917a5c2f7381d.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6d\/6d3\/6d33929ee0249a991ca917a5c2f7381d.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6\/6d\/6d3\/6d33929ee0249a991ca917a5c2f7381d.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u043c\u043e\u0436\u043d\u043e \u0441\u0432\u0435\u0441\u0442\u0438 \u043a \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f <img decoding=\"async\" class=\"formula inline\" source=\"{} p'\" alt=\"{} p'\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f1\/f18\/f18cae80896e07cabc807315fa2f5cc8.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f1\/f18\/f18cae80896e07cabc807315fa2f5cc8.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f\/f1\/f18\/f18cae80896e07cabc807315fa2f5cc8.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"y =\\begin{bmatrix}p \\\\ p'\\end{bmatrix}\" alt=\"y =\\begin{bmatrix}p \\\\ p'\\end{bmatrix}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/071\/a22\/525\/071a22525998d7c98d140d88fdc3feed.svg\" width=\"79\" height=\"50\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/071\/a22\/525\/071a22525998d7c98d140d88fdc3feed.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/071\/a22\/525\/071a22525998d7c98d140d88fdc3feed.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0442\u043e\u0433\u0434\u0430<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"y' =\\begin{bmatrix}p \\\\ p'\\end{bmatrix}'=\\begin{bmatrix}p' \\\\ p''\\end{bmatrix}=\\begin{bmatrix}p' \\\\ f(\\tau,p,p')\\end{bmatrix}=g(\\tau,y)\" alt=\"y' =\\begin{bmatrix}p \\\\ p'\\end{bmatrix}'=\\begin{bmatrix}p' \\\\ p''\\end{bmatrix}=\\begin{bmatrix}p' \\\\ f(\\tau,p,p')\\end{bmatrix}=g(\\tau,y)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d79\/09d\/53e\/d7909d53e56dd2f350d1350090f521eb.svg\" width=\"375\" height=\"53\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d79\/09d\/53e\/d7909d53e56dd2f350d1350090f521eb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d79\/09d\/53e\/d7909d53e56dd2f350d1350090f521eb.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u042d\u0442\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 &#8212; \u0443\u0436\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u0443\u043c\u0435\u0435\u043c \u0435\u0433\u043e \u0440\u0435\u0448\u0430\u0442\u044c.<\/p>\n<p>\u041e\u0431\u0435\u0440\u043d\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>d2p<\/code> \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">void rk4_diff(vec4 y[2], out vec4 dy[2]) {     dy[0] = y[1];     dy[1] = d2p(y[0], y[1]); }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 8-\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438, \u0442\u0430\u043a \u0438 \u0435\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043e\u0442\u0434\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0443\u044e: \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0443\u044e \u043e\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>d2p<\/code> &#171;\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435&#187;.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e-\u0442\u0430\u043a\u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>rk34_step<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>\/**  * Adaptive Runge-Kutta of orders 3 and 4, tailored for taking 2nd order derivative for a moving 4D point.  *  [in]    epsilon - desired value for error estimate. Step is updated based on that value  *  [in]    max_step - hard limit to how big a step can get  *  [in]    dtau - integration step  *  [inout] p0 - point position  *  [inout] p1 - point velocity  *  [out]   error_estimate - estimated error value (difference between RK3 and RK4 results)  *   * Return value:  *  true - error is not too big, can continue processing  *  false - error is too big, need to rerun with the updated dtau  *\/  bool rk34_step(float epsilon, float max_step, inout float dtau, inout vec4 p0, inout vec4 p1, out float error_estimate) {     vec4 a[2], b[2], c[2], d[2];      vec4 y0[2] = {p0, p1};     rk4_diff(y0, a);      vec4 y1[2] = {p0 + a[0] * dtau\/2, p1 + a[1] * dtau\/2};     rk4_diff(y1, b);      vec4 y2[2] = {p0 + b[0] * dtau\/2, p1 + b[1] * dtau\/2};     rk4_diff(y2, c);      vec4 y3[2] = {p0 + c[0] * dtau, p1 + c[1] * dtau};     rk4_diff(y3, d);      vec4 rk3_0 = (a[0] + 2 * b[0] + 3 * c[0]) * dtau \/ 6;     vec4 rk3_1 = (a[1] + 2 * b[1] + 3 * c[1]) * dtau \/ 6;      vec4 rk4_0 = (a[0] + 2 * b[0] + 2 * c[0] + d[0]) * dtau \/ 6;     vec4 rk4_1 = (a[1] + 2 * b[1] + 2 * c[1] + d[1]) * dtau \/ 6;      vec4 diff0 = rk3_0 - rk4_0;     vec4 diff1 = rk3_1 - rk4_1;     error_estimate = sqrt(abs(dot(diff0, diff0) + dot(diff1, diff1)));      float new_dtau = dtau*sqrt(epsilon\/error_estimate);     if (new_dtau &lt; dtau \/ 2) {         dtau = new_dtau;         return false;     }     dtau = new_dtau;     if (dtau &gt; max_step) {         dtau = max_step;     }     p0 += rk4_0;     p1 += rk4_1;      return true; }<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ce5\/f7e\/9b8\/ce5f7e9b89cb9910402176e504a2bc47.png\" alt=\"\u0427\u0435\u0440\u043d\u0430\u044f \u0434\u044b\u0440\u0430, \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u0432 \u0441\u0444\u0435\u0440\u0443\" title=\"\u0427\u0435\u0440\u043d\u0430\u044f \u0434\u044b\u0440\u0430, \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u0432 \u0441\u0444\u0435\u0440\u0443\" width=\"596\" height=\"584\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ce5\/f7e\/9b8\/ce5f7e9b89cb9910402176e504a2bc47.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ce5\/f7e\/9b8\/ce5f7e9b89cb9910402176e504a2bc47.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0427\u0435\u0440\u043d\u0430\u044f \u0434\u044b\u0440\u0430, \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u0432 \u0441\u0444\u0435\u0440\u0443<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c (\u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442) \u0431\u0440\u0430\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 4-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u0440\u043c\u0438\u0442\u044c \u0438\u0445 \u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440 <code>rk34_step<\/code>. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0448\u0430\u0436\u043e\u043a \u043f\u043e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043b\u0443\u0447\u0438 \u0441\u0432\u0435\u0442\u0430 \u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e! \u041d\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0443\u0434\u0430 \u0436\u0435 \u0438\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c.<\/p>\n<p>\u0410 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u0432\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442: \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0438 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u0430 &#8212; \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439. \u0418 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438.<\/p>\n<h3>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0442\u043e\u0447\u0435\u043a<\/h3>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a \u0438\u0437 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u0443. \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 GLSL:<\/p>\n<pre><code class=\"cpp\">vec4 sh_to_cart(vec4 sh) {     float t = sh[0];     float r = sh[1];     float th = sh[2];     float phi = sh[3];      float x = r*sin(th)*sin(phi);     float y = r*sin(th)*cos(phi);     float z = r*cos(th);      vec4 ret = {x, y, z, t};     return ret; }<\/code><\/pre>\n<p>\u0423 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445, \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 &#8212; \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043a <img decoding=\"async\" class=\"formula inline\" source=\"x,y,z\" alt=\"x,y,z\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/78\/78b\/78b70da0fb6369f45abaccaaef4cabe9.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/78\/78b\/78b70da0fb6369f45abaccaaef4cabe9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/78\/78b\/78b70da0fb6369f45abaccaaef4cabe9.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c GLSL-\u043d\u043e\u0433\u043e 4-\u0432\u0435\u043a\u0442\u043e\u0440\u0430: <code>point.x<\/code>, <code>point.y<\/code>, <code>point.z<\/code>. \u041a <img decoding=\"async\" class=\"formula inline\" source=\"t\" alt=\"t\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e3\/e35\/e358efa489f58062f10dd7316b65649e.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e3\/e35\/e358efa489f58062f10dd7316b65649e.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e\/e3\/e35\/e358efa489f58062f10dd7316b65649e.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>point.w<\/code>.<\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0443\u0434\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0448 \u043b\u0443\u0447, \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435: \u0438\u0437 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 (\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u044d\u043a\u0440\u0430\u043d\u0430) \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f sympy \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434 \u0441\u0438\u043b\u0443. \u0410 \u0432\u043e\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443 \u0435\u0435 \u0440\u0435\u0448\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0438\u0437 \u0447\u0438\u0441\u0442\u043e \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">vec4 cart_to_sh(vec4 pos) {     float r = sqrt(pos.x*pos.x + pos.y*pos.y + pos.z*pos.z);     float th = PI \/ 2. - atan(pos.z\/sqrt(pos.x*pos.x + pos.y*pos.y));     float phi;     if (pos.y == 0) {         phi = sign(pos.x) * PI\/2;     } else if (pos.y &gt;= 0) {         phi = atan(pos.x\/pos.y);     } else {         phi = PI + atan(pos.x\/pos.y);     }     float t = pos.w;      vec4 ret = {t, r, th, phi};     return ret; }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0443\u0433\u043b\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"\\phi\" alt=\"\\phi\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1ed\/1ed346930917426bc46d41e22cc525ec.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1ed\/1ed346930917426bc46d41e22cc525ec.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1\/1e\/1ed\/1ed346930917426bc46d41e22cc525ec.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"x\/y\" alt=\"x\/y\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5c\/5c3\/5c31a2fad817e4698c5e6a27fc0bf191.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5c\/5c3\/5c31a2fad817e4698c5e6a27fc0bf191.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5\/5c\/5c3\/5c31a2fad817e4698c5e6a27fc0bf191.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0437\u043d\u0430\u043a\u0430\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (<code>++<\/code> \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c \u043e\u0442 <code>--<\/code>, \u0430 <code>+-<\/code> \u043e\u0442 <code>-+<\/code>). \u0411\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043f\u0430\u0440\u044b \u0442\u043e\u0447\u0435\u043a \u0441\u043b\u0438\u043b\u0438\u0441\u044c \u0431\u044b \u0432 \u043e\u0434\u043d\u0443. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442 sympy \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<h3>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432<\/h3>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043b\u0438\u043d\u0438\u044f (\u0442.\u0435. \u043d\u0430\u0448 \u043b\u0443\u0447 \u0441\u0432\u0435\u0442\u0430) &#8212; \u044d\u0442\u043e \u043f\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432\u0434\u043e\u043b\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f. \u0410 \u0432 \u043a\u0440\u0438\u0432\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u0435\u043a\u0442\u043e\u0440, \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u0434\u0440\u0443\u0433\u0443\u044e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u042f\u043a\u043e\u0431\u0438<\/a>.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 sympy:<\/p>\n<pre><code class=\"python\">J = coord_sh.jacobian(coord_cart) IJ = simplify(J.inv()) print(f\"J_{{spherical \\\\rightarrow cart}} = {latex(J)}\") print(f\"J_{{cart \\\\rightarrow spherical}} = {latex(IJ)}\") <\/code><\/pre>\n<p><img decoding=\"async\" class=\"formula\" source=\"J_{spherical \\rightarrow cart} = \\left[\\begin{matrix}0 &amp; \\sin{\\left(\\phi \\right)} \\sin{\\left(\\theta \\right)} &amp; \\rho \\sin{\\left(\\phi \\right)} \\cos{\\left(\\theta \\right)} &amp; \\rho \\sin{\\left(\\theta \\right)} \\cos{\\left(\\phi \\right)}\\\\0 &amp; \\sin{\\left(\\theta \\right)} \\cos{\\left(\\phi \\right)} &amp; \\rho \\cos{\\left(\\phi \\right)} \\cos{\\left(\\theta \\right)} &amp; - \\rho \\sin{\\left(\\phi \\right)} \\sin{\\left(\\theta \\right)}\\\\0 &amp; \\cos{\\left(\\theta \\right)} &amp; - \\rho \\sin{\\left(\\theta \\right)} &amp; 0\\\\1 &amp; 0 &amp; 0 &amp; 0\\end{matrix}\\right]\" alt=\"J_{spherical \\rightarrow cart} = \\left[\\begin{matrix}0 &amp; \\sin{\\left(\\phi \\right)} \\sin{\\left(\\theta \\right)} &amp; \\rho \\sin{\\left(\\phi \\right)} \\cos{\\left(\\theta \\right)} &amp; \\rho \\sin{\\left(\\theta \\right)} \\cos{\\left(\\phi \\right)}\\\\0 &amp; \\sin{\\left(\\theta \\right)} \\cos{\\left(\\phi \\right)} &amp; \\rho \\cos{\\left(\\phi \\right)} \\cos{\\left(\\theta \\right)} &amp; - \\rho \\sin{\\left(\\phi \\right)} \\sin{\\left(\\theta \\right)}\\\\0 &amp; \\cos{\\left(\\theta \\right)} &amp; - \\rho \\sin{\\left(\\theta \\right)} &amp; 0\\\\1 &amp; 0 &amp; 0 &amp; 0\\end{matrix}\\right]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb8\/711\/b69\/cb8711b69be6f208d7d5185af6a7bd8c.svg\" width=\"613\" height=\"108\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb8\/711\/b69\/cb8711b69be6f208d7d5185af6a7bd8c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb8\/711\/b69\/cb8711b69be6f208d7d5185af6a7bd8c.svg 781w\" loading=\"lazy\" decode=\"async\"\/><img decoding=\"async\" class=\"formula\" source=\"J_{cart \\rightarrow spherical} = \\left[\\begin{matrix}0 &amp; 0 &amp; 0 &amp; 1\\\\\\sin{\\left(\\phi \\right)} \\sin{\\left(\\theta \\right)} &amp; \\sin{\\left(\\theta \\right)} \\cos{\\left(\\phi \\right)} &amp; \\cos{\\left(\\theta \\right)} &amp; 0\\\\\\frac{\\sin{\\left(\\phi \\right)} \\cos{\\left(\\theta \\right)}}{\\rho} &amp; \\frac{\\cos{\\left(\\phi \\right)} \\cos{\\left(\\theta \\right)}}{\\rho} &amp; - \\frac{\\sin{\\left(\\theta \\right)}}{\\rho} &amp; 0\\\\\\frac{\\cos{\\left(\\phi \\right)}}{\\rho \\sin{\\left(\\theta \\right)}} &amp; - \\frac{\\sin{\\left(\\phi \\right)}}{\\rho \\sin{\\left(\\theta \\right)}} &amp; 0 &amp; 0\\end{matrix}\\right]\" alt=\"J_{cart \\rightarrow spherical} = \\left[\\begin{matrix}0 &amp; 0 &amp; 0 &amp; 1\\\\\\sin{\\left(\\phi \\right)} \\sin{\\left(\\theta \\right)} &amp; \\sin{\\left(\\theta \\right)} \\cos{\\left(\\phi \\right)} &amp; \\cos{\\left(\\theta \\right)} &amp; 0\\\\\\frac{\\sin{\\left(\\phi \\right)} \\cos{\\left(\\theta \\right)}}{\\rho} &amp; \\frac{\\cos{\\left(\\phi \\right)} \\cos{\\left(\\theta \\right)}}{\\rho} &amp; - \\frac{\\sin{\\left(\\theta \\right)}}{\\rho} &amp; 0\\\\\\frac{\\cos{\\left(\\phi \\right)}}{\\rho \\sin{\\left(\\theta \\right)}} &amp; - \\frac{\\sin{\\left(\\phi \\right)}}{\\rho \\sin{\\left(\\theta \\right)}} &amp; 0 &amp; 0\\end{matrix}\\right]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4e6\/724\/bb1\/4e6724bb174b7d5024931c2733d99995.svg\" width=\"517\" height=\"132\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4e6\/724\/bb1\/4e6724bb174b7d5024931c2733d99995.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4e6\/724\/bb1\/4e6724bb174b7d5024931c2733d99995.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0441 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0432 \u044d\u0442\u043e\u0439 \u0442\u043e\u0447\u043a\u0435.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0447\u0435\u043a, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <img decoding=\"async\" class=\"formula inline\" source=\"\\theta = 0\" alt=\"\\theta = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7bc\/7bc661a80c761d3325a18363117f4657.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7bc\/7bc661a80c761d3325a18363117f4657.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7\/7b\/7bc\/7bc661a80c761d3325a18363117f4657.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0412 \u043d\u0438\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u043e\u043b\u044c. \u041d\u043e \u0445\u0443\u0434\u0448\u0435\u0435 \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f &#8212; \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u043b\u043e\u0441\u043a\u0438, \u0431\u044c\u044e\u0449\u0435\u0439 \u0441 \u043f\u043e\u043b\u044e\u0441\u043e\u0432 \u0447\u0435\u0440\u043d\u043e\u0439 \u0434\u044b\u0440\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0435\u0442.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u043d\u0430 GLSL \u044d\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043d\u0443\u0436\u043d\u043e \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0442\u0430\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 column-major \u0444\u043e\u0440\u043c\u0430\u0442\u0435:<\/p>\n<pre><code class=\"cpp\">\/\/ Value of Jacobi matrix at point sh_pos (point is given in Schwartschield coordinates) \/\/ cartesian_vector = J * sh_vector mat4 jacobian_inner_to_cart_at(vec4 sh_pos) {     float rho = sh_pos[1];     float theta = sh_pos[2];     float phi = sh_pos[3];      \/\/ OpenGL stores matrices in column-major format. So this is a TRANSPOSED jacobian matrix     mat4 ret = {         {0, 0, 0, 1},         {sin(phi)*sin(theta),      sin(theta)*cos(phi),      cos(theta),     0},         {rho*sin(phi)*cos(theta),  rho*cos(phi)*cos(theta), -rho*sin(theta), 0},         {rho*sin(theta)*cos(phi), -rho*sin(phi)*sin(theta),  0,              0},     };     return ret; }  \/\/ Value of inverse Jacobi matrix at point sh_pos (point is given in Schwartschield coordinates) \/\/ sh_vector = IJ * cartesian_vector mat4 jacobian_cart_to_inner_at(vec4 sh_pos) {     float rho = sh_pos[1];     float theta = sh_pos[2];     float phi = sh_pos[3];      \/\/ OpenGL stores matrices in column-major format. So this is a TRANSPOSED jacobian matrix     mat4 ret = {         {0, sin(theta)*sin(phi), sin(phi)*cos(theta)\/rho,  cos(phi)\/(rho*sin(theta))},         {0, sin(theta)*cos(phi), cos(phi)*cos(theta)\/rho, -sin(phi)\/(rho*sin(theta))},         {0, cos(theta),         -sin(theta)\/rho,           0},         {1, 0, 0, 0},     };     return ret; }<\/code><\/pre>\n<h2>\u0420\u0438\u0441\u0443\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0441\u043e\u0432\u044b<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b08\/4c5\/087\/b084c5087e8bc93e09ff240dcb0bf164.png\" alt=\"\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u044f\u043c\u043e \u043d\u0430\u0434 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0435 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u0438\u0434\u043d\u043e \u0432\u0441\u044e \u0441\u0444\u0435\u0440\u0443 \u0441\u0440\u0430\u0437\u0443.\" title=\"\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u044f\u043c\u043e \u043d\u0430\u0434 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0435 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u0438\u0434\u043d\u043e \u0432\u0441\u044e \u0441\u0444\u0435\u0440\u0443 \u0441\u0440\u0430\u0437\u0443.\" width=\"596\" height=\"584\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b08\/4c5\/087\/b084c5087e8bc93e09ff240dcb0bf164.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b08\/4c5\/087\/b084c5087e8bc93e09ff240dcb0bf164.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0441\u0444\u0435\u0440\u044b \u043f\u0440\u044f\u043c\u043e \u043d\u0430\u0434 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0435 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u0438\u0434\u043d\u043e \u0432\u0441\u044e \u0441\u0444\u0435\u0440\u0443 \u0441\u0440\u0430\u0437\u0443.<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b &#8212; \u0446\u0432\u0435\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f.<\/p>\n<pre><code class=\"cpp\">layout(location = 0) out vec4 diffuseColor;  #define PI 3.1415926535897932384626433832795  uniform vec2 window_size; uniform vec4 camera_pos; uniform mat3 camera_rotation; uniform float viewport_dist = 1.0;  uniform float rs = 0.25; uniform float shell_radius = 2.0;<\/code><\/pre>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 <a href=\"https:\/\/www.khronos.org\/opengl\/wiki\/Uniform_(GLSL)\" rel=\"noopener noreferrer nofollow\">uniform<\/a> (\u0442.\u0435. \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439) \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043c\u0435\u0440\u044b (\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445, \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b\u0445, \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e \u0442\u043e\u0447\u043a\u0438 \u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0435\u0439)<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0434\u0438\u0443\u0441 \u0428\u0432\u0430\u0440\u0446\u0448\u0438\u043b\u044c\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0434\u0438\u0443\u0441 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0438 \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>gl_FragCoord<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435:<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0443\u0447 \u0441\u0432\u0435\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043d\u0430\u0437\u0430\u0434 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0446\u0438\u043a\u043b\u0435 \u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>rk34_step<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u0441 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u043e\u0439, \u043a\u0440\u0430\u0441\u0438\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432 \u0435\u0451 \u0446\u0432\u0435\u0442. \u0415\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0449\u0435 \u0438 \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 &#8212; \u0432\u044b\u0445\u043e\u0434\u0438\u043c.<\/p>\n<p>\u041f\u043e\u0435\u0445\u0430\u043b\u0438!<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>void main()<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void main() {     \/\/ Position of the current pixel in the (-1, 1) range     vec2 window_center = {window_size.x \/ 2, window_size.y \/ 2};     vec2 pixel_pos = (vec2(gl_FragCoord) - window_center) \/ max(window_center.x, window_center.y);      \/\/ Light ray.     \/\/ Direction from the viewport into the screen pixel:     vec3 direction3 = {viewport_dist, pixel_pos.x, pixel_pos.y};     direction3 = normalize(direction3);     \/\/ Adjusted for the camera pointing direction:     direction3 = camera_rotation * direction3;     vec4 direction4 = {direction3.x, direction3.y, direction3.z, -length(direction3)};      \/\/ Current position and 4-velocity in Schwartschield coordinates:     vec4 pos_s = camera_pos;     vec4 dp = jacobian_cart_to_inner_at(pos_s) * direction4;      \/\/ Initial step     float dtau = 0.01;          vec3 color = {0,0,0};     float prev_pho = pos_s[1];     float max_step = 0.25;     int i;     for (i = 0; i &lt; 2000; i++) {         float r = pos_s[1];          if (abs(r - shell_radius) &lt; 1) {             \/\/ increase precision near the shell             max_step = 0.01 + abs(r - shell_radius)\/20.;         } else {             max_step = 0.5;         }          float error_estimate;         if (rk34_step(0.01, max_step, dtau, pos_s, dp, error_estimate) == false) {             \/\/ Spend this iteration on adjusting the step size.             continue;         }         if ((r &gt; shell_radius * 2) &amp;&amp; (r - prev_pho &gt; 0)) {             \/\/ Optimization for looking from outside.             \/\/ This ray has missed the shell completely and keeps moving away from it.             break;         }          \/\/ Optimization. If we are this close, not going away anyway         if (r &lt; rs*1.01) {             break;         }          bool entering_shell = (prev_pho &gt;= shell_radius) &amp;&amp; (r &lt; shell_radius);         bool exiting_shell = (prev_pho &lt; shell_radius) &amp;&amp; (r &gt;= shell_radius);         if ( entering_shell || exiting_shell) {             float lat = pos_s[2]\/PI*180; \/\/ in degrees             float lon = pos_s[3]\/PI*180; \/\/ in degrees             float line_freq = 15; \/\/ degrees between grid lines              \/\/ Grid lines             float shine = 1.0;             float thicc = 0.5;              float prev_lat_line = floor(lat\/line_freq)*line_freq;             float next_lat_line = prev_lat_line + line_freq;             color.b += shine * exp(-pow((lat - prev_lat_line)\/thicc, 2));             color.b += shine * exp(-pow((lat - next_lat_line)\/thicc, 2));              float prev_lon_line = floor(lon\/line_freq)*line_freq;             float next_lon_line = prev_lon_line + line_freq;             color.b += shine * exp(-pow((lon - prev_lon_line)\/thicc, 2));             color.b += shine * exp(-pow((lon - next_lon_line)\/thicc, 2));              color.g = color.b\/2;              if (exiting_shell)                 break;         }         prev_pho = r;     }      diffuseColor = vec4(color, 1.0); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fb2\/a65\/daa\/fb2a65daa08b173c494a04c470393061.png\" width=\"596\" height=\"584\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/fb2\/a65\/daa\/fb2a65daa08b173c494a04c470393061.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fb2\/a65\/daa\/fb2a65daa08b173c494a04c470393061.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e-\u0442\u0430\u043a\u0438 \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e. \u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0447\u0442\u0438-\u043d\u043e\u043b\u044c \u043e\u043a\u043e\u043b\u043e \u043f\u043e\u043b\u044e\u0441\u043e\u0432 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0440\u0442\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e \u0437\u043b\u043e\u0432\u0435\u0449\u0435\u0435 \u043a\u0440\u0430\u0441\u043d\u043e\u0435 \u0441\u0432\u0435\u0447\u0435\u043d\u0438\u0435: \u043e\u043d\u043e \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439!<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/215\/55a\/900\/21555a9003b418580cb6f287e8477c8b.png\" width=\"596\" height=\"584\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/215\/55a\/900\/21555a9003b418580cb6f287e8477c8b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/215\/55a\/900\/21555a9003b418580cb6f287e8477c8b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0410 \u044d\u0442\u043e &#8212; \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440\u043e\u043c:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bd6\/930\/c2d\/bd6930c2d762c03e51ed6482c63148d9.png\" width=\"596\" height=\"584\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bd6\/930\/c2d\/bd6930c2d762c03e51ed6482c63148d9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bd6\/930\/c2d\/bd6930c2d762c03e51ed6482c63148d9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 (\u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0440\u0430) \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043d\u0430 \u044d\u0442\u0443 \u0441\u0444\u0435\u0440\u0443 \u0437\u0430\u043b\u0438\u0432\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0446\u0432\u0435\u0442\u0430\u043c\u0438 \u0438 \u043f\u043e\u0434\u043a\u0440\u0443\u0442\u0438\u0432 \u0435\u0435 \u0440\u0430\u0434\u0438\u0443\u0441.<\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0435 \u0432 \u043f\u0430\u0440\u0443 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0440\u0430\u0437. \u041d\u043e \u044d\u0442\u043e \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/903016\/\"> https:\/\/habr.com\/ru\/articles\/903016\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0430\u043c\u043e\u043c\u0443, \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e \u0438 \u0431\u0435\u0437 \u0441\u043c\u0441, \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u043d\u0443\u044e \u0434\u044b\u0440\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 OpenGL, \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u041e\u0422\u041e.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0435\u0439 \u0441\u0432\u0435\u0442\u0430, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0442\u043e\u0440 \u0420\u0443\u043d\u0433\u0435-\u041a\u0443\u0442\u0442\u044b \u043d\u0430 <a href=\"https:\/\/www.khronos.org\/opengl\/wiki\/OpenGL_Shading_Language\" rel=\"noopener noreferrer nofollow\">GLSL<\/a>, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0432 \u043e\u0434\u043d\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043c <a href=\"https:\/\/www.khronos.org\/opengl\/wiki\/Fragment_Shader\" rel=\"noopener noreferrer nofollow\">\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0448\u0435\u0439\u0434\u0435\u0440<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043f\u0443\u0442\u044c \u043b\u0443\u0447\u0435\u0439, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430\u0437\u0430\u0434 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h2>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430: \u043c\u0435\u0442\u0440\u0438\u043a\u0430, \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u0438 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435<\/h2>\n<figure class=\"full-width\">\n<div><figcaption>\u0413\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043b\u0438\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0441\u0432\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u0432\u0434\u043e\u043b\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e &#171;\u043f\u0440\u044f\u043c\u0430\u044f&#187; &#8212; \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435. \u0422\u0430\u043a, \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439 \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438 \u0441\u0430\u043c\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0435 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0440\u0430), \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 &#171;\u043f\u0440\u044f\u043c\u0430\u044f&#187; \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c, \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>&#171;\u041f\u0440\u044f\u043c\u0430\u044f&#187; \u043d\u0430 \u0442\u043e\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u043a\u0443\u044e \u043a\u0440\u0438\u0432\u0443\u044e &#171;\u043f\u0440\u044f\u043c\u043e\u0439&#187;? \u0421\u0430\u043c\u043e\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 &#8212; \u0432\u0437\u044f\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0435\u0451 \u0442\u043e\u0447\u043a\u0435, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439, \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432\u0434\u043e\u043b\u044c \u044d\u0442\u043e\u0439 \u043a\u0440\u0438\u0432\u043e\u0439. \u0415\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0442\u0430\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043e \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 &#8212; \u0442\u043e \u043a\u0440\u0438\u0432\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439<\/em>, \u0438 \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0431\u043b\u0438\u0437\u043a\u043e\u0435 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043a \u043f\u043e\u043d\u044f\u0442\u0438\u044e \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438.<\/p>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0434\u043b\u044f \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438  &#8212; \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0443\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0443. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b <a href=\"https:\/\/docs.sympy.org\/latest\/index.html\" rel=\"noopener noreferrer nofollow\">sympy<\/a>.<\/p>\n<pre><code class=\"python\">from sympy import * from sympy.diffgeom import * import numpy as np <\/code><\/pre>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/docs.sympy.org\/latest\/modules\/diffgeom.html\" rel=\"noopener noreferrer nofollow\">sympy.diffgeom<\/a> \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u0435\u043d \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438, \u044f \u0431\u044b \u0434\u0430\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, \u0443\u0440\u043e\u0434\u043b\u0438\u0432, \u043d\u043e \u043e\u043d \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432\u0441\u044f\u043a\u0438\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f\u0445, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Atlas_(topology)\" rel=\"noopener noreferrer nofollow\">\u0430\u0442\u043b\u0430\u0441\u043e\u043c<\/a>. \u041d\u0430\u0448 \u0430\u0442\u043b\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443, \u043d\u043e \u0441 \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 &#8212; \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0442.\u043a. \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043d\u0435\u0439 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u0428\u0432\u0430\u0440\u0446\u0448\u0438\u043b\u044c\u0434\u0430), \u0438 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u043e\u0439 &#8212; \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>\u041e\u0431\u044a\u044f\u0432\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043b\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442:<\/p>\n<pre><code class=\"python\">t_, x_, y_, z_ = symbols(\"t x y z\") rho_, theta_, phi_ = symbols(\"\\\\rho \\\\theta \\\\phi\") <\/code><\/pre>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441 <code>_<\/code> \u0434\u043b\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0431\u044b\u043b\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>\u0421\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b:<\/p>\n<pre><code class=\"python\">x = rho_ * sin(theta_) * sin(phi_) y = rho_ * sin(theta_) * cos(phi_) z = rho_ * cos(theta_) print(latex(x_) + \" = \" + latex(x)) print(latex(y_) + \" = \" + latex(y)) print(latex(z_) + \" = \" + latex(z)) <\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c 4\u0445-\u043c\u0435\u0440\u043d\u043e\u0435 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 <code>spacetime<\/code>, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0435\u0433\u043e \u0430\u0442\u043b\u0430\u0441 \u043a\u0430\u0440\u0442\u0443 <code>patch<\/code>, \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u043d\u0430 \u043d\u0435\u0439 \u0434\u0432\u0435 \u043d\u0430\u0448\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u0443:<\/p>\n<pre><code class=\"cpp\">spacetime = Manifold(\"spacetime\", 4) patch = Patch(\"patch\", spacetime)  relation_dict = {     (\"spherical\", \"cart\"): [(x_, y_, z_, t_), (x, y, z, t_)] }  coord_sh = CoordSystem(\"spherical\", patch, (t_, rho_, theta_, phi_), relation_dict) coord_cart = CoordSystem(\"cart\", patch, (x_, y_, z_, t_), relation_dict)<\/code><\/pre>\n<p>\u041e\u0434\u043d\u043e \u0438\u0437 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432 sympy.diffgeom \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435\u043c. \u041d\u0443\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043e\u0442\u0442\u0443\u0434\u0430 \u043d\u043e\u0432\u044b\u0435:<\/p>\n<pre><code class=\"python\">c_t, c_rho, c_theta, c_phi = coord_sh.base_scalars() print(\",\".join(map(latex, (c_t, c_rho, c_theta, c_phi))))<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u044d\u0442\u043e \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 sympy.giffgeom.<\/p>\n<p>\u0417\u0430\u0434\u0430\u0434\u0438\u043c \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u0428\u0432\u0430\u0440\u0446\u0448\u0438\u043b\u044c\u0434\u0430:<\/p>\n<pre><code class=\"python\">Rs = symbols(\"r_s\")  d_t, d_rho, d_theta, d_phi = coord_sh.base_oneforms()  TP = TensorProduct metric = (     + (1 - Rs\/c_rho) * TP(d_t, d_t)     - 1 \/ (1 - Rs \/ c_rho) * TP(d_rho, d_rho)     - (c_rho**2) * TP(d_theta, d_theta)     - (c_rho**2) * (sin(c_theta)**2) * TP(d_phi, d_phi))  print(latex(metric))<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 &#8212; \u044d\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e <code>simpy.diffgeom<\/code>. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0434\u0430\u0439\u0442\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u043e\u0440\u043c\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0442\u0435\u043d\u0437\u043e\u0440\u0430 , \u043d\u043e \u043d\u0435\u0442. \u0422\u043e\u043b\u044c\u043a\u043e \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b, \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0430\u0440\u0434\u043a\u043e\u0440!<\/p>\n<p>\u041a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0439 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Connection_(mathematics)\" rel=\"noopener noreferrer nofollow\">\u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u0438<\/a> (\u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043a\u0430\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0444\u0435\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u043e\u0434\u0430). \u041c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c &#8212; \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u043a \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0443 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0435\u043d\u0437\u043e\u0440 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\u043d. \u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0433\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Covariant_derivative\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f<\/a> \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u044e (\u043d\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0442\u0435\u043d\u0437\u043e\u0440\u0430 \u0432 \u043a\u0440\u0438\u0432\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f).<\/p>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c simpy.diffgeom \u0443\u0441\u043b\u0443\u0436\u043b\u0438\u0432\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0444\u0435\u043b\u044f <code>metric_to_Christoffel_2nd<\/code>:<\/p>\n<pre><code class=\"python\">christoffel = simplify(metric_to_Christoffel_2nd(metric))  print(\"\\\\begin{cases}\") for (i,j,k) in np.ndindex(*np.shape(christoffel)):     if not christoffel[i,j,k].is_zero:         print(f\"\\\\Gamma_{{{i}{j}{k}}} =\" + latex(christoffel[i,j,k]) + \" \\\\\\\\\") print(\"\\\\end{cases}\")<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0432\u044b\u0432\u043e\u0434 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u0438\u043c. \u041e\u043d, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439.<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u043a\u0440\u0438\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438, \u043a\u0430\u043a . \u0422\u043e\u0433\u0434\u0430 \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a \u043d\u0435\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043c\u0435\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b .\u041f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432\u0434\u043e\u043b\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u044e:<\/p>\n<p>\u0420\u0430\u0441\u043a\u0440\u043e\u0435\u043c \u0435\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0444\u0435\u043b\u044f:<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u043c \u043f\u043e\u043c\u0435\u043d\u044fe\u043c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0446\u0435\u043f\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c:<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a<\/p>\n<p>\u0418\u043b\u0438, \u043f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f<\/p>\n<p>\u041d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435:<\/p>\n<pre><code class=\"python\">def geo_second_derivatives(christoffel, derivatives):     '''     Parameters:         christoffel: tensor of rank 3 - analytical expression of christoffel symbol in given coordinates         derivatives: iterable consisting of sympy symbols corresponding to each first derivative of a coordinate variable     '''     d2u = np.zeros(len(derivatives), dtype='object')     for n,k,m in np.ndindex(*np.shape(christoffel)):         d2u[n] -= christoffel[n,k,m] * derivatives[k] * derivatives[m]     return d2u ```<\/code><\/pre>\n<pre><code class=\"python\">d2_t, d2_rho, d2_theta, d2_phi = geo_second_derivatives(christoffel, symbols(\"t' \\\\rho' \\\\theta' \\\\phi'\"))  print(\"\\\\begin{array}{l}\") print(f\"{{{latex(c_t)}}}'' = {latex(d2_t)} \\\\\\\\\") print(f\"{{{latex(c_rho)}}}'' = {latex(d2_rho)} \\\\\\\\\") print(f\"{{{latex(c_theta)}}}'' = {latex(d2_theta)} \\\\\\\\\") print(f\"{{{latex(c_phi)}}}'' = {latex(d2_phi)} \\\\\\\\\") print(\"\\\\end{array}\")<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043b\u0438\u043d\u0438\u0439.<\/p>\n<h2>\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043b\u0443\u0447\u0435\u0439<\/h2>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0430\u0437\u0434\u0432\u043e\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044e\u0441\u0430 \u0441\u0444\u0435\u0440\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0442\u0430\u043a, \u043b\u0443\u0447\u0438 \u0441\u0432\u0435\u0442\u0430 (\u0430 \u0442\u0430\u043a\u0436\u0435 \u0438 \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u0433\u0440\u0430\u0432\u0438\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u043e\u043b\u0435) \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043f\u043e &#171;\u043f\u0440\u044f\u043c\u044b\u043c&#187; \u043b\u0438\u043d\u0438\u044f\u043c, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043b\u0443\u0447\u0438\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0438 \u043d\u0435\u043f\u0440\u0438\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043f\u0438\u0442\u043e\u043d\u0435, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c <a href=\"https:\/\/docs.scipy.org\/doc\/scipy\/reference\/integrate.html\" rel=\"noopener noreferrer nofollow\">scipy.integrate<\/a>.<\/p>\n<p>\u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c <strong>\u0443\u0432\u0438\u0434\u0435\u0442\u044c<\/strong> \u0447\u0435\u0440\u043d\u0443\u044e \u0434\u044b\u0440\u0443? \u0415\u0441\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e \u043b\u0443\u0447\u0438\u043a\u0443 \u0441\u0432\u0435\u0442\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u044d\u043a\u0440\u0430\u043d\u0430, \u0442\u043e \u043e\u043d\u0438 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u0447\u0435\u0440\u043d\u043e\u0439 \u0434\u044b\u0440\u044b, \u0438 \u0443\u043f\u0430\u0434\u0443\u0442 \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0435. \u0410 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u044b \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e \u043c\u044b \u043a\u0430\u043a \u0431\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u043b\u0443\u0447\u0438, \u0438\u0441\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c!<\/p>\n<p>\u041d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043b\u0443\u0447\u0435\u0439 &#8212; \u043d\u0435\u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435. \u0415\u0441\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u0440\u0443\u0442\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 \u043a\u0443\u0447\u0435\u0439 \u044f\u0434\u0435\u0440. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 GPU.<\/p>\n<p>\u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043e\u043a\u043d\u0430 \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043b\u044f GPU &#8212; \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b. \u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c OpenGL, \u0438 \u0435\u0433\u043e \u044f\u0437\u044b\u043a GLSL.<\/p>\n<p>\u041f\u043b\u0430\u043d \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 &#8212; \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0446\u0432\u0435\u0442\u043d\u0443\u044e \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 \u0447\u0435\u0440\u043d\u043e\u0439 \u0434\u044b\u0440\u044b, \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0435 \u043a\u0430\u043c\u0435\u0440\u0443, \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u0437 \u043a\u0430\u043c\u0435\u0440\u044b \u043b\u0443\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0438\u0431\u043e \u0443\u043f\u0430\u0434\u0443\u0442 \u043d\u0430 \u044d\u0442\u0443 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0443, \u043e\u043a\u0440\u0430\u0441\u0438\u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0446\u0432\u0435\u0442, \u043b\u0438\u0431\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<h3>\u0423\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0432 GLSL&#8230;<\/h3>\n<p>\u041f\u0435\u0440\u0435\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0432 sympy, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u0430\u043b\u043e \u043a\u043e\u043c\u0443 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u043d\u043e \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/docs.sympy.org\/latest\/modules\/codegen.html\" rel=\"noopener noreferrer nofollow\">ccode<\/a>, \u0430 \u0432 \u043b\u044e\u0431\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0435\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0437\u0430\u043c\u0435\u043d\u0430 \u043d\u0430\u0448\u0438\u0445 latex-\u0444\u0440\u0435\u0434\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0440\u0438\u0447\u0435\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0440\u0443\u043a\u0430\u043c\u0438, \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439  \u043d\u0430 GLSL \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">vec4 d2p(vec4 p, vec4 dp) {     float t = p[0];     float rho = p[1];     float theta = p[2];     float phi = p[3];      float D_t = dp[0];     float D_rho = dp[1];     float D_theta = dp[2];     float D_phi = dp[3];      \/\/ Geodesics equation:     float D2_t = - (D_rho * rs * D_t) \/ (rho * (rho - rs));     float D2_rho = (rho - rs) * (         + pow(D_phi * sin(theta), 2)         + pow(D_theta, 2)         - (rs * pow(D_t, 2)) \/ (2 * pow(rho, 3))     )     + (rs * pow(D_rho, 2)) \/ (2 * rho * (rho - rs));     float D2_theta = pow(D_phi, 2) * sin(theta) * cos(theta) - (2 * D_rho * D_theta) \/ rho;     float D2_phi = -(2 * D_phi * D_theta) \/ tan(theta) - (2 * D_rho * D_phi) \/ rho;      vec4 d2p = {D2_t, D2_rho, D2_theta, D2_phi};     return d2p; }<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u043b\u0443\u0447\u0430 \u0438 4-\u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u0434\u043e\u043b\u044c \u043d\u0435\u0433\u043e. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 &#8212; \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0432\u0434\u043e\u043b\u044c \u043b\u0443\u0447\u0430.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 &#8212; \u0432\u0438\u0434\u0438\u0442\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 ? \u041a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u0443\u0433\u043e\u043b \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u044e, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e. \u0422\u0430\u043a\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u043b  \u043e\u043a\u043e\u043b\u043e\u043d\u0443\u043b\u0435\u0432\u043e\u0439 &#8212; \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u044f\u0434\u0435\u0442. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u041c\u044b \u0435\u0435 \u0440\u0435\u0448\u0438\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u0447\u0435\u0440\u043d\u043e\u0439 \u0434\u044b\u0440\u044b \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043b\u0443\u0447\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c, \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041d\u043e <s>\u043c\u043d\u0435 \u043b\u0435\u043d\u044c<\/s> \u044d\u0442\u043e \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0443\u044e \u043b\u044e\u0431\u043e\u0439 \u0433\u0435\u043e\u0434\u0435\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 <code>p<\/code> c 4-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e <code>dp<\/code>. \u042d\u0442\u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f 4-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u0443 \u0442\u043e\u0447\u043a\u0443, \u0430 4-\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432 \u043a\u0430\u043a\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043c\u044b \u043f\u043e\u043f\u0430\u0434\u0435\u043c. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h3>&#8230; \u0438 \u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u043f\u043e\u0438\u0441\u043a\u0435 \u0445\u0440\u0443\u043f\u043a\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u044f \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Runge%E2%80%93Kutta_methods#Adaptive_Runge%E2%80%93Kutta_methods\" rel=\"noopener noreferrer nofollow\">\u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0420\u0443\u043d\u0433\u0435-\u041a\u0443\u0442\u0442\u044b<\/a> 3-4 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432.<\/p>\n<p>\u0421\u0443\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0420\u0443\u043d\u0433\u0435-\u041a\u0443\u0442\u0442\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-456883","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/456883","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=456883"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/456883\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=456883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=456883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=456883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}