AnyMath 文档
Notebook

腹板的空气动力学建模

导言

画布在风中的运动是一个迷人的物理现象,结合了空气动力学,波浪理论和计算数学。 这个例子给出了一个固定在一个边缘(仿旗杆)的柔性腹板中波传播的数学模型。

该模型基于谐波分量的叠加:纵向行波,其二次谐波和横向波。 波的振幅在固定边缘平滑地衰减,模拟织物的真实行为。 对于高性能3D可视化,使用GLMakie库,即使在高分辨率网格上也可以实现平滑的动画。

您可以上传任何图像-从国旗到艺术品-并查看它如何在数字风的影响下"栩栩如生",调整波浪的速度,频率和强度参数。

使用的图书馆

我们将附加必要的库。 要创建具有纹理的三维图形动画,我们需要GLMakie库。

In [ ]:
using Images, FileIO, LinearAlgebra, GLMakie

可视化建模功能

该函数接受画布的纹理和几何参数,创建给定分辨率的三维坐标网格。 在每个时间步长,每个顶点的新的垂直位移被计算为在固定边缘具有指数衰减的行进纵向和横向波的叠加。 波场通过振幅、频率和传播速度参数化,这使得可以模拟从完全平静到暴风雨的各种风况。

In [ ]:
function аэродинамическое_моделирование_полотна(текстура, Ширина, Высота, nx, ny, квс, амплитуда, частота, скорость, время, модель)    
    изображение = load(текстура)
    изображение = rot180(изображение)
    изображение = reverse(изображение, dims=2)
    x = range(0, Ширина, length=nx)
    y = range(0, Высота, length=ny)
    X = repeat(reshape(x, 1, :), ny, 1)
    Y = repeat(y, 1, nx)
    шаг_времени = 1/квс
    число_кадров = floor(Int, время / шаг_времени)
    X_данные = X
    Z_данные = Y .- 0.7
    фигура = GLMakie.Figure(size=(800, 600))
    оси = GLMakie.Axis3(фигура[1, 1], aspect=(1, 1, 1), limits=((0, Ширина), (0.5, 1.5), (-2.5, 2.0)))
    оси.xspinesvisible = false
    оси.yspinesvisible = false
    оси.zspinesvisible = false
    GLMakie.hidedecorations!(оси)
    GLMakie.hidexdecorations!(оси, grid=false)
    GLMakie.hideydecorations!(оси, grid=false)
    GLMakie.hidezdecorations!(оси, grid=false)
    Y_данные = ones(size(X))
    полотно = GLMakie.surface!(оси, X_данные, Y_данные, Z_данные, color = изображение, backlight = 0.0, alpha = 0.85, shading = false)
    GLMakie.lines!([0.0, 0.0], [1.0, 1.0], [-2.0, Высота - 0.7], linestyle = :solid, linewidth = 3, color = GLMakie.RGB(0.5, 0.5, 0.5), label = "")
    камера = оси.scene.camera_controls
    GLMakie.update_cam!(оси.scene, камера, GLMakie.Vec3f(30, 0, 0))
    function волна(t)
        текущее_время = t * шаг_времени
        Y_новая = zeros(size(X))
        for j in 1:ny
            for i in 1:nx
                эффект_волны = амплитуда * (
                    sin(2*pi*частота*(X[j,i]/Ширина - скорость*текущее_время)) +
                    0.5*sin(3*pi*частота*(2*X[j,i]/Ширина - скорость*текущее_время + 0.5)) +
                    0.3*sin(pi*частота*(3*Z_данные[j,i]/Высота + скорость*текущее_время)))
                эффект_волны = эффект_волны * min(1, X[j,i]/0.5)
                Y_новая[j,i] = 1.0 + эффект_волны
            end
        end
        return Y_новая
    end
    GLMakie.record(фигура, модель, 1:число_кадров; framerate = квс) do кадр
    Y_новая = волна(кадр)
    полотно[2] = Y_новая
    end
end
Out[0]:
аэродинамическое_моделирование_полотна (generic function with 1 method)

让我们使用不同的纹理和波浪参数创建几个视觉模型。

胜利的旗帜

由于卫国战争胜利81周年即将到来(在本例出版时),我们使用胜利旗帜的图像作为画布的纹理。 让我们定义波浪和其他参数,并创建一个动画模型。

In [ ]:
текстура = "Знамя_Победы.png"
Ширина = 4.0
Высота = 2.5
nx = 960
ny = 480
квс = 20
амплитуда = 0.03
частота = 0.8
скорость = 0.9
время = 16
модель = "Модель_1.gif"

аэродинамическое_моделирование_полотна(текстура, Ширина, Высота, nx, ny, квс, амплитуда, частота, скорость, время, модель)
Модель_1.gif

俄罗斯国旗

我们会稍微增加波浪的振幅和风速。 我们使用俄罗斯联邦国旗的图像作为纹理。

In [ ]:
текстура = "Флаг_России.png"
Ширина = 4.0
Высота = 2.5
nx = 960
ny = 480
квс = 20
амплитуда = 0.04
частота = 0.8
скорость = 1.5
время = 16
модель = "Модель_2.gif"

аэродинамическое_моделирование_полотна(текстура, Ширина, Высота, nx, ny, квс, амплитуда, частота, скорость, время, модель)
Модель_2.gif

工程师标志

我们将降低风速的幅度和速度,并稍微增加波浪的频率。 我们使用AnyMath标志的图像作为纹理。

In [ ]:
текстура = "Engee_flag.png"
Ширина = 4.0
Высота = 2.5
nx = 960
ny = 480
квс = 20
амплитуда = 0.01
частота = 1.5
скорость = 1.1
время = 16
модель = "Модель_3.gif"

аэродинамическое_моделирование_полотна(текстура, Ширина, Высота, nx, ny, квс, амплитуда, частота, скорость, время, модель)
Модель_3.gif

结论

这个例子演示了应用数学和现代计算机图形学的优雅综合. 所提供的工具不仅可用于教育和演示目的,还可用作更复杂模拟的基础:添加湍流,与障碍物相互作用,计算网络张力和破裂。

可能的发展方向:

*交互式实时参数管理

*几个交互画布的建模

*考虑材料的重力和弹性特性

*造型降落伞,帆和其他帆布产品

*导出为增强现实格式

"数字风"不仅仅是一面旗帜的动画。 这是一个探索隐藏在熟悉现象背后的物理过程之美的介绍。