首页 > 其他分享 >蒙特卡洛模拟(5)————导弹追踪问题

蒙特卡洛模拟(5)————导弹追踪问题

时间:2024-08-06 18:06:51浏览次数:5  
标签:cos 画图 sqrt 导弹 alpha 蒙特卡洛 dt 模拟 追踪

本章会介绍如何用数值模拟的方法解决导弹追踪问题

目录

一、问题提出

二、建立示意图

三、模型建立

1.建立坐标轴

(1)建立B船坐标

以导弹的初始位置为(0,0),那么经过时间t(t>0)时,B船的坐标为

(2)建立导弹坐标

下方是建立了一个速度的微分方程,瞬时速度Vx=dx/dt,Vy=dy/dt。
但是在数值模拟的代码中,并没有体现微分方程,而是在上一个t上加上delta—_d即可

2.设置delta_t,进行模拟

首先将时间T划分为几个间隔,每一个间隔的时间都是delta_t,为了让模拟效果尽量好,我们选取的delta_t越小越好,这里我们不妨取delta_t=0.0000001
之后每经过一次delta_t,船和导弹的坐标将进行更新,当两者的距离足够小时,即可认为他们相撞。当导弹与原点坐标的欧氏距离超过射程时,结束循环,认为不能追上

四、代码求解

1.预备知识

(1)mod(m,n)

mod(m,n)表示求m/n的余数
mod(8,3) ans=2

(2)axis([m n p q])

axis([0 3 0 10]) % 设置横坐标范围为[0, 3] 纵坐标范围为[0, 10]

(3)text(m,n,'xxx')

text(2,4,'清风') % 在坐标为(2,4)的点上标上字符串:清风

2.变量初始化

v=200; % 任意给定B船的速度(后期我们可以再改的)
dt=0.0000001; % 定义时间间隔
x=[0,20]; % 定义导弹和B船的横坐标分别为x(1)和x(2)
y=[0,0]; % 定义导弹和B船的纵坐标分别为y(1)和y(2)
t=0; % 初始化导弹击落B船的时间
d=0; % 初始化导弹飞行的距离
m=sqrt(2)/2;   % 将sqrt(2)/2定义为一个常量,使后面看起来很简洁
dd=pdist2(x,y); % 导弹与B船的欧式距离

3.初始化画图参数

(1)其中,固定坐标轴的操作,在我们初次实验中可以不做,因为我们并不知道最后的坐标会落在哪个范围
但是在初次试验之后,就可以做了,便于我们观察走向
(2)定义k的原因时为了控制画图速度,因为我们定义的时间间隔delta_t非常小,我们不肯能每迭代一次就画一个点,这样的画图速度非常慢。
因此,我们选择迭代500次再画一次图(在后续代码中体现)

for i=1:2
    plot(x(i),y(i),'.k','MarkerSize',1);  % 画出导弹和B船所在的坐标,点的大小为1,颜色为黑色(k),用小点表示
    grid on;  % 打开网格线
    hold on;  % 不关闭图形,继续画图
end
axis([0 30 0 10])  % 固定x轴的范围为0-30  固定y轴的范围为0-10
k = 0;  % 引入一个变量  为了控制画图的速度(因为Matlab中画图的速度超级慢)

4.进入循环,开始模拟

我们分x个部分来分别讨论此循环

(1)进入循环,迭代数值

此步骤就是根据我们前面建立的模型,进行数值的迭代,设置循环跳出条件为(d>0.01)

while(dd>=0.001)  % 只要两者的距离足够大,就一直循环下去。(两者距离足够小时表示导弹击中,这里的临界值要结合dt来取,否则可能导致错过交界处的情况)
    t=t+dt; % 更新导弹击落B船的时间
    d=d+3*v*dt; % 更新导弹飞行的距离
    x(2)=20+t*v*m;  y(2)=t*v*m;   % 计算新的B船的位置 (注:m=sqrt(2)/2)
    dd=sqrt((x(2)-x(1))^2+(y(2)-y(1))^2);  % 更新导弹与B船的距离
    tan_alpha=(y(2)-y(1))/(x(2)-x(1));   % 计算斜率,即tan(α)
    cos_alpha=sqrt(1/(1+tan_alpha^2));   % 利用公式:sec(α)^2 = (1+tan(α)^2)  计算出cos(α)
    sin_alpha=sqrt(1-cos_alpha^2);  % 利用公式: sin(α)^2 +cos(α)^2 = 1  计算出sin(α)
    x(1)=x(1)+3*v*dt*cos_alpha;   y(1)=y(1)+3*v*dt*sin_alpha;   % 计算新的导弹的位置

