{"id":391494,"date":"2024-06-29T09:51:19","date_gmt":"2024-06-29T09:51:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=391494"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=391494","title":{"rendered":"<span>\u0412\u0435\u0447\u0435\u0440\u043e\u043f\u044f\u0442\u043d\u0438\u0447\u043d\u043e\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u043a\u0430\u043a \u043f\u043b\u0430\u0432\u0430\u0435\u0442 \u0430\u043a\u0443\u043b\u0430-\u0441\u043e\u0431\u0430\u043a\u0430<\/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<p><a href=\"https:\/\/bioros.net\/ryby\/akula-katran-50-foto-opisanie-mesta-obitaniya-obraz-zhizni-i-pischevye-predpochteniya-primenenie-v-kulinarii-video.html\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u0442\u0440\u0430\u043d<\/a>, \u0438\u043b\u0438 \u043c\u043e\u0440\u0441\u043a\u0430\u044f \u0441\u043e\u0431\u0430\u043a\u0430 (Squalus acanthias) \u2013 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0448\u0438\u0440\u043e\u043a\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u0430\u043a\u0443\u043b\u0430, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0430\u044f\u0441\u044f \u043a \u0440\u043e\u0434\u0443 \u043a\u043e\u043b\u044e\u0447\u0438\u0445 \u0430\u043a\u0443\u043b \u0438 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443 \u041a\u0430\u0442\u0440\u0430\u043d\u043e\u0432\u044b\u0435 \u0430\u043a\u0443\u043b\u044b \u0438\u0437 \u043e\u0442\u0440\u044f\u0434\u0430 \u041a\u0430\u0442\u0440\u0430\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435. \u041e\u0431\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u0434 \u0431\u0430\u0441\u0441\u0435\u0439\u043d\u043e\u0432 \u0432\u0441\u0435\u0445 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043e\u043a\u0435\u0430\u043d\u043e\u0432, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 1460 \u043c\u0435\u0442\u0440\u043e\u0432. \u041d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u0430 \u0442\u0435\u043b\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 160-180 \u0441\u043c.<\/p>\n<p>\u042d\u0442\u0430 \u0440\u044b\u0431\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u0433\u0438\u0434\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/github.com\/weymouth\/WaterLily.jl\" rel=\"noopener noreferrer nofollow\">WaterLily.jl<\/a>.<\/p>\n<hr\/>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043b\u044b\u0432\u0443\u0449\u0435\u0433\u043e \u043a\u0430\u0442\u0440\u0430\u043d\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044f\u0437\u044b\u043a <a href=\"https:\/\/julialang.org\/\" rel=\"noopener noreferrer nofollow\">Julia <\/a>\u0438 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/www.youtube.com\/watch?v=YsPkfZqbNSQ\" rel=\"noopener noreferrer nofollow\">WaterLily.jl<\/a>. \u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u0437 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0430 <a href=\"https:\/\/github.com\/fonsp\/Pluto.jl\" rel=\"noopener noreferrer nofollow\">Pluto<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c <a href=\"https:\/\/julialang.org\/assets\/blog\/2021-08-sharks\/notebook.jl\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<pre><code class=\"julia\">using WaterLily, StaticArrays, PlutoUI, Interpolations, Plots, Images<\/code><\/pre>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0430\u043a\u0443\u043b\u044b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043d\u0430 <a href=\"https:\/\/doi.org\/10.1017\/S0022112060001110\" rel=\"noopener noreferrer nofollow\">\u043d\u043e\u0432\u0430\u0442\u043e\u0440\u0441\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435<\/a> \u041b\u0430\u0439\u0442\u0445\u0438\u043b\u043b\u0430 \u043e \u043f\u043b\u0430\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0440\u043e\u0439\u043d\u044b\u0445 \u0440\u044b\u0431. \u041f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0435\u043d\u043e \u043d\u0430 &#171;\u0445\u0440\u0435\u0431\u0442\u0435&#187; \u0440\u044b\u0431\u044b, \u0438\u0434\u0435\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0444\u043e\u0440\u043c\u0443 \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u0449\u0438\u043d\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0438, \u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043b\u0430\u0442\u0435\u0440\u0430\u043b\u044c\u043d\u0443\u044e (&#171;\u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443&#187;) \u0431\u0435\u0433\u0443\u0449\u0443\u044e \u0432\u043e\u043b\u043d\u0443. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/530\/be5\/342\/530be5342ea617405c91df1b9e6709ba.png\" alt=\"https:\/\/www.nature.com\/articles\/nphys3078\" title=\"https:\/\/www.nature.com\/articles\/nphys3078\" width=\"1051\" height=\"907\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/530\/be5\/342\/530be5342ea617405c91df1b9e6709ba.png\"\/><figcaption>https:\/\/www.nature.com\/articles\/nphys3078<\/figcaption><\/figure>\n<h3>\u0422\u0435\u043b\u043e \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430<\/h3>\n<p>\u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u0442\u0443\u0440 \u0442\u0435\u043b\u0430 (<em>\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u0449\u0438\u043d\u044b<\/em>) \u0437\u0430\u0434\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044e \u0441\u043f\u043b\u0430\u0439\u043d\u0430\u043c\u0438.<\/p>\n<pre><code class=\"julia\">fit = y -> scale(         interpolate(y, BSpline(Quadratic(Line(OnGrid())))),         range(0,1,length=length(y))     )<\/code><\/pre>\n<p>\u0421\u043a\u0430\u0447\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c. \u041f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 <a href=\"https:\/\/www.sharktrust.org\" rel=\"noopener noreferrer nofollow\">Shark Trust<\/a>.<\/p>\n<pre><code class=\"julia\">url2=\"https:\/\/pterosaurheresies.files.wordpress.com\/2020\/01\/squalus-acanthias-invivo588.jpg\" filename2 = download(url2) dogfish = load(filename2)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/022\/f4c\/348\/022f4c3480e26d4d1d6b619739466cf4.jpeg\" width=\"588\" height=\"334\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/022\/f4c\/348\/022f4c3480e26d4d1d6b619739466cf4.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u0449\u0438\u043d\u044b <code>thk<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0448\u0438\u0440\u0438\u043d\u0443 \u0440\u044b\u0431\u0438\u043d\u044b \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445<\/p>\n<pre><code class=\"julia\">plot(dogfish) nose, len = (30,224), 500 width = [0.02, 0.07, 0.06, 0.048, 0.03, 0.019, 0.01] scatter!(     nose[1] .+ len .* range(0, 1, length=length(width)),     nose[2] .- len .* width, color=:blue, legend=false) thk = fit(width) x = 0:0.01:1 plot!(     nose[1] .+ len .* x,     [nose[2] .- len .* thk.(x), nose[2] .+ len .* thk.(x)],     color=:blue)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/238\/1c0\/eb2\/2381c0eb2739160e438eddc0d2790ef2.PNG\" width=\"647\" height=\"365\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0413\u043b\u044f\u0434\u044f \u043d\u0430 <a href=\"https:\/\/youtu.be\/nMa6lD2CQVI?t=200\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u0430\u043a\u0443\u043b-\u0441\u043e\u0431\u0430\u043a<\/a>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442:<\/p>\n<ul>\n<li>\n<p>\u0414\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0442\u0435\u043b\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0443 (\u043e\u043a\u043e\u043b\u043e 20% \u043e\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0445\u0432\u043e\u0441\u0442\u0430). \u042d\u0442\u043e \u0437\u0430\u0434\u0430\u0435\u0442 \u043e\u0433\u0438\u0431\u0430\u044e\u0449\u0443\u044e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u0434\u043b\u044f \u0431\u0435\u0433\u0443\u0449\u0435\u0439 \u0432\u043e\u043b\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"julia\">envelope = [0.2,0.21,0.23,0.4,0.88,1.0] amp = fit(envelope)<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u043b\u0438\u043d\u0430 \u0432\u043e\u043b\u043d\u044b \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u044e\u0449\u0435\u0439 \u043f\u043e \u0445\u0440\u0435\u0431\u0442\u0443 \u0440\u044b\u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u0438\u043d\u044b \u0442\u0435\u043b\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u043a\u043e\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u03bb \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u043e\u0439 \u0431\u0435\u0433\u0443\u0449\u0435\u0439 \u0432\u043e\u043b\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043e\u043d\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043d\u043e\u0447\u043d\u0438\u043a \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"julia\">\u03bb = 1.4 scatter(0:0.2:1, envelope) colors = palette(:cyclic_wrwbw_40_90_c42_n256) for t in 1\/12:1\/12:1     plot!(x, amp.(x) .* sin.(2\u03c0\/\u03bb * x .- 2\u03c0*t),           color=colors[floor(Int,t*256)]) end plot!(ylim=(-1.4,1.4), legend=false)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a8b\/553\/6bc\/a8b5536bc11230ca0a9e06714ec183f1.PNG\" width=\"622\" height=\"400\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>\u0422\u0435\u043b\u043e \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u044b, \u043d\u043e \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0438\u0445 \u043a \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u0438? <code>WaterLily<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/eprints.soton.ac.uk\/369635\/\" rel=\"noopener noreferrer nofollow\">\u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b<\/a> (<a href=\"https:\/\/habr.com\/ru\/post\/210276\/\" rel=\"noopener noreferrer nofollow\"><em>\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0447\u0430\u0439\u043d\u0438\u043a\u043e\u0432<\/em><\/a>) \u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Automatic_differentiation\" rel=\"noopener noreferrer nofollow\">\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a> (<a href=\"https:\/\/habr.com\/ru\/post\/63055\/\" rel=\"noopener noreferrer nofollow\"><em>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0447\u0430\u0439\u043d\u0438\u043a\u043e\u0432)<\/em><\/a> \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u043b\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Signed_distance_function\" rel=\"noopener noreferrer nofollow\">SDF<\/a>).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f SDF \u0434\u043b\u044f &#171;\u043f\u043e\u0437\u0432\u043e\u043d\u043e\u0447\u043d\u0438\u043a\u0430&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0442 0 \u0434\u043e 1 \u043f\u043e <code>\u0445<\/code>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/www.youtube.com\/watch?v=PMltMdi1Wzg\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e<\/a> \u043e\u0442 Inigo Quilez \u043f\u0440\u043e \u0432\u044b\u0432\u043e\u0434 sdf. \u041d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b sdf \u0438 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 &#8230; \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u043b\u0438\u043d\u0438\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438 SDF \u0434\u0430\u044e\u0442 \u043d\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0444\u043e\u0440\u043c\u043e\u0439 \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0418\u0437\u043c\u0435\u043d\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>y<\/code> \u0430 \u043b\u044f <code>y = y-shift<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043b\u043e \u0432\u0431\u043e\u043a. \u0410 \u0432\u044b\u0447\u0438\u0442\u0430\u044f \u0438\u0437 \u0434\u043b\u0438\u043d\u044b \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0442\u043e\u043b\u0449\u0438\u043d\u0443, \u043a\u0430\u043a <code>sdf = sdf-thickness<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443. \u042d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043a\u0443\u043b\u044b.<\/p>\n<pre><code class=\"julia\">shift = 0.5 T = 0.5  function segment_sdf(x, y)     s = clamp(x, 0, 1)          # distance along the segment     y = y - shift               # shift laterally     sdf = \u221asum(abs2, (x-s, y))  # line segment SDF     return sdf - T * thk(s)     # subtract thickness end grid = -1:0.05:2 contourf(grid, grid, segment_sdf, clim=(-1,2), linewidth=0) contour!(grid, grid, segment_sdf, levels=[0], color=:black)  # zero contour<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f8c\/80f\/156\/f8c80f1569549b728d1f9bcd399ab28e.PNG\" width=\"614\" height=\"402\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u0432\u0438\u0434 \u043d\u0430\u0448\u0435\u0439 SDF, \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 WaterLily \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fish<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0438\u0436\u0435:<\/p>\n<ul>\n<li>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>thk<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f sdf \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>amp<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0431\u0435\u0433\u0443\u0449\u0435\u0439 \u0432\u043e\u043b\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u0432 <code>fish<\/code>, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u0430 \u0440\u044b\u0431\u044b <code>L<\/code>, \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c\u0430\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445. \u041e\u043d\u0430 \u0437\u0430\u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430 \u0434\u043b\u044f \u0445\u0432\u043e\u0441\u0442\u0430 <code>A<\/code> \u043a\u0430\u043a \u0434\u043e\u043b\u044f \u0434\u043b\u0438\u043d\u044b, <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%A1%D1%82%D1%80%D1%83%D1%85%D0%B0%D0%BB%D1%8F\" rel=\"noopener noreferrer nofollow\">\u0447\u0438\u0441\u043b\u043e \u0421\u0442\u0440\u0443\u0445\u0430\u043b\u044f<\/a>, \u0437\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f <code>\u03c9<\/code>, \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%A0%D0%B5%D0%B9%D0%BD%D0%BE%D0%BB%D1%8C%D0%B4%D1%81%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0447\u0438\u0441\u043b\u043e \u0420\u0435\u0439\u043d\u043e\u043b\u044c\u0434\u0441\u0430<\/a>, \u0437\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u0432\u044f\u0437\u043a\u043e\u0441\u0442\u044c \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u0438 <code>\u03bd<\/code>.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"julia\">function fish(thk, amp, k=5.3; L=2^6, A=0.1, St=0.3, Re=1e4)     # fraction along fish length     s(x) = clamp(x[1]\/L, 0, 1)      # fish geometry: thickened line SDF     sdf(x,t) = \u221asum(abs2, x - L * SVector(s(x), 0.)) - L * thk(s(x))      # fish motion: travelling wave     U = 1     \u03c9 = 2\u03c0 * St * U\/(2A * L)     function map(x, t)         xc = x .- L # shift origin         return xc - SVector(0., A * L * amp(s(xc)) * sin(k*s(xc)-\u03c9*t))     end      # make the fish simulation     return Simulation((4L+2,2L+2), [U,0.], L;                         \u03bd=U*L\/Re, body=AutoBody(sdf,map)) end  # Create the swimming shark L,A,St = 3*2^5,0.1,0.3 swimmer = fish(thk, amp; L, A, St);  # Save a time span for one swimming cycle period = 2A\/St cycle = range(0, 23\/24*period, length=24)<\/code><\/pre>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0448\u0443 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0432 \u0433\u0440\u0430\u0444\u0438\u043a \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u03bc\u2080, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0432\u043d\u0430 1 \u0432 \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u0438 \u0438 0 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u0435\u043b\u0430.<\/p>\n<pre><code class=\"julia\">@gif for t \u2208 cycle     measure!(swimmer, tswimmer.L\/swimmer.U)     contour(swimmer.flow.\u03bc\u2080[:,:,1]',             aspect_ratio=:equal, legend=false, border=:none) end<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b9\/68d\/333\/0b968d33302bd8deb3b0af6405503acf.gif\" width=\"600\" height=\"400\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b9\/68d\/333\/0b968d33302bd8deb3b0af6405503acf.gif\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u0442\u043e\u043a\u0430!<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>sim_step!(sim, t, remeasure=true)<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <code>t<\/code>, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u044f\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043b\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0448\u0430\u0433\u0435. (<em>\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <\/em><code>remeasure=false<\/code><em>, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0439<\/em>).<\/p>\n<pre><code class=\"julia\"># run the simulation a few cycles (this takes few seconds) sim_step!(swimmer, 10, remeasure=true) sim_time(swimmer)<\/code><\/pre>\n<p>\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u043d\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u0432\u0438\u0445\u0440\u0438 <code>\u03c9=curl(u)<\/code> \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0430\u043a\u0443\u043b\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0445\u0440\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c <code>@inside<\/code>.<\/p>\n<pre><code class=\"julia\"># plot the vorcity \u03c9=curl(u) scaled by the body length L and flow speed U function plot_vorticity(sim)     @inside sim.flow.\u03c3[I] = WaterLily.curl(3, I, sim.flow.u) * sim.L \/ sim.U     contourf(sim.flow.\u03c3',              color=palette(:BuGn), clims=(-10, 10), linewidth=0,              aspect_ratio=:equal, legend=false, border=:none) end  # make a gif over a swimming cycle @gif for t \u2208 sim_time(swimmer) .+ cycle     sim_step!(swimmer, t, remeasure=true)     plot_vorticity(swimmer) end<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1e7\/a9e\/f85\/1e7a9ef85699d89184015ec8be0246ec.gif\" width=\"600\" height=\"400\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1e7\/a9e\/f85\/1e7a9ef85699d89184015ec8be0246ec.gif\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0440\u0430\u0441\u0438\u0432\u043e\u0435&#8230; (<em>\u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, CFD \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 Colorful Fluid Dynamics<\/em>). \u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043a\u043e\u0435-\u0447\u0442\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u043e \u043f\u043e\u0442\u043e\u043a\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043e\u0442 \u0442\u0435\u043b\u0430 \u043d\u0435 \u043e\u0442\u0445\u043e\u0434\u044f\u0442 \u0432\u0438\u0445\u0440\u0438 \u043d\u0438\u0433\u0434\u0435, \u043a\u0440\u043e\u043c\u0435 \u0445\u0432\u043e\u0441\u0442\u0430! \u042d\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u043d\u0435\u0440\u0433\u0438\u044f \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0432\u0438\u0445\u0440\u0435\u0439.<\/p>\n<p>\u041f\u043e\u043a\u043e\u043f\u0430\u0435\u043c\u0441\u044f \u0435\u0449\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>\u222ends<\/code> \u0431\u0435\u0440\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b \u043f\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u043b\u0430. \u0417\u043d\u0430\u044f \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <code>p<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u0441\u0438\u043b\u0443 \u0442\u044f\u0433\u0438 \u0438 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0438\u043b\u0443 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u0443\u044e \u0430\u043a\u0443\u043b\u043e\u0439!<\/p>\n<pre><code class=\"julia\">function get_force(sim, t)     sim_step!(sim, t, remeasure=true)     return WaterLily.\u222ends(sim.flow.p, sim.body, t*sim.L\/sim.U) .\/ (0.5*sim.L*sim.U^2) end forces = [get_force(swimmer, t) for t \u2208 sim_time(swimmer) .+ cycle]  scatter(cycle.\/period, [first.(forces), last.(forces)],         labels=permutedims([\"thrust\", \"side\"]),         xlabel=\"scaled time\",         ylabel=\"scaled force\")<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4e2\/73e\/00d\/4e273e00df2b21ecb73d4ed176534d14.png\" width=\"598\" height=\"398\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4e2\/73e\/00d\/4e273e00df2b21ecb73d4ed176534d14.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043b\u0430\u0442\u0435\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u043b\u0430 (<em>\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443<\/em>) \u0438\u043c\u0435\u0435\u0442 \u0442\u0443 \u0436\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0447\u0442\u043e \u0438 \u0441\u0430\u043c\u043e \u043f\u043b\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0441\u0438\u043b\u0430 \u0442\u044f\u0433\u0438 \u0438\u043c\u0435\u0435\u0442 \u0432\u0434\u0432\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0441 \u043f\u0438\u043a\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0445\u0432\u043e\u0441\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e.<\/p>\n<h3>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438<\/h3>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e, \u0438 \u043e\u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043d\u043d\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0430\u043a\u0443\u043b\u044b \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u041c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043b\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u044b \u043d\u0443\u043b\u044e \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u043c \u0442\u0435\u043b\u0435! \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0430\u043a\u0443\u043b\u044b \u043f\u043b\u044b\u0442\u044c \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u0439, \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e, \u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0446\u0438\u043a\u043b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f?<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0430\u043a\u0443\u043b\u044b \u043a\u0443\u0434\u0430 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0435\u0439. \u0425\u043e\u0442\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0435 \u0441\u043f\u043b\u0430\u0439\u043d\u044b, \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0439\u043c\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0415\u0441\u0442\u044c \u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c GPU \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043b\u0432\u0435\u0440\u0430?<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u043e\u0431\u043e\u0442\u0430 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u043e\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u043e\u0439 \u0430\u043a\u0443\u043b\u044b, \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0438 \u0431\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0444\u043e\u0440\u043c\u0443, \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u0435. \u041c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u0440\u043e\u0431\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439?<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435. \u0421\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f!<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/juliamath.github.io\/Interpolations.jl\/stable\/\" rel=\"noopener noreferrer nofollow\">Interpolations.jl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/juliadiff.org\/\" rel=\"noopener noreferrer nofollow\">JuliaDiff<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/juliaimages.org\/stable\/\" rel=\"noopener noreferrer nofollow\">JuliaImages<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/docs.juliaplots.org\/latest\/\" rel=\"noopener noreferrer nofollow\">Plots.jl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/fonsp\/Pluto.jl\" rel=\"noopener noreferrer nofollow\">Pluto.jl<\/a>\u00a0\u0438 <a href=\"https:\/\/github.com\/fonsp\/PlutoUI.jl\" rel=\"noopener noreferrer nofollow\">PlutoUI.jl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/JuliaArrays\/StaticArrays.jl\" rel=\"noopener noreferrer nofollow\">StaticArrays.jl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/weymouth\/WaterLily.jl\" rel=\"noopener noreferrer nofollow\">WaterLily.jl<\/a><\/p>\n<\/li>\n<\/ol>\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\/576598\/\"> https:\/\/habr.com\/ru\/articles\/576598\/<\/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<p><a href=\"https:\/\/bioros.net\/ryby\/akula-katran-50-foto-opisanie-mesta-obitaniya-obraz-zhizni-i-pischevye-predpochteniya-primenenie-v-kulinarii-video.html\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u0442\u0440\u0430\u043d<\/a>, \u0438\u043b\u0438 \u043c\u043e\u0440\u0441\u043a\u0430\u044f \u0441\u043e\u0431\u0430\u043a\u0430 (Squalus acanthias) \u2013 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0448\u0438\u0440\u043e\u043a\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u0430\u044f \u0430\u043a\u0443\u043b\u0430, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0430\u044f\u0441\u044f \u043a \u0440\u043e\u0434\u0443 \u043a\u043e\u043b\u044e\u0447\u0438\u0445 \u0430\u043a\u0443\u043b \u0438 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0443 \u041a\u0430\u0442\u0440\u0430\u043d\u043e\u0432\u044b\u0435 \u0430\u043a\u0443\u043b\u044b \u0438\u0437 \u043e\u0442\u0440\u044f\u0434\u0430 \u041a\u0430\u0442\u0440\u0430\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435. \u041e\u0431\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u0434 \u0431\u0430\u0441\u0441\u0435\u0439\u043d\u043e\u0432 \u0432\u0441\u0435\u0445 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043e\u043a\u0435\u0430\u043d\u043e\u0432, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 1460 \u043c\u0435\u0442\u0440\u043e\u0432. \u041d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u0430 \u0442\u0435\u043b\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 160-180 \u0441\u043c.<\/p>\n<p>\u042d\u0442\u0430 \u0440\u044b\u0431\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u0433\u0438\u0434\u0440\u043e\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/github.com\/weymouth\/WaterLily.jl\" rel=\"noopener noreferrer nofollow\">WaterLily.jl<\/a>.<\/p>\n<hr\/>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043b\u044b\u0432\u0443\u0449\u0435\u0433\u043e \u043a\u0430\u0442\u0440\u0430\u043d\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044f\u0437\u044b\u043a <a href=\"https:\/\/julialang.org\/\" rel=\"noopener noreferrer nofollow\">Julia <\/a>\u0438 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/www.youtube.com\/watch?v=YsPkfZqbNSQ\" rel=\"noopener noreferrer nofollow\">WaterLily.jl<\/a>. \u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u0437 \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0430 <a href=\"https:\/\/github.com\/fonsp\/Pluto.jl\" rel=\"noopener noreferrer nofollow\">Pluto<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c <a href=\"https:\/\/julialang.org\/assets\/blog\/2021-08-sharks\/notebook.jl\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<pre><code class=\"julia\">using WaterLily, StaticArrays, PlutoUI, Interpolations, Plots, Images<\/code><\/pre>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0430\u043a\u0443\u043b\u044b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043d\u0430 <a href=\"https:\/\/doi.org\/10.1017\/S0022112060001110\" rel=\"noopener noreferrer nofollow\">\u043d\u043e\u0432\u0430\u0442\u043e\u0440\u0441\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435<\/a> \u041b\u0430\u0439\u0442\u0445\u0438\u043b\u043b\u0430 \u043e \u043f\u043b\u0430\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0440\u043e\u0439\u043d\u044b\u0445 \u0440\u044b\u0431. \u041f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0435\u043d\u043e \u043d\u0430 &#171;\u0445\u0440\u0435\u0431\u0442\u0435&#187; \u0440\u044b\u0431\u044b, \u0438\u0434\u0435\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0444\u043e\u0440\u043c\u0443 \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u0449\u0438\u043d\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0438, \u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043b\u0430\u0442\u0435\u0440\u0430\u043b\u044c\u043d\u0443\u044e (&#171;\u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443&#187;) \u0431\u0435\u0433\u0443\u0449\u0443\u044e \u0432\u043e\u043b\u043d\u0443. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435. <\/p>\n<figure class=\"full-width\"><figcaption>https:\/\/www.nature.com\/articles\/nphys3078<\/figcaption><\/figure>\n<h3>\u0422\u0435\u043b\u043e \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430<\/h3>\n<p>\u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u0442\u0443\u0440 \u0442\u0435\u043b\u0430 (<em>\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u0449\u0438\u043d\u044b<\/em>) \u0437\u0430\u0434\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u043e\u0440\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044e \u0441\u043f\u043b\u0430\u0439\u043d\u0430\u043c\u0438.<\/p>\n<pre><code class=\"julia\">fit = y -> scale(         interpolate(y, BSpline(Quadratic(Line(OnGrid())))),         range(0,1,length=length(y))     )<\/code><\/pre>\n<p>\u0421\u043a\u0430\u0447\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c. \u041f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 <a href=\"https:\/\/www.sharktrust.org\" rel=\"noopener noreferrer nofollow\">Shark Trust<\/a>.<\/p>\n<pre><code class=\"julia\">url2=\"https:\/\/pterosaurheresies.files.wordpress.com\/2020\/01\/squalus-acanthias-invivo588.jpg\" filename2 = download(url2) dogfish = load(filename2)<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u0449\u0438\u043d\u044b <code>thk<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0448\u0438\u0440\u0438\u043d\u0443 \u0440\u044b\u0431\u0438\u043d\u044b \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445<\/p>\n<pre><code class=\"julia\">plot(dogfish) nose, len = (30,224), 500 width = [0.02, 0.07, 0.06, 0.048, 0.03, 0.019, 0.01] scatter!(     nose[1] .+ len .* range(0, 1, length=length(width)),     nose[2] .- len .* width, color=:blue, legend=false) thk = fit(width) x = 0:0.01:1 plot!(     nose[1] .+ len .* x,     [nose[2] .- len .* thk.(x), nose[2] .+ len .* thk.(x)],     color=:blue)<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0413\u043b\u044f\u0434\u044f \u043d\u0430 <a href=\"https:\/\/youtu.be\/nMa6lD2CQVI?t=200\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0445 \u0430\u043a\u0443\u043b-\u0441\u043e\u0431\u0430\u043a<\/a>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442:<\/p>\n<ul>\n<li>\n<p>\u0414\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u0442\u0435\u043b\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0443 (\u043e\u043a\u043e\u043b\u043e 20% \u043e\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0445\u0432\u043e\u0441\u0442\u0430). \u042d\u0442\u043e \u0437\u0430\u0434\u0430\u0435\u0442 \u043e\u0433\u0438\u0431\u0430\u044e\u0449\u0443\u044e \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u044b \u0434\u043b\u044f \u0431\u0435\u0433\u0443\u0449\u0435\u0439 \u0432\u043e\u043b\u043d\u044b.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"julia\">envelope = [0.2,0.21,0.23,0.4,0.88,1.0] amp = fit(envelope)<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u043b\u0438\u043d\u0430 \u0432\u043e\u043b\u043d\u044b \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u044e\u0449\u0435\u0439 \u043f\u043e \u0445\u0440\u0435\u0431\u0442\u0443 \u0440\u044b\u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u0438\u043d\u044b \u0442\u0435\u043b\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u043a\u043e\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u03bb \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u043e\u0439 \u0431\u0435\u0433\u0443\u0449\u0435\u0439 \u0432\u043e\u043b\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a\u043e\u0435 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043e\u043d\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043d\u043e\u0447\u043d\u0438\u043a \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"julia\">\u03bb = 1.4 scatter(0:0.2:1, envelope) colors = palette(:cyclic_wrwbw_40_90_c42_n256) for t in 1\/12:1\/12:1     plot!(x, amp.(x) .* sin.(2\u03c0\/\u03bb * x .- 2\u03c0*t),           color=colors[floor(Int,t*256)]) end plot!(ylim=(-1.4,1.4), legend=false)<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>\u0422\u0435\u043b\u043e \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u044b, \u043d\u043e \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0438\u0445 \u043a \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u0438? <code>WaterLily<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/eprints.soton.ac.uk\/369635\/\" rel=\"noopener noreferrer nofollow\">\u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b<\/a> (<a href=\"https:\/\/habr.com\/ru\/post\/210276\/\" rel=\"noopener noreferrer nofollow\"><em>\u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0447\u0430\u0439\u043d\u0438\u043a\u043e\u0432<\/em><\/a>) \u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Automatic_differentiation\" rel=\"noopener noreferrer nofollow\">\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a> (<a href=\"https:\/\/habr.com\/ru\/post\/63055\/\" rel=\"noopener noreferrer nofollow\"><em>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0447\u0430\u0439\u043d\u0438\u043a\u043e\u0432)<\/em><\/a> \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u043b\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Signed_distance_function\" rel=\"noopener noreferrer nofollow\">SDF<\/a>).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f SDF \u0434\u043b\u044f &#171;\u043f\u043e\u0437\u0432\u043e\u043d\u043e\u0447\u043d\u0438\u043a\u0430&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0440\u0435\u0437\u043a\u043e\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u043e\u0442 0 \u0434\u043e 1 \u043f\u043e <code>\u0445<\/code>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/www.youtube.com\/watch?v=PMltMdi1Wzg\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e<\/a> \u043e\u0442 Inigo Quilez \u043f\u0440\u043e \u0432\u044b\u0432\u043e\u0434 sdf. \u041d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b sdf \u0438 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 &#8230; \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u043b\u0438\u043d\u0438\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0438 SDF \u0434\u0430\u044e\u0442 \u043d\u0430\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0444\u043e\u0440\u043c\u043e\u0439 \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0418\u0437\u043c\u0435\u043d\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>y<\/code> \u0430 \u043b\u044f <code>y = y-shift<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u043b\u043e \u0432\u0431\u043e\u043a. \u0410 \u0432\u044b\u0447\u0438\u0442\u0430\u044f \u0438\u0437 \u0434\u043b\u0438\u043d\u044b \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u0442\u043e\u043b\u0449\u0438\u043d\u0443, \u043a\u0430\u043a <code>sdf = sdf-thickness<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0434\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443. \u042d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043a\u0443\u043b\u044b.<\/p>\n<pre><code class=\"julia\">shift = 0.5 T = 0.5  function segment_sdf(x, y)     s = clamp(x, 0, 1)          # distance along the segment     y = y - shift               # shift laterally     sdf = \u221asum(abs2, (x-s, y))  # line segment SDF     return sdf - T * thk(s)     # subtract thickness end grid = -1:0.05:2 contourf(grid, grid, segment_sdf, clim=(-1,2), linewidth=0) contour!(grid, grid, segment_sdf, levels=[0], color=:black)  # zero contour<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u0432\u0438\u0434 \u043d\u0430\u0448\u0435\u0439 SDF, \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 WaterLily \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fish<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0438\u0436\u0435:<\/p>\n<ul>\n<li>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>thk<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f sdf \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>amp<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0431\u0435\u0433\u0443\u0449\u0435\u0439 \u0432\u043e\u043b\u043d\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u0432 <code>fish<\/code>, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u0438\u043d\u0430 \u0440\u044b\u0431\u044b <code>L<\/code>, \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c\u0430\u044f \u0432 \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445. \u041e\u043d\u0430 \u0437\u0430\u0434\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434\u0430 \u0434\u043b\u044f \u0445\u0432\u043e\u0441\u0442\u0430 <code>A<\/code> \u043a\u0430\u043a \u0434\u043e\u043b\u044f \u0434\u043b\u0438\u043d\u044b, <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%A1%D1%82%D1%80%D1%83%D1%85%D0%B0%D0%BB%D1%8F\" rel=\"noopener noreferrer nofollow\">\u0447\u0438\u0441\u043b\u043e \u0421\u0442\u0440\u0443\u0445\u0430\u043b\u044f<\/a>, \u0437\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f <code>\u03c9<\/code>, \u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%A0%D0%B5%D0%B9%D0%BD%D0%BE%D0%BB%D1%8C%D0%B4%D1%81%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0447\u0438\u0441\u043b\u043e \u0420\u0435\u0439\u043d\u043e\u043b\u044c\u0434\u0441\u0430<\/a>, \u0437\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u0432\u044f\u0437\u043a\u043e\u0441\u0442\u044c \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u0438 <code>\u03bd<\/code>.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"julia\">function fish(thk, amp, k=5.3; L=2^6, A=0.1, St=0.3, Re=1e4)     # fraction along fish length     s(x) = clamp(x[1]\/L, 0, 1)      # fish geometry: thickened line SDF     sdf(x,t) = \u221asum(abs2, x - L * SVector(s(x), 0.)) - L * thk(s(x))      # fish motion: travelling wave     U = 1     \u03c9 = 2\u03c0 * St * U\/(2A * L)     function map(x, t)         xc = x .- L # shift origin         return xc - SVector(0., A * L * amp(s(xc)) * sin(k*s(xc)-\u03c9*t))     end      # make the fish simulation     return Simulation((4L+2,2L+2), [U,0.], L;                         \u03bd=U*L\/Re, body=AutoBody(sdf,map)) end  # Create the swimming shark L,A,St = 3*2^5,0.1,0.3 swimmer = fish(thk, amp; L, A, St);  # Save a time span for one swimming cycle period = 2A\/St cycle = range(0, 23\/24*period, length=24)<\/code><\/pre>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0448\u0443 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0432 \u0433\u0440\u0430\u0444\u0438\u043a \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u03bc\u2080, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0432\u043d\u0430 1 \u0432 \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u0438 \u0438 0 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0442\u0435\u043b\u0430.<\/p>\n<pre><code class=\"julia\">@gif for t \u2208 cycle     measure!(swimmer, tswimmer.L\/swimmer.U)     contour(swimmer.flow.\u03bc\u2080[:,:,1]',             aspect_ratio=:equal, legend=false, border=:none) end<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u0442\u043e\u043a\u0430!<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>sim_step!(sim, t, remeasure=true)<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0434\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <code>t<\/code>, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u044f\u044f \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043b\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0448\u0430\u0433\u0435. (<em>\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <\/em><code>remeasure=false<\/code><em>, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0439<\/em>).<\/p>\n<pre><code class=\"julia\"># run the simulation a few cycles (this takes few seconds) sim_step!(swimmer, 10, remeasure=true) sim_time(swimmer)<\/code><\/pre>\n<p>\u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u043d\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u0432\u0438\u0445\u0440\u0438 <code>\u03c9=curl(u)<\/code> \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0430\u043a\u0443\u043b\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0445\u0440\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0442\u043e\u0447\u043a\u0430\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c <code>@inside<\/code>.<\/p>\n<pre><code class=\"julia\"># plot the vorcity \u03c9=curl(u) scaled by the body length L and flow speed U function plot_vorticity(sim)     @inside sim.flow.\u03c3[I] = WaterLily.curl(3, I, sim.flow.u) * sim.L \/ sim.U     contourf(sim.flow.\u03c3',              color=palette(:BuGn), clims=(-10, 10), linewidth=0,              aspect_ratio=:equal, legend=false, border=:none) end  # make a gif over a swimming cycle @gif for t \u2208 sim_time(swimmer) .+ cycle     sim_step!(swimmer, t, remeasure=true)     plot_vorticity(swimmer) end<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0440\u0430\u0441\u0438\u0432\u043e\u0435&#8230; (<em>\u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, CFD \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 Colorful Fluid Dynamics<\/em>). \u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043a\u043e\u0435-\u0447\u0442\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u043e \u043f\u043e\u0442\u043e\u043a\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043e\u0442 \u0442\u0435\u043b\u0430 \u043d\u0435 \u043e\u0442\u0445\u043e\u0434\u044f\u0442 \u0432\u0438\u0445\u0440\u0438 \u043d\u0438\u0433\u0434\u0435, \u043a\u0440\u043e\u043c\u0435 \u0445\u0432\u043e\u0441\u0442\u0430! \u042d\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u043d\u0435\u0440\u0433\u0438\u044f \u0440\u0430\u0441\u0445\u043e\u0434\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0432\u0438\u0445\u0440\u0435\u0439.<\/p>\n<p>\u041f\u043e\u043a\u043e\u043f\u0430\u0435\u043c\u0441\u044f \u0435\u0449\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>\u222ends<\/code> \u0431\u0435\u0440\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u043b \u043f\u043e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u043b\u0430. \u0417\u043d\u0430\u044f \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <code>p<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u0441\u0438\u043b\u0443 \u0442\u044f\u0433\u0438 \u0438 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0438\u043b\u0443 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u0443\u044e \u0430\u043a\u0443\u043b\u043e\u0439!<\/p>\n<pre><code class=\"julia\">function get_force(sim, t)     sim_step!(sim, t, remeasure=true)     return WaterLily.\u222ends(sim.flow.p, sim.body, t*sim.L\/sim.U) .\/ (0.5*sim.L*sim.U^2) end forces = [get_force(swimmer, t) for t \u2208 sim_time(swimmer) .+ cycle]  scatter(cycle.\/period, [first.(forces), last.(forces)],         labels=permutedims([\"thrust\", \"side\"]),         xlabel=\"scaled time\",         ylabel=\"scaled force\")<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043b\u0430\u0442\u0435\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u043b\u0430 (<em>\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0438\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443<\/em>) \u0438\u043c\u0435\u0435\u0442 \u0442\u0443 \u0436\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0447\u0442\u043e \u0438 \u0441\u0430\u043c\u043e \u043f\u043b\u0430\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0441\u0438\u043b\u0430 \u0442\u044f\u0433\u0438 \u0438\u043c\u0435\u0435\u0442 \u0432\u0434\u0432\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0441 \u043f\u0438\u043a\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0445\u0432\u043e\u0441\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e.<\/p>\n<h3>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438<\/h3>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e, \u0438 \u043e\u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043d\u043d\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0430\u043a\u0443\u043b\u044b \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u041c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043b\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u044b \u043d\u0443\u043b\u044e \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u043c \u0442\u0435\u043b\u0435! \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u0438. \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0430\u043a\u0443\u043b\u044b \u043f\u043b\u044b\u0442\u044c \u043f\u043e \u043f\u0440\u044f\u043c\u043e\u0439, \u0435\u0441\u043b\u0438 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e, \u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0446\u0438\u043a\u043b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f?<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0430\u043a\u0443\u043b\u044b \u043a\u0443\u0434\u0430 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0435\u0439. \u0425\u043e\u0442\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0435 \u0441\u043f\u043b\u0430\u0439\u043d\u044b, \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0439\u043c\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0415\u0441\u0442\u044c \u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c GPU \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u043b\u0432\u0435\u0440\u0430?<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u043e\u0431\u043e\u0442\u0430 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u043e\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u043e\u0439 \u0430\u043a\u0443\u043b\u044b, \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0438 \u0431\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0444\u043e\u0440\u043c\u0443, \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u0435. \u041c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u0440\u043e\u0431\u043e\u0442\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439?<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435. \u0421\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f!<\/p>\n<ol>\n<li>\n<p><a href=\"https:\/\/juliamath.github.io\/Interpolations.jl\/stable\/\" rel=\"noopener noreferrer nofollow\">Interpolations.jl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/juliadiff.org\/\" rel=\"noopener noreferrer nofollow\">JuliaDiff<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/juliaimages.org\/stable\/\" rel=\"noopener noreferrer nofollow\">JuliaImages<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/docs.juliaplots.org\/latest\/\" rel=\"noopener noreferrer nofollow\">Plots.jl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/fonsp\/Pluto.jl\" rel=\"noopener noreferrer nofollow\">Pluto.jl<\/a>\u00a0\u0438 <a href=\"https:\/\/github.com\/fonsp\/PlutoUI.jl\" rel=\"noopener noreferrer nofollow\">PlutoUI.jl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/JuliaArrays\/StaticArrays.jl\" rel=\"noopener noreferrer nofollow\">StaticArrays.jl<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/weymouth\/WaterLily.jl\" rel=\"noopener noreferrer nofollow\">WaterLily.jl<\/a><\/p>\n<\/li>\n<\/ol>\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\/576598\/\"> https:\/\/habr.com\/ru\/articles\/576598\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-391494","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/391494","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=391494"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/391494\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=391494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=391494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=391494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}