Engee 文档
Notebook

欧拉在水中球体运动建模的方法

对液体中物体的运动进行建模是各个科学领域项目的重要组成部分
和技术,包括流体力学,海洋学和工程力学。 在本例中,考虑了数值欧拉方法在运动建模中的应用。
水中的球形体。

这种方法可以让你考虑到重力的影响,介质和身体的密度,以及
作为液体的电阻。
使用显式一阶欧拉方法来解决问题。
这是普通数值积分的最简单方法之一
微分方程(ODE),它允许近似ODE的解
在每个时间步。 该方法的基本思想如下:当前
函数的值通过其导数乘以小
时间间隔。

我们的目标是在Julia和MATLAB中开发一个模拟
身体运动并将结果可视化为潜水深度和身体速度随时间变化的图表。

我们还将比较这两种语言中相同脚本的速度,并分析语法差异。

接下来,为了进行比较,我们将在单独的函数中描述MATLAB和Julia代码
在初始化上花费的时间的测量结果的输出,在循环中的计算
和图形的输出。

In [ ]:
using MATLAB
using Images

function test_MATLAB()
    mat"""
    tic
        rho_w = 1000;  % Плотность воды (кг/м^3)
        rho = 800;     % Плотность тела (кг/м^3)
        g = 9.81;      % Ускорение свободного падения (м/с^2)
        dt = 0.01;     % Шаг по времени (с)
        T = 5;         % Общее время моделирования (с)
        % Количество шагов
        N = round(T / dt);
        % Массивы для хранения результатов
        z = 0; % Начальная глубина (м)
        v = 0; % Начальная скорость (м/с)
        time = 0; % Время
    T = toc;
    disp("Время инициализации: " + string(T))
    tic
        % Моделирование
        for n = 1:N-1
            time(n+1) = dt * n;
            z(n+1) = z(n) + v(n) * dt;
            v(n+1) = v(n) + g * (rho_w - rho) / rho * dt;
        end
    T = toc;
    disp("Время цикла: " + string(T))
    tic
        % Построение графиков
        figure;
        % Глубина от времени
        subplot(1, 2, 1);
        plot(time, z);
        xlabel('Время (с)');
        ylabel('Глубина (м)');
        grid on;
        % Скорость от времени
        subplot(1, 2, 2);
        plot(time, v);
        xlabel('Время (с)');
        ylabel('Скорость (м/с)');
        grid on;
        saveas(gcf, 'mat_plot.png');
    T = toc;
    disp("Время отображения графиков:" + string(T))
    """
end
Out[0]:
test_MATLAB (generic function with 1 method)
In [ ]:
using TickTock

function test_Julia()
    start_time = time()
        rho_w = 1000.0  # Плотность воды (кг/м³)
        rho = 800.0     # Плотность тела (кг/м³)
        g = 9.81        # Ускорение свободного падения (м/с²)
        dt = 0.01       # Шаг по времени (с)
        T = 5.0         # Общее время моделирования (с)
        N = floor(Int, T / dt) + 1 # Расчёт количества шагов
        t = zeros(N)   # Время
        t[1] = 0.0     # Начальное время
        z = zeros(N)      # Позиция (глубина)
        z[1] = 0.0        # Начальная позиция (м)
        v = zeros(N)      # Скорость
        v[1] = 0.0        # Начальная скорость (м/с)
    println("Время инициализации: " * string(time() - start_time))
    start_time = time()
        # Моделирование движения
        for n in 1:N-1
            t[n+1] = dt * n
            z[n+1] = z[n] + v[n] * dt
            v[n+1] = v[n] + g * (rho_w - rho) / rho * dt
        end
    println("Время цикла: " * string(time() - start_time))
    start_time = time()
        # Глубина от времени
        A = plot(t, z,
            xlabel="Время (с)",
            ylabel="Глубина (м)")

        # Скорость от времени
        B = plot(t, v,
            xlabel="Время (с)",
            ylabel="Скорость (м/с)")

        fig = plot(A, B, legend=false)
        savefig(fig, "jl_plot.png") 
    println("Время отображения графиков:" * string(time() - start_time))
end
Out[0]:
test_Julia (generic function with 1 method)

让我们来看看这些实现之间的主要区别。

  1. 变量的类型

MATLAB:动态类型,变量类型不
明确声明。

Julia:静态类型,经常需要指定
类型的变量来提高性能。

  1. 索引数组

MATLAB:从一个开始,在括号()中。

朱莉娅:它从一个开始,但在方括号[]中。

  1. 打印值

MATLAB:使用disp函数。

Julia:使用了println函数。

  1. 评论

MATLAB:单行注释以%开头。

Julia:单行注释以#开头。

  1. 图表

MATLAB:修改函数被分解成许多单独的命令。

Julia:图表的所有更改都显示为绘图参数。

现在让我们比较运算速度和算法的结果。

In [ ]:
test_MATLAB()
inary
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> Время инициализации: 0.014473
>> >> >> >> >> Время цикла: 0.006767
>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> Время отображения графиков:2.0409
In [ ]:
test_Julia()
Время инициализации: 1.2159347534179688e-5
Время цикла: 5.0067901611328125e-6
Время отображения графиков:0.09651994705200195

从提出的结果来看,朱莉娅显着
在每个速度方面优于MATLAB
程的阶段。 下面是每个阶段的简要分析。

  1. Julia中的初始化大约快120倍。

  2. Julia的循环处理时间约短1300倍。

  3. Julia中图形的显示速度约为21倍。

In [ ]:
# Загружаем изображения
jl_plot = load("$(@__DIR__)/jl_plot.png")
mat_plot = load("$(@__DIR__)/mat_plot.png")

# Объединяем изображения
print("jl_plot, mat_plot")
hcat(jl_plot, imresize(mat_plot, size(jl_plot)))
                                    jl_plot                                                                     mat_plot
Out[0]:
No description has been provided for this image

可以看出,两种语言的图是相同类型的。 这同样适用于计算的准确性。

结论

语言的语法是品味的问题,纯粹是主观评价的问题。
但速度可以客观地测量和评估。 事实证明,朱莉娅的工作速度要快得多。
代码执行的关键阶段是从初始化
到制图。 这些优点可以
可能是由于更严格的静态类型,
JIT编译和语言的精心优化。
MATLAB,虽然它仍然是科学的强大工具
计算,在速度方面不如朱莉娅,特别是
当涉及到高级计算任务时。,
性能至关重要的地方。