追击问题仿真

74 篇文章 1 订阅

猎狗追兔子问题

有一只猎狗在原点位置发现了一只兔子在正东方距离它20米的地方,此时兔子开始以3米/秒的速度向正北方全速跑去,假设猎狗在追赶兔子的时候始终朝着兔子的方向以速度4米/秒全速奔跑。

import numpy as np
from matplotlib.pyplot import *

Xr=[20];Yr=[0];vr=3#兔子的水平、竖直位置及速度
Xd=[0];Yd=[0];vd=4#猎狗的水平、竖直位置及速度
dt=0.1

L=20
n=0
while L>0.1:
    Yr.append(dt*vr+Yr[n])
    Xr.append(20)
    X=Xr[n]-Xd[n]
    Y=Yr[n]-Yd[n]
    L=np.sqrt(X**2+Y**2)
    print("相对距离:",L)
    '''
    X:水平相对位置
    Y:竖直相对位置
    L:相对位置
    '''
    Yd.append(Yd[n]+vd*dt*Y/L)
    Xd.append(Xd[n]+vd*dt*X/L)
    n+=1

print('所用时间:%.2f秒'%(n*dt))
print('跑过的路程:%.2f米'%(n*dt*vd))
plot(Xr,Yr,Xd,Yd)
show()

这一模型中,狗对兔子的追逐模式是固定的,当兔子的移动方式改变时也可以轻松修改。
例如兔子在半径R=10的圆周上以速度3.9米/秒运动,猎狗仍以4米/秒追赶兔子:

'''
兔子绕圆圈跑,狗从圆心起步正对着兔子跑
'''
import numpy as np
from matplotlib.pyplot import *

R=10
Xr=[R];Yr=[0];vr=3.9
Xd=[0];Yd=[0];vd=4
dt=0.1
L=R
n=0
theta=0
xr=dt*vr

while L>0.1:
    Yr.append(xr*np.cos(theta)+Yr[n])
    Xr.append(-xr*np.sin(theta)+Xr[n])
    X=Xr[n]-Xd[n]
    Y=Yr[n]-Yd[n]
    L=np.sqrt(X**2+Y**2)
    Yd.append(Yd[n]+vd*dt*Y/L)
    Xd.append(Xd[n]+vd*dt*X/L)
    n+=1
    theta+=vr/R*dt

print('所用时间:%.2f秒'%(n*dt))
plot(Xr,Yr,Xd,Yd)
axis('equal')
show()

四人相向行走问题

甲、乙、丙、丁四人分别位于正方形的四个顶点,顶点与中心距离为200m,并且以恒定的速率1米/秒行走。在行走过程中,甲始终朝向乙的当前位置;同样,乙朝向丙、丙朝向丁、丁朝向甲。试绘制四人行走过程的轨迹。

import numpy as np
import matplotlib.pyplot as plt

N=4
V=1
d=200
dt=1

#把N人安排到正N边形的顶点,对于不同人数有更好普适性
LX=[[d*np.cos(2*i*np.pi/N)] for i in range(N)]
LY=[[d*np.sin(2*i*np.pi/N)] for i in range(N)]

n=0
D=2*d*np.sin(np.pi/N)

while D>1:
    for i in range(N):
        '''
        四人轮流走。如果因为对称,每轮只算一个人,
        会因为一开始甲相对乙直行,使得四人均直线行走
        '''
        j=(i+1)%N     #被第i号追随的人
        D_x=LX[j][n]-LX[i][n]
        D_y=LY[j][n]-LY[i][n]
        D=np.sqrt(D_x**2+D_y**2)
        cos_t,sin_t=D_x/D,D_y/D
        LX[i].append(LX[i][n]+V*cos_t*dt)
        LY[i].append(LY[i][n]+V*sin_t*dt)
    n+=1

print('所用时间:%.2f秒'%(n*dt))
for i in range(N) :
    plt.plot(LX[i],LY[i])
    plt.axis('equal')
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值