python仿真——猎狗追兔子

猎狗追兔子问题

有一只猎狗在原点位置发现了一只兔子在正东方距离它20米的地方,此时兔子开始以3米/秒的速度向正北方全速跑去,假设猎狗在追赶兔子的时候始终朝着兔子的方向以速度4米/秒全速奔跑,用计算机仿真法完成下题
(1)求猎狗追上兔子所需时间
(2)在猎狗能追上兔子的情况下,猎狗跑过的路程是多少? 
(3)画出猎狗追赶兔子奔跑的曲线图

python代码如下:

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)
    '''
    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))
plot(Xr,Yr,Xd,Yd)
show()

运行结果:
(1)所用时间:11.60秒
(2)猎狗跑过路程显然是t*vd=46.4米
(3)绘图结果如下

猎狗追兔子
这一模型中,狗对兔子的追逐模式是固定的,当兔子的移动方式改变时也可以轻松修改。
例如兔子在半径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()

结果则变成:
所用时间:20.80秒

在这里插入图片描述

四人相向行走问题

甲、乙、丙、丁四人分别位于正方形的四个顶点,顶点与中心距离为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()

所用时间:291.00秒
结果
当N增大时:
N=5
在这里插入图片描述
N=10
在这里插入图片描述
N=20
在这里插入图片描述
可见人越多,运动轨迹越接近圆,人移动到中心所需时间越长。

猜你喜欢

转载自blog.csdn.net/qq_45268474/article/details/105536636