簡體   English   中英

如何求解具有空氣阻力的彈丸運動的二階微分方程?

[英]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

vt再積分一次,得到 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM