[英]Python: How do I properly use integrate.solve_bvp for the 2-D projectile motion of an object with air resistance
[英]How do I solve a 2nd order differential equation for projectile motion with air resistance?
方程是:
d^2 r/dt^2 = -c/m (dr/dt)+g
其中r是弹丸的position,c是阻力系数,m是弹丸的质量,g是重力加速度。
假设组件形式只有二维,当然,读取,
d^2 X/dt^2 = -c(dX/dt)= U
d^2 Y/dt^2 = -c/m(dY/dt)+g
如果我们采用上述方法并将 X 和 Y 中的速度明确定义为,
U = dX/dt
和
V = dX/dt
那么整个耦合方程组是,
dU/dt= -c/m(U)
dV/dt= - c/m(V)+g
dX/dt= U
dY/dt = V
该 ODE 系统的参数为 c = 0.5 kgs^-1,m = 2kg 和 g = -9.81 ms^-2。
将变量初始化为(U0, V0, X0, Y0) = (173, 100, 0, 0)
,它从原点以与水平方向成 ∼ 30 度角发射弹丸。
如何使用 rk4(我想知道如何编写代码)在 python 中编写一个新的 function (我想知道如何编写代码),它实现了解决二维弹丸运动问题的上述四个 ODE 系统......? 请帮助我对 ODE 和编码非常陌生。 谢谢
到目前为止,我已经得到了以下内容......它不起作用,我真的不知道如何解决这个特定问题,我也打算获得一个弹丸图......有人可以改进我的代码吗?谢谢
import numpy as np
import matplotlib.pyplot as plt
def projectileMotion_V(t, M, g, c):
return -c/M * V0 + g
def projectileMotion_U(t, c, M):
return -c/M * U0
V0 = 100
U0 = 173
ang = 30.0
c = 0.5
dt = 0.1
M = 2.0
g = -9.81
h = 0.1
t = [0]
x = [0]
y = [0]
vx = [V0*np.cos((ang*np.pi)/180)]
vy = [U0*np.sin((ang*np.pi)/180)]
ax = [-(c*V0*np.cos((ang*np.pi)/180))/M]
ay = [g-(c*U0*np.sin((ang*np.pi)/180))/M]
def solveODEsWithR4Method(t, x, y, vx, vy, ax, ay):
t.append(t[0]+dt)
vx.append(vx[0]+dt*ax[0])
vy.append(vy[0]+dt*ay[0])
x.append(x[0]+dt*vx[0])
y.append(y[0]+dt*vy[0])
vel = np.sqrt(vx[0+1]**2 + vy[0+1]**2)
drag = c*vel
ax.append(-(drag*np.cos(ang/180*np.pi))/M)
ay.append(-g-(drag*np.sin(ang/180*np.pi)/M))
return -c/M * V0 + g
fig,ax = plt.subplots()
ax.plot(t, M, g, c)
plt.show()
在这个关于幻想杀手病毒的错觉大流行的时代,没有其他任何事情发生……
请不要将其称为空气阻力,即k*|v|*v
。 至于这是一个力,系数k
需要有单位kg/m
,这不是你给出的,你的阻力公式可能是正确的。 相反,将其称为“中等阻力”,防水性能会如此。
然后编码加速度
c = 0.5; m = 2; g = -9.81;
def motion(x,v):
x,y,vx,vy = v
return np.array([vx,vy, -c/m * vx + g, -c/m * vy ])
从适合向量状态的地方复制 RK4 代码
def RK4step(f,u,dt):
k1 = dt*f(u)
k2 = dt*f(u+0.5*k1)
k3 = dt*f(u+0.5*k2)
k4 = dt*f(u+k3)
return u + (k1+2*k2+2*k3+k4)/6
def RK4integrate(f, u0, tspan):
u = np.zeros([len(tspan),len(u0)])
u[0,:]=u0
for k in range(1, len(tspan)):
u[k,:] = RK4step(f, u[k-1], tspan[k]-tspan[k-1])
return u
并将两个代码一起应用以计算轨迹
dt = .1
t = np.arange(0,10,dt)
u0 = np.array([0, 0, 173, 100])
sol_RK4 = RK4integrate(motion, u0, t)
x,y,vx,vy = sol_RK4.T
plt.plot(x,y)
设置v = dr/dt
。 那么方程变为:
dv/dt = - (c/m) * v + g
将等式两边与exp((c/m)*t)
相乘:
exp((c/m)*t) * dv/dt = - exp((c/m)*t) * (c/m) * v + exp((c/m)*t) * g
将第一列术语从右侧移到左侧:
exp((c/m)*t) * dv/dt + exp((c/m)*t) * (c/m) * v = exp((c/m)*t) * g
然后通过微分的乘积规则,应用于exp((c/m)*t) * v
,得到
d/dt( exp((c/m)*t) * v ) = exp((c/m)*t) * g
d/dt( exp((c/m)*t) * v ) = d/dt( (m/c) * exp((c/m)*t) * g )
现在您可以对t
的两边进行积分,并且存在一个向量u0
使得
exp((c/m)*t) * v = u0 + (m/c) * exp((c/m)*t) * g
两边乘以exp(-(c/m)*t)
:
v = exp(-(c/m)*t) * u0 + (m/c) * g
如果初始速度为 v0,则必须设置u0 = v0 - (m/c)*g
,因此速度的最终公式为:
v = exp(-(c/m)*t) * ( v0 - (m/c)*g ) + (m/c) * g
将v
对t
再积分一次,得到 position 的公式:
r = r0 - (m/c) * ( v0 + (m/c)*g ) - (m/c) * exp(-(c/m)*t) * ( v0 - (m/c)*g ) + (m/c) * t * g
其中r0
是初始 position。
所以解决方案的最终公式是
r = r0 - v0 + (m/c)*g + exp(-(c/m)*t) * ( v0 - (m/c)*g ) + (m/c) * t * g
v = exp(-(c/m)*t) * ( v0 - (m/c)*g ) + (m/c) * g
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.