【问题标题】:How do I solve a 2nd order differential equation for projectile motion with air resistance?如何求解具有空气阻力的弹丸运动的二阶微分方程?
【发布时间】:2020-04-20 23:23:57
【问题描述】:

等式是:

d^2 r/dt^2 = -c/m (dr/dt)+g

其中r是弹丸的位置,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 中编写一个新函数,该函数实现了上述四个 ODE 系统,解决了 2D 抛射体运动问题......?请帮助我对 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()

【问题讨论】:

  • 您好,欢迎您-您的“网络搜索”出现了什么?例如,我看到:codeproject.com/tips/792927/…youtube.com/watch?v=IOkwWYaZbck 这里有两件事,编码和求解 ODE。您可能想从编写一些简单的代码开始,例如二次方程的解,然后是一个简单的 1D ODE,以获得您的“python 腿”,然后解决这个问题。
  • 空气阻力是速度的二次方,您使用的是水阻力(但系数错误),请参阅stackoverflow.com/a/35009733/3088138 了解计算结果。
  • 这是一个具有常系数的非齐次线性微分方程组。可以完全求解,得到精确解,不需要数值积分。

标签: python math physics numerical-methods differential-equations


【解决方案1】:

在这个关于幻影杀手病毒的妄想大流行的时代没有发生任何其他事情......

请不要称它为air resistance, that is specifically 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 ])

somewhere 复制面向向量状态的 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)

【讨论】:

    【解决方案2】:

    设置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
    

    vt 再积分一次,即可得到该位置的公式:

    r  = r0 - (m/c) * ( v0 + (m/c)*g )  - (m/c) * exp(-(c/m)*t) * ( v0 - (m/c)*g )  +  (m/c) * t * g
    

    其中r0 是初始位置。

    所以解决方案的最终公式是

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      相关资源
      最近更新 更多