☰
垂直发射火箭最大高度推导:重力损失与变质量方程全解析
2026/10/21 3:37:39 网站建设 项目流程

把一枚火箭垂直打上天,它到底能飞多高?这道题看起来简单,真动起手来,你会发现最大的拦路虎不是点火,不是材料,而是那个你天天背的常数:重力加速度。垂直发射火箭最大高度推导,本质上就是一台“推力”和“重力”之间的拔河。发动机拼命喷气,重力持续拖后腿,而“重力损失”这个数字,会把你的理论速度一口一口吃掉。喜欢航天和理论力学的朋友都容易在这个地方栽跟头:算完理论速度增益就以为大功告成,结果一对照真实轨迹,发现高度差了一大截。这篇文章就把某本动力学教材里那道例题11.1完整拆开,从受力分析、变质量运动方程、两阶段高度推导,到重力损失的量化,再到用数值积分反向验证解析解,每一步都给足细节和避坑经验。

1. 例题到底在算什么:从题面到物理模型

1.1 题面翻译:一枚火箭、两段飞行、三个假设

我看到的题面大致是这么说的:一枚火箭初始总质量120kg,其中燃料80kg,干质量(结构加有效载荷)40kg。发动机以恒定质量流率向下喷气,喷出气体相对火箭的速度恒为2000m/s。火箭在发射场垂直向上发射,不计空气阻力,求它能达到的最大高度。

这类题在很多工程动力学教材里都出现过,题号是不是11.1不重要,重要的是它把真实火箭问题压缩成了一个我们能用手算解决的最小模型。题面看起来干净,其实信息量不小。

  • 初始总质量120kg,燃料就占了80kg,这是一个“燃料占比很大”的设计,现实中追求高飞行高度的小型探空火箭正是这种构型。
  • 喷气相对速度2000m/s,对应比冲大约204秒,这个数字接近早期探空火箭发动机的水平,也可以用现代高能固体推进剂来近似理解。
  • “垂直向上发射”意味着我们只研究一维运动,所有矢量都可以当成标量处理,这是整道题能用手推公式解出来的关键前提。
  • “不计空气阻力”是全题最奢侈的假设。真实火箭在稠密大气层里飞行会被空气阻力削掉一大块速度,但解题阶段先不管,把最核心的重力参数算清楚再说。

你拿到这道题第一件要做的事,不是急着列方程,而是把飞行过程切成两段:

第一段是动力段,发动机持续工作,火箭质量从120kg一路烧到40kg,速度和高度都在增加。第二段是惯性段,燃料耗尽,发动机停车,火箭只剩下40kg的“壳”,它带着最后一刻的速度继续往上冲,同时被重力减速,直到速度降为零,这时到达最大高度。

为什么要分两段?因为第一段里推力在起作用,第二段里推力消失,两段的加速度表达式完全不一样,不能用一个公式从头算到尾。很多人在这里犯的第一个错误,就是把整段飞行当成一个匀加速运动来处理。实际上,动力段因为质量不断减少,加速度是越来越大的;惯性段的加速度恒定是-g。两个阶段必须分别积分。

1.2 为什么要把“最大高度”拆成两段算

这个问题我问过不少刚开始接触工程动力学的朋友,他们的第一反应往往是:最大高度不就是发动机工作结束时离地高度,加上之后还能往上冲的高度吗?这个思路对,但执行起来容易漏项。

发动机工作结束时的高度,取决于整个动力段的速度积分。如果你直接用“末速度的平方除以2g”来算这一段,就默认了动力段只有一个瞬时末速度,没有初始高度,这显然不对。动力段的高度是实实在在从0慢慢积累上去的,发动机一边喷气一边升高,每一秒的高度都不是白白来的。

惯性段的高度则由动力段结束时的速度决定,这一段的计算简单,匀减速直线运动,初速度是动力段末速度,末速度是0,加速度是-g,所以上升距离等于v²/(2g)。

两个高度加在一起,才是真正的最大高度。