(2)绘制路径图像

我们之前初始化了k,就是在这里使用,利用余数函数mod,设置每迭代500次画一次图
并且,利用 pause(0.001)可以看到整个迭代的过程,如果不加这串命令,则只能看到最终效果,而不能看到整个过程

k = k +1 ;  
    if mod(k,500) == 0   % 每刷新500次时间就画出下一个导弹和B船所在的坐标  mod(m,n)表示求m/n的余数
        for i=1:2
            plot(x(i),y(i),'.k','MarkerSize',1);
            hold on; % 不关闭图形,继续画图
        end
        pause(0.001);  % 暂停0.001s后再继续下面的操作
    end

(3)设置另一个跳出循环的条件

整个过程有两种情况,要么在射程中追上,要么超过射程追不上。此端命令则是判断是否超过射程

if d>50  % 导弹的有效射程为50个单位
        disp('导弹没有击中B船');
        break;  % 退出循环
    end

(4)输出最终结果

if d<=50 & dd<0.001 % 导弹飞行的距离小于50个单位且导弹和B船的距离小于0.001(表示击中)
disp(['导弹飞行',num2str(d),'个单位后击中B船'])
disp(['导弹飞行的时间为',num2str(t*60),'分钟'])
end
end

(5)完整循环代码

clear;clc
v=200; % 任意给定B船的速度(后期我们可以再改的)
dt=0.0000001; % 定义时间间隔
x=[0,20]; % 定义导弹和B船的横坐标分别为x(1)和x(2)
y=[0,0]; % 定义导弹和B船的纵坐标分别为y(1)和y(2)
t=0; % 初始化导弹击落B船的时间
d=0; % 初始化导弹飞行的距离
m=sqrt(2)/2;   % 将sqrt(2)/2定义为一个常量,使后面看起来很简洁
dd=sqrt((x(2)-x(1))^2+(y(2)-y(1))^2); % 导弹与B船的距离
for i=1:2
    plot(x(i),y(i),'.k','MarkerSize',1);  % 画出导弹和B船所在的坐标,点的大小为1,颜色为黑色(k),用小点表示
    grid on;  % 打开网格线
    hold on;  % 不关闭图形,继续画图
end
axis([0 30 0 10])  % 固定x轴的范围为0-30  固定y轴的范围为0-10
k = 0;  % 引入一个变量  为了控制画图的速度(因为Matlab中画图的速度超级慢)
while(dd>=0.001)  % 只要两者的距离足够大,就一直循环下去。(两者距离足够小时表示导弹击中,这里的临界值要结合dt来取,否则可能导致错过交界处的情况)
    t=t+dt; % 更新导弹击落B船的时间
    d=d+3*v*dt; % 更新导弹飞行的距离
    x(2)=20+t*v*m;  y(2)=t*v*m;   % 计算新的B船的位置 (注:m=sqrt(2)/2)
    dd=sqrt((x(2)-x(1))^2+(y(2)-y(1))^2);  % 更新导弹与B船的距离
    tan_alpha=(y(2)-y(1))/(x(2)-x(1));   % 计算斜率,即tan(α)
    cos_alpha=sqrt(1/(1+tan_alpha^2));   % 利用公式:sec(α)^2 = (1+tan(α)^2)  计算出cos(α)
    sin_alpha=sqrt(1-cos_alpha^2);  % 利用公式: sin(α)^2 +cos(α)^2 = 1  计算出sin(α)
    x(1)=x(1)+3*v*dt*cos_alpha;   y(1)=y(1)+3*v*dt*sin_alpha;   % 计算新的导弹的位置
    k = k +1 ;  
    if mod(k,500) == 0   % 每刷新500次时间就画出下一个导弹和B船所在的坐标  mod(m,n)表示求m/n的余数
        for i=1:2
            plot(x(i),y(i),'.k','MarkerSize',1);
            hold on; % 不关闭图形,继续画图
        end
        pause(0.001);  % 暂停0.001s后再继续下面的操作
    end
    if d>50  % 导弹的有效射程为50个单位
        disp('导弹没有击中B船');
        break;  % 退出循环
    end
    if d<=50 & dd<0.001   % 导弹飞行的距离小于50个单位且导弹和B船的距离小于0.001(表示击中)
        disp(['导弹飞行',num2str(d),'个单位后击中B船'])
        disp(['导弹飞行的时间为',num2str(t*60),'分钟'])
    end
end

