导弹追踪问题:蒙特卡罗模拟+matlab代码

问题描述

在这里插入图片描述

蒙特卡罗模拟思想

在这里插入图片描述
采用微元法以直代曲的思想,假设一个个小时间段内,B船先走完一段直线距离后,导弹朝着两者连线方向走直线,这样若干条直线便近似拟合导弹轨迹。代码中判断碰撞的依据是A、B之间的距离小于某个阈值,导弹射程即导弹碰撞之前的最大飞行距离。

Matlab参考代码

% 初始化参数
% B船初始位置
B_x = 20;
B_y = 0;

% 导弹初始位置
A_x = 0;
A_y = 0;
v_B = 200;  % B船的速度
v_A = 3 * v_B;  % 导弹的速度
B_range = 50;  % 导弹射程
dt = 0.0000001;  % 时间步长
min_distance=0.001;%认为碰撞最大距离
t=0; % 初始化导弹击中B船的时间
d=0; % 初始化导弹飞行的距离
m=sqrt(2)/2; %定义常量
dd=sqrt((B_x-A_x)^2+(B_y-A_y)^2); %导弹与B船的距离
plot(A_x,A_y,'.k','MarkerSize',1);hold on; %不关闭图形,继续画图
plot(B_x,B_y,'.k','MarkerSize',1);hold on; %不关闭图形,继续画图
grid on; %打开网格线
axis([0 30 0 10]) %设置x轴范围、y轴范围
k=0; %控制画图速度
while(1) %当两者距离足够小时,表示导弹击中B船 
  t=t+dt; %更新导弹飞行时间
  B_x=20+t*v_B*m;B_y=0+t*v_B*m; %更新B船位置
  %更新导弹位置
  tan_alpha=(B_y-A_y)/(B_x-A_x);
  cos_alpha=1/(sqrt(1+tan_alpha^2));
  sin_alpha=tan_alpha/(sqrt(1+tan_alpha^2));
  A_x=A_x+v_A*dt*cos_alpha; A_y=A_y+v_A*dt*sin_alpha;
  %更新导弹飞行距离
  d=d+v_A*dt;
  %计算导弹与B船距离
  dd=sqrt((B_x-A_x)^2+(B_y-A_y)^2);
  
  k=k+1;
  if mod(k,1000)==0 %每刷新1000次时间画一个图
    plot(A_x,A_y,'.k','MarkerSize',1);hold on; %不关闭图形,继续画图
    plot(B_x,B_y,'.k','MarkerSize',1);hold on; %不关闭图形,继续画图
    pause(0.001); %暂停0.001s后再继续下面的操作
  end
  %导弹达到最大射程
  if d>50
      disp('导弹没有击中B船');
      break;
  end 
  %导弹击中B船
  if d<=B_range && dd<min_distance
      disp(['导弹飞行',num2str(d),'个单位后击中B船'])
      disp(['导弹飞行时间为',num2str(t*60),'分钟'])
      break;

  end

end

运行结果

在这里插入图片描述

导弹飞行27.8018个单位后击中B船
导弹飞行时间为2.7802分钟
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值