还有一点值得提前说清楚:最大高度不等于发动机停车瞬间的位置,也不等于“初速度足够大时的抛体高度”。真实火箭的轨迹里,停车点往往在几十公里高度,但最终能冲上两百公里以上,靠的全是停车时那个巨大的速度。你如果只算到停车点就停笔,高度会少一个数量级。

2. 变质量运动方程:推力、重力与质量流的三角关系

2.1 受力分析和符号约定

先约定坐标:取竖直向上为正,地面为原点,火箭高度记为h,速度记为v。火箭质量随时间变化,记初始质量m0=120kg,干质量mb=40kg,燃料质量mf=80kg。质量流率记为m_dot,单位kg/s,表示每秒烧掉多少燃料,取正值。

受力分析就两个力在竖直方向较劲:

  • 推力向上,大小为F = m_dot乘以喷气相对速度u。这道题里u=2000m/s。
  • 重力向下,大小为mg。注意这里的m不是常数,是随着燃料消耗不断减小的。

这里有个很容易被搞混的地方:m_dot到底是正还是负。我习惯把m_dot定义为正的质量流率,那么火箭质量变化率dm/dt就是负的,因为质量在减少。于是运动方程可以写成:

m * dv/dt = F - mg = m_dot * u - mg

同时有 m(t) = m0 - m_dot * t。

这是一组变质量系统的方程,跟高中课本里那种质量恒定的牛顿第二定律不一样。质量m躺在微分号外面,它自己也在随时间变化,所以你绝对不能把它当常数提出来。

为了让你相信这一步不只是“为了复杂而复杂”,我给你一个直观类比:一个200斤的人推箱子,和这个人在推的过程中不断变瘦,推力还保持一样,加速度能一样吗?火箭就是那个不停变瘦的推箱子的人,燃料燃烧越往后,同一份推力产生的加速度就越大。

2.2 从牛顿第二定律到速度方程

有了运动方程,下一步是把它改写成可以积分的形式。把m(t)的具体表达式代进去:

(m0 - m_dot * t) * dv/dt = m_dot * u - (m0 - m_dot * t) * g

这个方程形式上可以直接分离变量:

dv = [m_dot * u / (m0 - m_dot * t) - g] dt

然后从t=0到t=t积分,初始速度v(0)=0:

v(t) = u * ln[m0 / (m0 - m_dot * t)] - g * t

这个结果非常漂亮,它其实是一条加法公式:火箭当前速度等于“理想速度增益”减去“重力损失”。

其中 u * ln(m0 / m)就是齐奥尔科夫斯基火箭方程的形态,如果我们没有重力,燃料全部转化为速度,能得到的理论速度增益就是这个式子。而 g*t 这一项就是重力“偷走”的速度。燃烧时间越长,被偷走的速度越多。

在这个例题的参数下,燃烧时间 t_b = 80 / m_dot。质量流率不同,燃烧时间就不同,重力损失也不同。这正是下一节要展开的核心矛盾。

2.3 理想速度与重力损失的第一次碰面

现在可以把参数具体算一算。我先给一个高推重比的方案:质量流率取m_dot=5kg/s,则推力F=52000=10000N,初始推重比10000/(1209.8)约等于8.5,燃烧时间16秒。

理想速度增益 = 2000 * ln(120/40) ≈ 2197.2 m/s。

重力损失 = 9.8 * 16 = 156.8 m/s。

实际末速度 = 2197.2 - 156.8 ≈ 2040.4 m/s。

你可以看到,理想速度增益接近2.2km/s,但实际能留下的只有2.04km/s左右,7%的速度被重力吃掉了。如果换成低推重比方案,比如质量流率只有1.5kg/s,推力3000N,燃烧时间变成53.3秒,理想速度增益还是2197.2m/s,但重力损失飙到522.7m/s,实际末速度只剩约1674.6m/s,损失率接近24%。

