當大家面臨著復雜的數學建模問題時,你是否曾經感到茫然無措?作為2022年美國大學生數學建模比賽的O獎得主,我為大家提供了一套優秀的解題思路,讓你輕松應對各種難題。
以五一杯 A題為例子,以下是咱們做的一些想法呀!
?
問題1:
(1)建立數學模型:
無人機投放模型在這個問題中的作用是建立數學模型來描述無人機投放爆炸物的過程,并且可以通過該模型來優化無人機投放的策略,從而提高命中率和效率。具體來說,該模型可以通過考慮無人機的飛行高度、飛行速度、俯沖角度、發射速度等因素來確定最佳的發射距離和發射時機,以確保物體能夠準確地命中目標。此外,該模型還可以考慮外部因素,如風速和風向等,來調整無人機的飛行軌跡和姿態,以提高投放精度和穩定性。
對于本題的模型,有:
其中 ρ 為空氣密度,S 為物資橫截面積, 為物資的阻力系數, g 為重力加速度,F 為無人機與物資之間的牽引力。
當無人機投放物資時,物資與無人機之間斷開連接,牽引力 F取0,上式可以化簡為:
其中為重力加速度。
(2)在無人機的飛行高度為 300m,飛行速度為 300km/h,風速為 5m/s,風向與水平面平行的情況下,使用代碼解決:
import
math# 定義常量
v0 = 300 # 飛行速度,單位km/h
vw = 5 # 風速,單位m/s
h = 300 # 飛行高度,單位m
r = 0.2 # 球形物資半徑,單位m
m = 50 # 球形物資質量,單位kg
g = 9.8 # 重力加速度,單位m/s^2# 計算投放距離
d0 = v0**2/g * math.sin(0*2*math.pi/360) + vw*v0/g * math.cos(0*2*math.pi/360)
d180 = v0**2/g * math.sin(180*2*math.pi/360) + vw*v0/g * math.cos(180*2*math.pi/360)
d90 = v0**2/g * math.sin(90*2*math.pi/360) + vw*v0/g * math.cos(90*2*math.pi/360)# 輸出結果
print(f"無人機飛行方向與風向相同時,投放距離為:{d0:.1f}m")
print(f"無人機飛行方向與風向相反時,投放距離為:{d180:.1f}m")
問題2:
假設無人機在水平飛行過程中到達距離目標點的水平距離為 x ,飛行高度為 ? ,飛行速度為v ,俯沖角度為 α ,發射速度為 u 。則無人機發射炸彈的軌跡可以分解為水平方向和豎直方向兩個分量。
在水平方向上,無人機在 秒到達目標點,發射炸彈的時間為 秒。發射炸彈時無人機的水平速度為vcos?α ,炸彈的水平初速度為 ucos?α。
在豎直方向上,炸彈自由落體運動,豎直初速度為 usin?α ,豎直加速度為g 。設炸彈飛行的時間為 秒,則有:
將 t3 的值代入到水平方向上的運動中,則可以求得無人機與目標點之間的距離 x1 :
假設無人機發射炸彈的距離為 d ,則需要滿足 1000≤d≤3000 。為了使無人機在發射炸彈時仍能保持安全的飛行高度,假設無人機的飛行高度為 800m ,則有 ?≥300m 。
為了使發射策略可行,需要選擇合適的俯沖角度 α 和發射速度u。假設 α 為定值,可以根據上述模型求出發射速度u與發射距離d的關系,并繪制出其圖像,如下圖所示。
由圖像可知,當俯沖角度為 30° 時,發射速度最小,約為 426.8m/s ,此時發射距離為d≈1716.2m
問題3:
無人機的飛行穩定性可以用無人機的俯仰角和偏航角的變化率來描述,即:
其中, θ表示俯仰角, 表示偏航角。這個數值越小,說明無人機的飛行越穩定。
無人機的命中精度可以用命中目標的距離來描述,與無人機的飛行穩定性呈反比關系,即:
在實際應用中,可以通過無人機的傳感器數據來計算無人機的俯仰角和偏航角的變化率,并根據上述公式來評估無人機的飛行穩定性和命中精度。
import numpy as np
import matplotlib.pyplot as pltdef dynamic_equation(x, u):# 狀態方程A = np.array([[1, 0, 0, dt, 0, 0],[0, 1, 0, 0, dt, 0],[0, 0, 1, 0, 0, dt],[0, 0, 0, 1-0.5*rho*Cd*S/m*dt, 0, 0],[0, 0, 0, 0, 1-0.5*rho*Cd*S/m*dt, 0],[0, 0, 0, 0, 0, 1-0.5*rho*Cd*S/m*dt]])# 輸入方程B = np.array([[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, -0.5*rho*S*vx0**2/m*dt],[0, 0, 0, -0.5*rho*S*vx0**2/m*dt],[0, 0, 0, -0.5*rho*S*vx0**2/m*dt]])# 狀態更新x_new = np.dot(A, x) + np.dot(B, u)return x_new# 定義無人機飛行過程的仿真函數
def simulate_flight(x0, u, t):# 初始化狀態和控制輸入x = x0u = u.reshape(-1, 1)# 初始化狀態列表和控制輸入列表x_list = [x]u_list = [u]# 循環仿真for i in range(len(t)):# 計算下一個狀態x = dynamic_equation(x, u)# 記錄狀態和控制輸入x_list.append(x)、、模糊處理 完整版看文章下面~u_list.append(u)# 將列表轉換為數組x_array = np.array(x_list)u_array = np.array(u_list)return x_array, u_array# 無人機和環境參數設置
h = 800 # 飛行高度,單位:m
v0 = 300 # 無人機飛行速度,單位:km/h
v = np.linspace(300, 400, 101) / 3.6 # 無人機相對地面速度,單位:m/s
vw = np.array([6, 0]) # 風速,單位:m/s
gamma = np.deg2rad(45) # 俯沖角,單位:rad
g = 9.8 # 重力加速度,單位:m/s^2# 計算無人機穩定性
S = 2 * np.pi * (0.5 ** 2) # 球形爆炸物的參考面積
Cd = 0.5 # 球形爆炸物的阻力系數
m = 50 # 球形爆炸物的質量,單位:kg
rho = 1.2 # 空氣密度,單位:kg/m^3
K = 0.5 * rho * S * Cd / m # 阻力系數
u = np.sqrt(v ** 2 + (v0 * np.sin(gamma)) ** 2) # 爆炸物相對空氣速度
D = K * u ** 2 # 阻力大小
H = h - np.sqrt((h ** 2) / (np.tan(gamma) ** 2 + 1)) # 爆炸物發射高度
t = (H - 300) / (v0 * np.cos(gamma)) # 爆炸物發射時間
x0 = v0 * t # 無人機前進距離
x = x0 + (v + vw[0]) * t # 爆炸物水平位移距離
y = H - (v0 * np.sin(gamma) + (g + vw[1]) * t) * t / 2 # 爆炸物垂直位移距離
delta_x = 20 / 2 # 爆炸物命中誤差,單位:cm
sigma = delta_x / 3 # 標準差
P = 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-(x - delta_x) ** 2 / (2 * sigma ** 2)) # 命中概率密度函數
hit_rate = np.trapz(P, x) # 命中率# 可視化結果
plt.plot(v, P)
plt.xlabel('Horizontal displacement (m)')
plt.ylabel('Probability density')
plt.title('Hit probability density')
plt.show()print('The hit rate is %.2f%%.' % (hit_rate * 100))
cs數模團隊在亞太賽 APMCM前為大家提供了許多資料的內容呀!!
具體可以看看我的下方的名片!里面包含有亞太賽一手資料與分析!
另外在賽中,我們也會陪大家一起解析亞太賽APMCM的一些方向
關注 CS數模 團隊,數模不迷路~