标签:cos,画图,sqrt,导弹,alpha,蒙特卡洛,dt,模拟,追踪
From: https://www.cnblogs.com/dlmuwxw/p/18345636

相关文章

  • 2024.7.27模拟赛9
    模拟赛炸裂场,交互+提答T1ラーメンの食べ比べ交互题,没做过。。。\(N\le400\),有\(600\)次询问,其实还挺水的。先考虑二分,两两一组比较,会得到\(200\)个较大的和\(200\)个较小的,还剩\(400\)次查询。既然还剩\(400\)次查询,那也不用考虑二分了,直接\(200\)个暴力比......
  • Profinet远程IO模块:模拟量输入输出模块_参数及选型说明
    模拟量输入、输出模块是XD系列现场常用的IO模块。分为输入和输出两种类型,按照信号类型分为电压型和电流型,16位分辨率,通道分为4通道和8通道!产品型号信息模块指示灯模拟量量程对应数值(以下为4通道型号,8通道同理)XD3004的使用注:默认配置1:0-10V。(1).配置参数1:0-10v,输入1......
  • 暑假集训CSP提高模拟14
    刚放假回来,好困……赛时rank38,T1100,T20,T30,T40打了T1后迷迷糊糊,半睡不睡的。这还能抢一个T1首切?T1BA烙饼问题。答案是\(\max(\max(a_i),\left\lceil\frac{\sum_{i=1}^na_i}{\min(n,m)}\right\rceil)\)还有一个二分答案的做法。但我们好像没有人写……点此查看......
  • 『模拟赛』暑假集训CSP提高模拟14
    Rank题目泰国尼添所以暴力挂一点分也能拿到22/98A.BA签到题。总记得小时候在《冒险岛数学奇遇记》的第28册左右看到过这道题,关键在于你可以分次烙完一张饼。举例2口锅5张饼,54433,最优策略的一种是先将5的那张饼烙3单位时间,然后烙一张4一张3;另一口锅......
  • 基于两颗CH582芯片实现GPIO模拟SPI全双工通讯__从机通过GPIO中断读写数据
    简介:此程序是根据标准SPI协议规范使用模式0编写的一份模拟SPI全双工数据收发例程,经过测试,一个字节收发时长可压缩至最低115us左右,约9091字节每秒=73Kbps的通讯速率,注释中尽可能解释了每一步的含义,后续有想法应该会对其进行优化。注:笔者开发经验较少,在编程上或许复杂了一些。......
  • 暑假集训CSP提高模拟14
    暑假集训CSP提高模拟14组题人:@H_Kaguya|@LYinMX\(T1\)P209.BA\(30pts\)部分分\(30pts\):输出\(\left\lceil\dfrac{\sum\limits_{i=1}^{m}a_{i}}{n}\right\rceil\)。数形结合,将\(\{a\}\)抽象成矩形,烙饼抽象成海报覆盖,最终有\(\max(\max\limits_{i=1}^{m}......
  • 模拟实现 memcpy --浅谈C语言
    内存拷贝-memcpy描述C库函数void*memcpy(void*str1,constvoid*str2,size_tn)从存储区str2复制n个字节到存储区str1。memcpy是最快的内存到内存复制子程序。它通常比必须扫描其所复制数据的strcpy,或必须预防以处理重叠输入的memmove更高效。memcpy,memcpy......
  • 8.5 模拟赛
    总结输在语文上了。t1签到题。t2神秘dp,问题主要在处理二次函数的限制上,考虑直接拆开或者差分后面的思路就容易了。t3语文题,要将集合的关系转移到图上,部分分给了非常多的正解启示。t4dp,卡特兰数,格路计数。题解road二分答案,转化为最少添加几个传送锚点,对于每两个点对......
  • 8.2 模拟赛
    总结今天的暴力打的还行T1的卷积优化dp是真不会。T2正解如果花时间是好想的,赛时在做t3。t3会了性质,但是不会维护。t4乱搞。题解monster暴力dp显然,考虑优化。设\(f_{i,j}\)表示选了\(i\)个非负整数,和为\(j\)的最大的\(\sums\),直接做背包是\(\mathcalO......
  • 8月5日CSP-S模拟赛赛后总结
    8月5日CSP-S模拟赛赛后总结\[8月5日\\CSP-S模拟赛\\赛后总结\\2024年8月5日\\by\\\uhw177po\]一、做题情况第一题比赛\(100pts\),赛后\(AC\)第二题比赛\(20pts\),赛后\(AC\)第三题比赛\(0(40)pts\),赛后\(AC\)第四题比赛\(0(50)pts\),赛后\(A......