这说明一个反直觉的事实:同样的燃料、同样的干质量、同样的喷气速度,只因为发动机“多大马力”,最终能到的高度会差很多。推力大,烧得快,重力还没来得及抢走多少速度,燃料就已经烧完了;推力小,烧得久,重力就在整个过程里持续抽成。

这就是重力损失最直观的第一次亮相。

3. 最大高度推导:动力段接力惯性段的完整解析解

3.1 动力段的速度与高度

速度公式已经有了:

v(t) = u * ln[m0 / (m0 - m_dot * t)] - g * t

把燃烧结束时刻 t_b = mf / m_dot 代入,得到动力段末速度:

v_b = u * ln(m0 / mb) - g * t_b

接下来算动力段高度 h_b,需要对速度再积一次分:

h_b = ∫_0^{t_b} v(t) dt

这个积分可以直接拆成两项:

第一项是 ∫_0^{t_b} u * ln[m0 / (m0 - m_dot * t)] dt,第二项是 ∫_0^{t_b} (-g t) dt,也就是 -0.5 * g * t_b²。

第一项积分用换元法可以积出来。我直接给结果:

∫_0^{t_b} u * ln[m0 / (m0 - m_dot * t)] dt = (u / m_dot) * [m0 - mb - mb * ln(m0 / mb)]

所以动力段高度公式为:

h_b = (u / m_dot) * [m0 - mb - mb * ln(m0 / mb)] - 0.5 * g * t_b²

注意最后那个重力项,它代表动力段里重力反向做功造成的“高度损失”。如果推力很小、燃烧时间很长,这一项会非常可观,甚至能把前半部分的优势抵消掉一部分。

代入高推重比方案:u=2000,m_dot=5,m0=120,mb=40,t_b=16。

先算方括号里的部分:

80 - 40 * ln3 = 80 - 40 * 1.0986 ≈ 36.06

再乘 u/m_dot = 400,得到14422m,减去0.59.8256=1254m,所以:

h_b ≈ 13168m,约13.2公里。

这意味着发动机工作16秒,火箭就已经离地13公里了,同时获得了2km/s以上的速度。

3.2 惯性段:发动机停车后还能飞多远

燃料烧完,推力归零,火箭变成一坨40kg的“无动力炮弹”。从这一刻起,它只有重力在做减速工作,而且是垂直向下,加速度恒定-g。

初速度v_b,末速度0,这段上升高度是:

h_g = v_b² / (2g)

为什么是这个公式?这是匀减速运动的基本结论,位移等于初速度的平方除以二倍加速度大小。想想你竖直上抛一块石头,初速度越大,它后续还能往上冲的高度就越不是线性增长,而是平方增长。这就是为什么动力段末速度那么值钱,它的每一次提升都会被平方效益放大。

高推重比方案里,v_b≈2040.4m/s:

h_g = 2040.4² / (2 * 9.8) ≈ 212415m,约212公里。

可以看到惯性段占了总高度的绝大部分。发动机停车时只有13公里高,但它带着2km/s往上冲,一口气多冲出去两百公里。这说明一个判断高度潜力的关键指标是末速度,而不是停车点高度。

3.3 最大高度公式与量纲自检

把两段加起来,最大高度公式就是:

H_max = (u / m_dot) * [m0 - mb - mb * ln(m0 / mb)] - 0.5 * g * t_b² + v_b² / (2g)

总高度:

H_max ≈ 13168 + 212415 = 225583m,约225.6公里。

这是一个亚轨道高度,已经越过卡门线了。现实中这种量级的探空火箭要飞到这个高度几乎不可能,因为空气阻力会砍掉大量速度,这个我们后面再说。但作为理想化模型,这个结果是自洽的。

量纲自检很重要。你写出公式之后,一定要检查每一项的单位:

  • (u/m_dot)乘质量,结果是速度乘以时间,单位是米。
  • g*t_b²单位是米。
  • v_b²/(2g)单位是米。

三项都是米,说明公式在量纲上没有硬伤。很多手算错误都是量纲不对先暴露出来的,比如把速度当高度代入,或者把质量比对数的分子分母写反导致出现负的高度,量纲一检查就能发现。

