猎狗追兔子问题
有一只猎狗在原点位置发现了一只兔子在正东方距离它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()