问题描述
蒙特卡罗模拟思想
采用微元法以直代曲的思想,假设一个个小时间段内,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分钟