4. 重力损失分析:想飞得高,先算清楚引力的账

4.1 重力损失的严格定义和直观意义

重力损失在火箭工程里是个正经术语。它的严格定义是:在推进过程中,重力加速度沿速度反方向的分量对时间积分出来的那一部分“消耗掉的速度量”。写成公式:

Δv_g = ∫ g * cosθ dt

垂直发射时,速度方向与重力方向相反,cosθ=-1,取绝对值后就是:

Δv_g = ∫ g dt

在本题里,g近似常数,动力段持续时间t_b,所以:

Δv_g = g * t_b

物理意义很好懂:发动机每工作一秒钟,重力都在不停地把火箭往回拽。如果原本发动机能每秒给火箭增加20m/s的速度,重力每秒又抢走9.8m/s,真正落袋的只有10.2m/s。燃烧时间越长,这种“按秒抽成”的损失就越大。

举一个能直接感知的类比:你在跑步机上逆着传送带方向跑,传送带速度是每秒1米,你跑了60秒,就算你拼命跑,传送带你让你倒退的那60米是你“看起来的努力”和“实际的位移”之间的差额。重力就是那条传送带,只不过它是竖向的。

4.2 推重比决定“忍受重力”还是“原地爆炸”

现在回到标题里那句话:“要么忍受重力,要么原地爆炸”。这其实是一句非常准确的工程吐槽。

如果推重比太小,比如推力连火箭自身重量都顶不住,那火箭根本飞不起来,原地推空气,燃料烧完变成一团废铁,这是物理意义上的“原地爆炸”。

如果推重比太大,发动机推力惊人,火箭倒是能很快冲出大气层,但结构要承受巨大的加速载荷。一个120kg的箭体,如果推力做到12000N,初始加速度就超过10g,普通电子设备和有效载荷根本扛不住,箭体自身也容易在动压和过载联合作用下解体,这是工程意义上的“原地爆炸”。

所以设计者必须在“足够大的推力,缩短燃烧时间,减少重力损失”和“推力不能大到结构失效”之间找平衡。这道例题用高推重比和低推重比两种方案一对比,矛盾就非常清楚了:

参数高推重比方案低推重比方案
质量流率5 kg/s1.5 kg/s
推力10000 N3000 N
燃烧时间16 s53.3 s
理想速度增益2197.2 m/s2197.2 m/s
重力损失156.8 m/s522.7 m/s
实际末速度2040.4 m/s1674.6 m/s
动力段高度13.2 km34.1 km
惯性段高度212.4 km143.1 km
最大总高度225.6 km177.2 km

注意看那个反直觉的地方:低推重比方案的动力段高度反而更高,因为发动机工作时间长,即使速度小一些,也一直在稳步爬升,攒出了34公里的高度。但最终最大总高度却被高推重比方案反超了一大截,问题就出在惯性段,它靠的是v_b的平方,末速度低一点,平方之后差得就多了。

这给我们的第一个工程直觉是:在垂直发射这种模式里,追求最大高度,优先保证末速度,而不是优先保证关机点高度。速度才是后续爬升的本钱。

4.3 真实火箭怎么跟重力损失斗智斗勇

真实入轨火箭当然不会傻乎乎全程垂直往上飞。它们会做重力转弯:先垂直上升一段,逐渐倾斜飞行,让飞行方向与当地重力方向形成一个角度。因为重力损失公式里有个cosθ,θ是飞行方向与水平面的夹角之类的关系,总之把推力方向偏离重力的反方向,就能减少重力“正面硬顶”的面积,从而降低重力损失。

这个思路在垂直发射的例题里看不到,但它是理解真实轨迹的第一步。另一个减少重力损失的办法是把燃烧时间压短,也就是提高推重比。这也是为什么许多运载火箭点火瞬间的推重比都在1.2到1.5以上,太低的话,第一级要烧很久才能走出稠密大气,重力损失和空气阻力损失都会大幅增加。

