Engee 文档
Notebook

模拟水中球体运动的欧拉法

模拟物体在流体中的运动是流体动力学、海洋学和工程力学等多个科学和工程领域项目的重要组成部分。 包括流体动力学、海洋学和工程力学。本案例研究探讨了欧拉数值方法在模拟球体在水中运动时的应用。 球体在水中的运动。

通过该方法,我们可以考虑重力、介质和物体密度以及流体阻力的影响。 流体阻力。 为了解决这个问题,我们使用了一阶显式欧拉法。 这是最简单的常微分方程数值积分方法之一。 它允许我们在每一时间步近似地求解常微分方程。 的近似解。该方法的基本思想如下:将函数的当前 函数的当前值通过其导数乘以一个小的时间间隔来近似得到。 时间间隔。

我们的目标是用 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:静态类型,通常需要明确变量类型以提高性能。 MATLAB:静态类型,通常需要指定变量类型以提高性能。

  1. 数组索引

MATLAB:以 1 和括号 () 开头。

Julia:以 1 开头,但在方括号 [] 中。

3.打印数值

MATLAB:使用函数 disp

Julia: 使用 println 函数。

4.评论

MATLAB:单行注释以 % 开头。

Julia: 单行注释以 # 开头。

5.图形

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

Julia:对图形的所有更改都以绘图参数的形式表示。

现在让我们比较一下这两种算法的速度和结果。

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

从给出的结果来看,Julia 在各步骤的执行速度上明显优于 MATLAB。 的速度明显超过了 MATLAB。下面是每个步骤的简要说明。

  1. Julia 的初始化速度快了约 120 倍。

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

  1. 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

可以看出,两种语言的图形类型相同。计算的准确性也是如此。

结论

语言的语法是一个品味问题,一个纯主观评价的问题。 但速度是可以客观衡量和评价的。事实证明,Julia 在代码执行的所有关键阶段都要快得多。 代码执行的关键阶段--从初始化 到绘图。这些优势可能是 可以归功于更严格的静态类型、 JIT 编译以及对语言的精心优化。 虽然 MATLAB 仍是科学计算的强大工具,但它的速度不如 Julia。 计算的强大工具,但就速度而言,它不如 Julia,尤其是在涉及高级计算时。 尤其是在高级计算任务方面、 性能至关重要。