欧拉在水中球体运动建模的方法
对液体中物体的运动进行建模是各个科学领域项目的重要组成部分
和技术,包括流体力学,海洋学和工程力学。 在本例中,考虑了数值欧拉方法在运动建模中的应用。
水中的球形体。
这种方法可以让你考虑到重力的影响,介质和身体的密度,以及
作为液体的电阻。
使用显式一阶欧拉方法来解决问题。
这是普通数值积分的最简单方法之一
微分方程(ODE),它允许近似ODE的解
在每个时间步。 该方法的基本思想如下:当前
函数的值通过其导数乘以小
时间间隔。
我们的目标是在Julia和MATLAB中开发一个模拟
身体运动并将结果可视化为潜水深度和身体速度随时间变化的图表。
我们还将比较这两种语言中相同脚本的速度,并分析语法差异。
接下来,为了进行比较,我们将在单独的函数中描述MATLAB和Julia代码
在初始化上花费的时间的测量结果的输出,在循环中的计算
和图形的输出。
using MATLAB
using Images
function test_MATLAB()
mat"""
tic
rho_w=1000;%水密度(kg/m3)
rho=800;%体密度(kg/m3)
g=9.81;%重力加速度(m/s^2)
dt=0.01;%时间步长
T=5;%总模拟时间
%步数
N = round(T / dt);
用于存储结果的%数组
z=0;%初始深度(m)
V=0;%初速度(m/s)
时间=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('速度(m/s)');
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 # 水密度(kg/m3)
rho = 800.0 # 体密度(kg/m3)
g = 9.81 # 重力加速度(m/s2)
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 # 起始位置(m)
v = zeros(N) # 速度
v[1] = 0.0 # 初始速度(m/s)
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="速度(m/s)")
fig = plot(A, B, legend=false)
savefig(fig, "jl_plot.png")
println("图表显示时间:" * string(time() - start_time))
end
让我们来看看这些实现之间的主要区别。
- 变量的类型
MATLAB:动态类型,变量类型不
明确声明。
Julia:静态类型,经常需要指定
类型的变量来提高性能。
- 索引数组
MATLAB:从一开始,在括号()中。
Julia:从一个开始,但在方括号[]中。
- 打印值
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,虽然它仍然是科学的强大工具
计算,在速度方面不如朱莉娅,特别是
当涉及到高级计算任务时。,
性能至关重要的地方。