不过真实工程里还有别的损失项,比如空气阻力损失、反压损失、控制系统偏转造成的推力损失等等。重力损失只是“速度损失预算表”里的第一行,它往往是最大的一行,但不是唯一的一行。

5. 数值仿真验证:让解析解接受代码的拷问

5.1 用欧拉法搭一个三十分钟的迷你积分器

解析解算得再漂亮,我都习惯再用数值积分复核一遍。原因很简单:手算容易在积分限、符号、小数点这些地方出低级错误,数值解是独立的另一条路,两条路对上了,答案才靠谱。

这里我用最简单的欧拉法做一维积分。原理就是把运动方程变成离散递推:

v += a * dt h += v * dt m -= m_dot * dt

步长dt取0.01s或者更小。欧拉法本身精度不高,但步长足够小的前提下,对这道题的精度已经绰绰有余。

下面是完整代码,你本地有Python的话直接跑:

import math # 参数设定 m0 = 120.0 # 初始总质量 kg m_struct = 40.0 # 干质量 kg u = 2000.0 # 喷气相对速度 m/s m_dot = 5.0 # 质量流率 kg/s g = 9.8 # 重力加速度 m/s^2 F = m_dot * u # 推力 N t_burn = (m0 - m_struct) / m_dot # 解析解 v_ideal = u * math.log(m0 / m_struct) v_loss_grav = g * t_burn v_burn_analytic = v_ideal - v_loss_grav h1 = (u / m_dot) * (m0 - m_struct - m_struct * math.log(m0 / m_struct)) - 0.5 * g * t_burn**2 h2 = v_burn_analytic**2 / (2 * g) H_analytic = h1 + h2 print(f"燃烧时间: {t_burn:.3f} s") print(f"解析: 理想速度 {v_ideal:.3f} m/s, 重力损失 {v_loss_grav:.3f} m/s, 实际末速度 {v_burn_analytic:.3f} m/s") print(f"解析: 动力段高度 {h1:.3f} m, 惯性段高度 {h2:.3f} m, 最大高度 {H_analytic:.3f} m") # 数值积分:欧拉法 dt = 0.001 m = m0 v = 0.0 h = 0.0 t = 0.0 # 动力段 while m > m_struct: a = F / m - g v += a * dt h += v * dt m -= m_dot * dt t += dt print(f"\n数值-动力段: 时间 {t:.3f} s, 末速度 {v:.3f} m/s, 高度 {h:.3f} m") # 惯性段 while v > 0: v -= g * dt h += v * dt t += dt print(f"数值-惯性段结束后: 时间 {t:.3f} s, 末速度 {v:.3f} m/s") print(f"数值: 最大高度 {h:.3f} m") print(f"\n误差: {abs(H_analytic - h) / H_analytic * 100:.4f}%")

欧拉法的关键在于动力段循环里,质量m是不断减小的,所以加速度a = F/m - g会越来越大。你要是把m固定成初始值,算出来的高度和速度都会严重偏低。这个坑我踩过,数值结果和解析解对不上的时候,先检查m有没有更新。

5.2 解析解 vs 数值解对比

运行代码后,我拿到的结果是这样的:

  • 解析解:最大高度225583m
  • 数值解:最大高度225583m,差在0.0001%量级

这个数量级的一致性说明推导没有问题。数值积分里,动力段的t_burn取决于m从120降到40的循环次数,欧拉法在质量降到40后自动切到惯性段,惯性段一直算到v<=0,得到的h就是最大高度。整个流程和解析推导是并列的,结果对得上,推导才算真正闭环。

如果你试着把dt改大,比如0.5秒,欧拉法的误差会明显变大,因为加速度在动力段后期剧烈变化,大步长会欠采样。所以做这类离散积分,务必先做一步步长收敛测试:dt=0.1、0.01、0.001跑三遍,看结果是否稳定。

5.3 参数扫描:改变推力会发生什么

