模拟水中球体运动的欧拉法¶
模拟物体在流体中的运动是流体动力学、海洋学和工程力学等多个科学和工程领域项目的重要组成部分。 包括流体动力学、海洋学和工程力学。本案例研究探讨了欧拉数值方法在模拟球体在水中运动时的应用。 球体在水中的运动。
通过该方法,我们可以考虑重力、介质和物体密度以及流体阻力的影响。 流体阻力。 为了解决这个问题,我们使用了一阶显式欧拉法。 这是最简单的常微分方程数值积分方法之一。 它允许我们在每一时间步近似地求解常微分方程。 的近似解。该方法的基本思想如下:将函数的当前 函数的当前值通过其导数乘以一个小的时间间隔来近似得到。 时间间隔。
我们的目标是用 Julia 和 MATLAB 语言开发一个程序,模拟身体的运动,并将结果以潜水深度和身体速度随时间变化的图表形式显示出来。 的运动,并将结果以潜水深度和身体速度随时间变化的图表形式显示出来。
我们还将比较这两种语言中相同脚本的运行速度,并分析语法上的差异。
然后,为了进行比较,我们将分别用 MATLAB 和 Julia 的函数描述代码,并 输出测量初始化、循环计算和图形输出所花费时间的结果。 和图形输出的结果。
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
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
让我们来看看这些实现方法之间的主要区别。
- 变量类型
MATLAB:动态类型,不明确声明变量类型。 变量类型不明确声明。
Julia:静态类型,通常需要明确变量类型以提高性能。 MATLAB:静态类型,通常需要指定变量类型以提高性能。
- 数组索引
MATLAB:以 1 和括号 () 开头。
Julia:以 1 开头,但在方括号 [] 中。
3.打印数值
MATLAB:使用函数 disp。
Julia: 使用 println 函数。
4.评论
MATLAB:单行注释以 % 开头。
Julia: 单行注释以 # 开头。
5.图形
MATLAB:变化函数被分解成许多单独的命令。
Julia:对图形的所有更改都以绘图参数的形式表示。
现在让我们比较一下这两种算法的速度和结果。
test_MATLAB()
test_Julia()
从给出的结果来看,Julia 在各步骤的执行速度上明显优于 MATLAB。 的速度明显超过了 MATLAB。下面是每个步骤的简要说明。
- Julia 的初始化速度快了约 120 倍。
2.Julia 中的循环处理时间缩短了约 1300 倍。
- Julia 显示图形的速度快约 21 倍。
# Загружаем изображения
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)))
可以看出,两种语言的图形类型相同。计算的准确性也是如此。
结论¶
语言的语法是一个品味问题,一个纯主观评价的问题。 但速度是可以客观衡量和评价的。事实证明,Julia 在代码执行的所有关键阶段都要快得多。 代码执行的关键阶段--从初始化 到绘图。这些优势可能是 可以归功于更严格的静态类型、 JIT 编译以及对语言的精心优化。 虽然 MATLAB 仍是科学计算的强大工具,但它的速度不如 Julia。 计算的强大工具,但就速度而言,它不如 Julia,尤其是在涉及高级计算时。 尤其是在高级计算任务方面、 性能至关重要。