273 lines
8.2 KiB
Python
273 lines
8.2 KiB
Python
|
|
"""
|
|||
|
|
地月转移轨道:有效载荷与燃料消耗(能量)关系分析
|
|||
|
|
|
|||
|
|
基于齐奥尔科夫斯基火箭方程和霍曼转移轨道模型
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import numpy as np
|
|||
|
|
import matplotlib
|
|||
|
|
matplotlib.use('Agg') # 使用非交互式后端
|
|||
|
|
import matplotlib.pyplot as plt
|
|||
|
|
from matplotlib import rcParams
|
|||
|
|
|
|||
|
|
# 设置中文字体支持
|
|||
|
|
rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans']
|
|||
|
|
rcParams['axes.unicode_minus'] = False
|
|||
|
|
|
|||
|
|
# ============== 物理常数 ==============
|
|||
|
|
G0 = 9.81 # 地表重力加速度 (m/s²)
|
|||
|
|
|
|||
|
|
# 地月转移轨道典型ΔV预算 (m/s)
|
|||
|
|
DELTA_V_TLI = 3100 # 地月转移注入 (Trans-Lunar Injection)
|
|||
|
|
DELTA_V_LOI = 800 # 月球轨道捕获 (Lunar Orbit Insertion)
|
|||
|
|
DELTA_V_TOTAL = DELTA_V_TLI + DELTA_V_LOI # 总ΔV
|
|||
|
|
|
|||
|
|
# 不同发动机类型的比冲 (秒)
|
|||
|
|
ENGINES = {
|
|||
|
|
'固体火箭': 280,
|
|||
|
|
'液氧煤油': 350,
|
|||
|
|
'液氧液氢': 450,
|
|||
|
|
'离子推进 (仅供参考)': 3000,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 结构系数 (结构质量/燃料质量)
|
|||
|
|
ALPHA = 0
|
|||
|
|
|
|||
|
|
|
|||
|
|
def exhaust_velocity(isp):
|
|||
|
|
"""
|
|||
|
|
计算排气速度
|
|||
|
|
|
|||
|
|
参数:
|
|||
|
|
isp: 比冲 (秒)
|
|||
|
|
返回:
|
|||
|
|
排气速度 (m/s)
|
|||
|
|
"""
|
|||
|
|
return isp * G0
|
|||
|
|
|
|||
|
|
|
|||
|
|
def mass_ratio(delta_v, isp):
|
|||
|
|
"""
|
|||
|
|
计算质量比 R = m0/mf
|
|||
|
|
|
|||
|
|
基于齐奥尔科夫斯基方程: ΔV = ve * ln(m0/mf)
|
|||
|
|
|
|||
|
|
参数:
|
|||
|
|
delta_v: 速度增量 (m/s)
|
|||
|
|
isp: 比冲 (秒)
|
|||
|
|
返回:
|
|||
|
|
质量比 R
|
|||
|
|
"""
|
|||
|
|
ve = exhaust_velocity(isp)
|
|||
|
|
return np.exp(delta_v / ve)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def fuel_mass(payload_mass, delta_v, isp, alpha=ALPHA):
|
|||
|
|
"""
|
|||
|
|
计算所需燃料质量
|
|||
|
|
|
|||
|
|
公式推导:
|
|||
|
|
m0 = mp + ms + mf (初始质量 = 有效载荷 + 结构 + 燃料)
|
|||
|
|
mf_final = mp + ms (最终质量)
|
|||
|
|
ms = alpha * m_fuel (结构质量与燃料成比例)
|
|||
|
|
|
|||
|
|
由火箭方程: R = m0 / mf_final
|
|||
|
|
解得: m_fuel = (mp + ms) * (R - 1)
|
|||
|
|
m_fuel = mp * (R - 1) / (1 - alpha * (R - 1))
|
|||
|
|
|
|||
|
|
参数:
|
|||
|
|
payload_mass: 有效载荷质量 (kg)
|
|||
|
|
delta_v: 速度增量 (m/s)
|
|||
|
|
isp: 比冲 (秒)
|
|||
|
|
alpha: 结构系数
|
|||
|
|
返回:
|
|||
|
|
燃料质量 (kg)
|
|||
|
|
"""
|
|||
|
|
R = mass_ratio(delta_v, isp)
|
|||
|
|
denominator = 1 - alpha * (R - 1)
|
|||
|
|
|
|||
|
|
if denominator <= 0:
|
|||
|
|
# 物理上不可能: 结构质量太大
|
|||
|
|
return np.inf
|
|||
|
|
|
|||
|
|
return payload_mass * (R - 1) / denominator
|
|||
|
|
|
|||
|
|
|
|||
|
|
def total_energy(fuel_mass, isp):
|
|||
|
|
"""
|
|||
|
|
计算燃料的动能(近似能量消耗)
|
|||
|
|
|
|||
|
|
能量 E = 0.5 * m_fuel * ve²
|
|||
|
|
|
|||
|
|
参数:
|
|||
|
|
fuel_mass: 燃料质量 (kg)
|
|||
|
|
isp: 比冲 (秒)
|
|||
|
|
返回:
|
|||
|
|
能量 (焦耳)
|
|||
|
|
"""
|
|||
|
|
ve = exhaust_velocity(isp)
|
|||
|
|
return 0.5 * fuel_mass * ve ** 2
|
|||
|
|
|
|||
|
|
|
|||
|
|
def characteristic_energy(delta_v):
|
|||
|
|
"""
|
|||
|
|
计算特征能量 C3 (用于轨道能量分析)
|
|||
|
|
|
|||
|
|
C3 = V_infinity² (相对于地球的双曲线超速平方)
|
|||
|
|
对于地月转移,C3 ≈ -2 km²/s² (束缚轨道)
|
|||
|
|
|
|||
|
|
简化计算: C3 ≈ (ΔV)² - V_escape²
|
|||
|
|
"""
|
|||
|
|
# 近地轨道逃逸速度约 10.9 km/s,轨道速度约 7.8 km/s
|
|||
|
|
# 从LEO出发需要的额外速度约 3.1 km/s
|
|||
|
|
return (delta_v / 1000) ** 2 # km²/s²
|
|||
|
|
|
|||
|
|
|
|||
|
|
def plot_payload_fuel_relationship():
|
|||
|
|
"""
|
|||
|
|
绘制有效载荷与燃料消耗的关系图
|
|||
|
|
"""
|
|||
|
|
# 有效载荷范围: 100 kg 到 50000 kg
|
|||
|
|
payloads = np.linspace(100, 50000, 500)
|
|||
|
|
|
|||
|
|
fig, axes = plt.subplots(2, 2, figsize=(14, 12))
|
|||
|
|
|
|||
|
|
# ========== 图1: 不同发动机的燃料消耗 ==========
|
|||
|
|
ax1 = axes[0, 0]
|
|||
|
|
for engine_name, isp in ENGINES.items():
|
|||
|
|
fuels = [fuel_mass(p, DELTA_V_TOTAL, isp) for p in payloads]
|
|||
|
|
fuels = np.array(fuels)
|
|||
|
|
# 过滤掉无穷大值
|
|||
|
|
valid = fuels < 1e9
|
|||
|
|
ax1.plot(payloads[valid]/1000, fuels[valid]/1000,
|
|||
|
|
label=f'{engine_name} (Isp={isp}s)', linewidth=2)
|
|||
|
|
|
|||
|
|
ax1.set_xlabel('有效载荷质量 (吨)', fontsize=12)
|
|||
|
|
ax1.set_ylabel('燃料质量 (吨)', fontsize=12)
|
|||
|
|
ax1.set_title('地月转移:有效载荷 vs 燃料消耗\n(ΔV = 3.9 km/s)', fontsize=14)
|
|||
|
|
ax1.legend(loc='upper left')
|
|||
|
|
ax1.grid(True, alpha=0.3)
|
|||
|
|
ax1.set_xlim(0, 50)
|
|||
|
|
|
|||
|
|
# ========== 图2: 燃料/载荷比 ==========
|
|||
|
|
ax2 = axes[0, 1]
|
|||
|
|
for engine_name, isp in list(ENGINES.items())[:3]: # 排除离子推进
|
|||
|
|
ratios = [fuel_mass(p, DELTA_V_TOTAL, isp) / p for p in payloads]
|
|||
|
|
ax2.axhline(y=ratios[0], label=f'{engine_name} (Isp={isp}s)', linewidth=2)
|
|||
|
|
|
|||
|
|
ax2.set_xlabel('有效载荷质量 (吨)', fontsize=12)
|
|||
|
|
ax2.set_ylabel('燃料/载荷 质量比', fontsize=12)
|
|||
|
|
ax2.set_title('燃料效率比较\n(质量比与载荷无关,仅取决于Isp和ΔV)', fontsize=14)
|
|||
|
|
ax2.legend()
|
|||
|
|
ax2.grid(True, alpha=0.3)
|
|||
|
|
ax2.set_ylim(0, 10)
|
|||
|
|
|
|||
|
|
# ========== 图3: 能量消耗 ==========
|
|||
|
|
ax3 = axes[1, 0]
|
|||
|
|
for engine_name, isp in list(ENGINES.items())[:3]:
|
|||
|
|
fuels = np.array([fuel_mass(p, DELTA_V_TOTAL, isp) for p in payloads])
|
|||
|
|
energies = total_energy(fuels, isp) / 1e12 # 转换为TJ
|
|||
|
|
valid = energies < 1e6
|
|||
|
|
ax3.plot(payloads[valid]/1000, energies[valid],
|
|||
|
|
label=f'{engine_name}', linewidth=2)
|
|||
|
|
|
|||
|
|
ax3.set_xlabel('有效载荷质量 (吨)', fontsize=12)
|
|||
|
|
ax3.set_ylabel('能量消耗 (TJ)', fontsize=12)
|
|||
|
|
ax3.set_title('能量消耗 vs 有效载荷\nE = ½ × m_fuel × ve²', fontsize=14)
|
|||
|
|
ax3.legend()
|
|||
|
|
ax3.grid(True, alpha=0.3)
|
|||
|
|
|
|||
|
|
# ========== 图4: ΔV 敏感性分析 ==========
|
|||
|
|
ax4 = axes[1, 1]
|
|||
|
|
delta_v_range = np.linspace(3000, 5000, 100) # 3-5 km/s
|
|||
|
|
payload_fixed = 10000 # 10吨有效载荷
|
|||
|
|
isp_reference = 450 # 液氧液氢
|
|||
|
|
|
|||
|
|
fuel_vs_dv = [fuel_mass(payload_fixed, dv, isp_reference) for dv in delta_v_range]
|
|||
|
|
ax4.plot(delta_v_range/1000, np.array(fuel_vs_dv)/1000,
|
|||
|
|
'b-', linewidth=2, label='燃料质量')
|
|||
|
|
|
|||
|
|
# 标记关键点
|
|||
|
|
ax4.axvline(x=DELTA_V_TOTAL/1000, color='r', linestyle='--',
|
|||
|
|
label=f'标准任务 ΔV={DELTA_V_TOTAL/1000} km/s')
|
|||
|
|
|
|||
|
|
ax4.set_xlabel('ΔV (km/s)', fontsize=12)
|
|||
|
|
ax4.set_ylabel('燃料质量 (吨)', fontsize=12)
|
|||
|
|
ax4.set_title(f'ΔV敏感性分析\n(有效载荷=10吨, Isp=450s)', fontsize=14)
|
|||
|
|
ax4.legend()
|
|||
|
|
ax4.grid(True, alpha=0.3)
|
|||
|
|
|
|||
|
|
plt.tight_layout()
|
|||
|
|
plt.savefig('/Volumes/Files/code/mm/20260130_b/earth_moon_transfer_analysis.png',
|
|||
|
|
dpi=150, bbox_inches='tight')
|
|||
|
|
print("图表已生成!")
|
|||
|
|
# plt.show() # 非交互式环境下注释掉
|
|||
|
|
|
|||
|
|
return fig
|
|||
|
|
|
|||
|
|
|
|||
|
|
def print_summary():
|
|||
|
|
"""
|
|||
|
|
打印关键数据摘要
|
|||
|
|
"""
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("地月转移轨道分析摘要")
|
|||
|
|
print("=" * 60)
|
|||
|
|
print(f"\n任务参数:")
|
|||
|
|
print(f" - 总ΔV需求: {DELTA_V_TOTAL/1000:.1f} km/s")
|
|||
|
|
print(f" - TLI (地月转移注入): {DELTA_V_TLI/1000:.1f} km/s")
|
|||
|
|
print(f" - LOI (月球轨道捕获): {DELTA_V_LOI/1000:.1f} km/s")
|
|||
|
|
print(f" - 结构系数 α: {ALPHA}")
|
|||
|
|
|
|||
|
|
print(f"\n不同发动机的燃料效率 (每吨有效载荷所需燃料):")
|
|||
|
|
print("-" * 50)
|
|||
|
|
|
|||
|
|
payload_ref = 1000 # 1吨参考载荷
|
|||
|
|
|
|||
|
|
for engine_name, isp in ENGINES.items():
|
|||
|
|
R = mass_ratio(DELTA_V_TOTAL, isp)
|
|||
|
|
fuel = fuel_mass(payload_ref, DELTA_V_TOTAL, isp)
|
|||
|
|
ve = exhaust_velocity(isp)
|
|||
|
|
|
|||
|
|
if fuel < 1e9:
|
|||
|
|
print(f"\n {engine_name}:")
|
|||
|
|
print(f" 比冲 Isp = {isp} s")
|
|||
|
|
print(f" 排气速度 ve = {ve:.0f} m/s")
|
|||
|
|
print(f" 质量比 R = {R:.2f}")
|
|||
|
|
print(f" 燃料/载荷比 = {fuel/payload_ref:.2f}")
|
|||
|
|
print(f" 1吨载荷需燃料: {fuel/1000:.2f} 吨")
|
|||
|
|
else:
|
|||
|
|
print(f"\n {engine_name}:")
|
|||
|
|
print(f" 比冲 Isp = {isp} s (化学火箭无法实现)")
|
|||
|
|
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print("关键数学关系:")
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("""
|
|||
|
|
齐奥尔科夫斯基方程:
|
|||
|
|
ΔV = ve × ln(m₀/mf)
|
|||
|
|
|
|||
|
|
质量比:
|
|||
|
|
R = exp(ΔV / ve)
|
|||
|
|
|
|||
|
|
燃料-载荷关系:
|
|||
|
|
m_fuel / m_payload = (R - 1) / (1 - α(R - 1))
|
|||
|
|
|
|||
|
|
能量消耗:
|
|||
|
|
E = ½ × m_fuel × ve²
|
|||
|
|
|
|||
|
|
其中:
|
|||
|
|
ve = Isp × g₀ (排气速度)
|
|||
|
|
α = 结构系数 (约0.1)
|
|||
|
|
""")
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 打印分析摘要
|
|||
|
|
print_summary()
|
|||
|
|
|
|||
|
|
# 绘制关系图
|
|||
|
|
print("\n正在生成图表...")
|
|||
|
|
fig = plot_payload_fuel_relationship()
|
|||
|
|
print("图表已保存至: earth_moon_transfer_analysis.png")
|