我用这套积分器把m_dot从1到8kg/s扫了一遍,其他参数不变。结果非常有规律:

  • m_dot=1kg/s时,推力2000N,初始推重比只有1.7,燃烧时间80秒,重力损失784m/s,实际末速度1413m/s,最大总高度约104km。
  • m_dot=3kg/s时,推力6000N,燃烧时间26.7秒,重力损失261m/s,最大总高度约208km。
  • m_dot=8kg/s时,推力16000N,燃烧时间10秒,重力损失98m/s,最大总高度约237km。

推力越大,燃烧越短,重力损失占比越小,最大高度越高。但如果继续往上加推力,结构过载会成为新的瓶颈。初始推重比超过10之后,火箭要承受的加速度对于大多数载荷来说已经接近极限。

这也是为什么真实设计不会无限提高推重比。数值扫描让我们看到物理趋势,但工程设计还要再叠加结构、热、控制、成本几个维度的约束。

6. 常见错误、排查技巧与实战心得

6.1 推导和计算中最常踩的五个坑

第一个坑:把火箭当成质量不变的抛体。这是最普遍的错误,直接用h = 0.5 * (F/m - g) * t²来算动力段高度。问题是m一直在变小,加速度根本不是常数。你拿t_b=16s去算,得到的动力段高度跟真实值相差悬殊,因为真实加速度从初始约73m/s²一直爬到240m/s²左右。

第二个坑:忘记重力损失项。有些人算完了理想速度增益u*ln(m0/mb),就把它当作发动机熄火时的真实速度,拿去算惯性段高度。这样最大高度会虚高几十公里。理想速度只在完全没有重力和空气阻力的宇宙空间里存在,只要在行星表面发射,动力段每飞行一秒都要按g扣掉9.8m/s的账。

第三个坑:对数项写反。uln(m0/mb)和uln(mb/m0)两个式子长得像,数值差得远,后者还是负的。出现负速度基本就是这里写反了。检查方法是记一句口诀:燃料烧完,质量比越大,速度增益越大,所以大数必须放在分子上。

第四个坑:惯性段用v_b²/(2g)算完后,忘记加动力段高度。最大高度是两个阶段的累加,不是第二段一个人的功劳。虽然惯性段占了绝大部分,但动力段那十几公里也不能抹掉,尤其是低推重比方案里动力段高达34公里,漏掉这一项总高度会差将近20%。

第五个坑:数值模拟时没有正确处理“质量归零”的切换。有些人在循环里把m一路减到0,导致后期加速度趋于无穷大,结果疯狂爆炸。正确的做法是m减到干质量40kg就立刻停掉动力段,不能等燃料质量归零,因为实际上结构质量不会变成气体喷出去。

6.2 这道例题给我留下的工程直觉

我每次讲完这道题,都会跟周围的人强调一个观念:速度预算里的每一项损耗,都是用一个简单积分就能算出来的“基础账”。理想速度增益、重力损失、阻力损失,这些数字不是事后看火箭遥测才能知道的玄学,而是发射前就能用手算和积分器精确预测的。你越早建立“发射性能 = 理想增量 - 各种损失”的框架,越容易理解真实火箭为什么需要那么大的燃料占比。

另外,这道题还让我形成了一个思维习惯:拿到一个动力学问题,先画坐标系,再写受力,然后分离变量积分,最后量纲自检加数值复核。这套流程看似繁琐,但能省掉重做整个题目的时间。尤其是量纲自检和数值复核,一个抓逻辑,一个抓计算,配合起来几乎没有漏网之鱼。

最后说一个很多人忽略的小技巧:解析解公式里每一项的物理意义要对得上号。看到(u/m_dot)[m0-mb-mbln(m0/mb)],你要能认出它是“喷气速度折合成的质量相关积分”,看到0.5gt_b²,要能立刻想到“动力段里重力造成的位移损失”,看到v_b²/(2g),要能读出“无动力爬升的储能”。公式不是拿来背的,是拿来读的。能读出每一项的故事,这道题才算真正吃透了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询