欧拉在水中球体运动建模的方法
对液体中物体的运动进行建模是各个科学领域项目的重要组成部分
和技术,包括流体力学,海洋学和工程力学。 在本例中,考虑了数值欧拉方法在运动建模中的应用。
水中的球形体。
这种方法可以让你考虑到重力的影响,介质和身体的密度,以及
作为液体的电阻。
使用显式一阶欧拉方法来解决问题。
这是普通数值积分的最简单方法之一
微分方程(ODE),它允许近似ODE的解
在每个时间步。 该方法的基本思想如下:当前
函数的值通过其导数乘以小
时间间隔。
我们的目标是在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:使用disp函数。
Julia:使用了println函数。
- 评论
MATLAB:单行注释以%开头。
Julia:单行注释以#开头。
- 图表
MATLAB:修改函数被分解成许多单独的命令。
Julia:图表的所有更改都显示为绘图参数。
现在让我们比较运算速度和算法的结果。
test_MATLAB()
test_Julia()
从提出的结果来看,朱莉娅显着
在每个速度方面优于MATLAB
程的阶段。 下面是每个阶段的简要分析。
-
Julia中的初始化大约快120倍。
-
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)))
可以看出,两种语言的图是相同类型的。 这同样适用于计算的准确性。
结论
语言的语法是品味的问题,纯粹是主观评价的问题。
但速度可以客观地测量和评估。 事实证明,朱莉娅的工作速度要快得多。
代码执行的关键阶段是从初始化
到制图。 这些优点可以
可能是由于更严格的静态类型,
JIT编译和语言的精心优化。
MATLAB,虽然它仍然是科学的强大工具
计算,在速度方面不如朱莉娅,特别是
当涉及到高级计算任务时。,
性能至关重要的地方。
