最近有小伙伴后台留言,要求出一个莱维飞行轨迹分布图。
小淘寻思,这莱维飞行轨迹分布图网上不是一抓一大把吗,然后就去查了一下。发现还真是有猫腻!
网上很多博主分享的莱维飞行图大概是长这个样子的:
但莱维飞行图真的是这个样子吗?小淘仔细观察了一下这种绘图的代码:大致如下:
clear
clc
% Mantegna方法模拟萊维飞行
x = [0,0];
y = [0,0];
beta = 1.5;
sigma_u = (gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
sigma_v = 1;
for i=1:1000
u = normrnd(0,sigma_u);
v = normrnd(0,sigma_v);
s = u/(abs(v))^(1/beta);
x(:,1) = x(:,2);
x(:,2) = x(:,1)+1*s;
u = normrnd(0,sigma_u);
v = normrnd(0,sigma_v);
s = u/(abs(v))^(1/beta);
y(:,1) = y(:,2);
y(:,2) = y(:,1)+1*s;
plot(x,y);
hold on;
end
xlabel('X');
ylabel('Y');
title('Levy Flight Random Walk');
但是但是!重点来了!上述代码中,并没有真实的模拟出莱维飞行每次随机的飞行方向,而只是模拟出了随机的步长!
实际的莱维飞行中,不仅步长是随机的,其实方向也应该是随机的。
小淘也去查了一下莱维飞行的百度百科,链接放这里了:https://baike.baidu.com/item/%E8%8E%B1%E7%BB%B4%E9%A3%9E%E8%A1%8C/50067105
以下这个图是从百度百科复制过来的:
咱们仔细对比一下这张图与上面的代码绘制的图,可以发现,真正的莱维飞行图,其实在大多数飞行的过程中,方向都是斜着的,并非是平行于X轴或者Y轴的!
因此小淘在这里对这个代码进行一下修改,直接代码怼脸,复制到MATLAB即可使用。
%公众号:淘个代码
clear
close all
clc
% 设置参数
num_steps = 1000; % 游走步数
beta = 3/2; % 莱维指数,控制步长分布的形状
% 初始化位置数组
x = zeros(num_steps, 1);
y = zeros(num_steps, 1);
% 生成莱维分布的步长
step_lengths = levy(beta, num_steps);
% 生成随机[方向]
angles = 2 * pi * rand(num_steps, 1);
% 计算每一步的位置
for i = 2:num_steps
x(i) = x(i-1) + step_lengths(i) * cos(angles(i));
y(i) = y(i-1) + step_lengths(i) * sin(angles(i));
end
% 绘制游走图
figure
for i=1:num_steps-1
plot(x(i:i+1), y(i:i+1));
hold on
end
xlabel('X');
ylabel('Y');
title('Levy Flight Random Walk');
% 莱维分布[函数]
function step = levy(beta, num_steps)
sigma_u = (gamma(1+beta)*sin(pi*beta/2) / (beta*gamma((1+beta)/2)*2^((beta-1)/2)))^(1/beta) ;
sigma_v = 1;
u = normrnd(0,sigma_u,num_steps,1) ;
v = normrnd(0,sigma_v,num_steps,1) ;
step = u./(abs(v).^(1/beta)) ;
end
运行结果如下:
艾?我再运行一次~就是玩~
可以看到,小淘写的这段代码对应的莱维飞行图,在方向上有了更强的随机性,再也不是那种“横平竖直”的莱维飞行了!
声明:
以上莱维飞行轨迹图的绘制,受限于个人学术能力,仅供参考,如有疑义请后台留言交流。
点个“在看”不失联