1. 拿到“例题11.5”先别急着平均分配
这道题我在课程群里见过好几次,大家的困惑其实都一样:三级火箭,性能参差不齐,到底该怎么分工?最自然的想法当然是“每级分一样多的速度增量”,三级就对半分,一人3000 m/s,看起来公平合理。但“公平”不等于“最优”,这道题真正想考的是拒绝平均主义,用数学把每一级该承担的Δv重新分配一遍,让整个火箭的起飞质量尽可能小。
它适合两类人:一类是正在学航天总体设计的学生,另一类是工作中接触多级运载或分级推进场景的工程师。哪怕你手头不是火箭,而是多级增压、电池组串并联、多段管路这种东西,下面这套“把活分给更高效的模块”的优化思路,也完全能搬过去用。所以别只当它是一道习题,这个例题背后是一整套运载工具级间优化方法。
1.1 先搞清楚题目在问你什么
例题11.5其实问得很直接:给定一个载荷,给定总速度增量需求,再给定三级各自的比冲和结构系数,怎样安排三级的质量比,才能让火箭起飞总质量最小?
这里的关键词不是“推力大不大”,而是“分工比例”。我按常见习题的数据口径,设载荷为500 kg,总速度增量需求为9000 m/s,三级比冲从低到高分别是290 s、330 s、420 s,结构系数分别是0.08、0.10、0.12。低级比冲低,高级比冲高;低级结构系数小,高级结构系数大。这一组参数本身就很有代表性,低空大推力气动不那么“精贵”,高空级发动机效率高,但内部结构也复杂,死重比例相对高。
很多人一开始会把注意力放在“如何让每级推力足够大”上,但习题假设发动机已经选好,你只需要决定质量分配。这个过程放在真实设计中,就是初步总体设计里的“级间优化”:先定级数、发动机谱系、大致结构比例,再通过优化求解每级推进剂配比,算出来的起飞质量直接决定方案可行性。
1.2 为什么“平均分配”听起来很自然,其实很吃亏
先算一个直观的反例:如果按最“公平”的做法,把9000 m/s一分为三,每级各承担3000 m/s,会发生什么?
用火箭基本方程Δv = Isp × g0 × ln R来算,每级需要的质量比R差异会很悬殊:
- 低级:Isp=290 s,R = exp(3000 / (9.81 × 290)) ≈ 2.87
- 中级:Isp=330 s,R = exp(3000 / (9.81 × 330)) ≈ 2.53
- 高级:Isp=420 s,R = exp(3000 / (9.81 × 420)) ≈ 2.07
顺着质量递推下去,最终起飞质量约12.65 t。这个数字是有问题的。低级比冲低,却被迫承担和高级一样的Δv,它只能用很大的质量比去补效率差距,结果整个火箭底部被喂得特别肥,上面两级也跟着把重量一级一级放大。所以“平分任务”在工作分工里可能很讨喜,在火箭级间分配里却是一笔亏本买卖。
2. 参数差异带来的“级间默契”
要理解优化后的分配结果,先得把两个关键参数吃透:比冲和结构系数。这两个参数决定了每一级的“性价比”,也是三级性能参差不齐的根源。
2.1 比冲差异决定“发动机的含金量”
比冲通俗说就是单位重量推进剂能换多少速度增量。比冲越高,燃料越“经花”。Isp=420 s 的高级,理论上单位推进剂能产生的Δv约是 Isp=290 s 低级的1.45倍。这就像同样的油量,A车能跑100公里,B车只能跑69公里,那长路段自然应该让A车多跑,B车少跑。
要注意,比冲不是推力。一个级比冲高,不代表它推力一定大,但至少在速度增量转换效率上有优势。在级间优化里,我们默认能选的发动机已经定了,不会放大推力最大值,只比较“每公斤燃料能换多少Δv”。所以分配Δv时,高比冲那一级天然应该承担更多份额,因为同样的速度增量,放在它身上消耗的推进剂最少。
很多教材在简单等比冲假设下会得到“各级Δv相等”的结论,但那是因为所有级效率一样,平均分配恰好是数学最优。一旦比冲不一致,立刻就不一样了。例题11.5专门把比冲设成三个层次,就是为了打破“平均主义”这个惯性思维。
2.2 结构系数:每级身上背着多少“死重”
结构系数α定义为本级干质量占本级总质量的比例。干质量包括贮箱、发动机、线缆、控制设备、级间段等等,反正除了推进剂载荷以外,本级所有“搬不动又必须带着”的东西都算进去。α越大,说明这一级背上背的死重包袱越重。
回到例题参数:低级α=0.08,中级α=0.10,高级α=0.12。高级的比冲最高,但结构系数也最高。为什么?高空级往往工作环境更复杂,真空隔热、姿态控制、顶部整流罩、分离机构都挂在它身上,干质量占比自然高。低级的发动机大而笨,但贮箱结构相对简单,且一分离就扔掉,能占到便宜的只有自身重量。
α对质量比的上限有决定性的影响。对一个单独级来说,当推进剂无限增加时,质量比R会趋近于1/α。也就是说,α=0.12的级,无论怎么堆燃料,质量比也不可能超过8.33。这个上限来自于结构这个“永远烧不掉”的部分。所以高比冲并不等于能无限制承担Δv,它最终还会被结构系数卡住。
2.3 逐级质量递推:不用猜,先写方程
在优化之前,需要把各级质量关系写成严格的递推式。我建议给每一级定义一个“承重系数”k_i:
k_i = 本级起飞质量 / 本级要驮着的上面那部分质量
对最上面一级,它驮的是载荷;对中间级,驮的是上面一级的完整起飞质量;对最下面一级,驮的是中间级加上面级的完整质量。
设第i级干质量占本级总质量的α_i,本级燃烧完成时,干质量还留在火箭上,于是质量比可以写成:
R_i = m0_i / (m_上面 + α_i × (m0_i - m_上面))
用 k_i = m0_i / m_上面 代入,整理后得到:
R_i = k_i / [1 + α_i × (k_i - 1)]
这个式子看起来只是代数变形,但在后面的优化里非常重要。它把“承重放大倍数”k_i和“实际质量比”R_i解耦了。整体起飞质量为:
M0 = 载荷质量 × k_顶 × k_中 × k_底
所以问题变成:在满足总Δv需求的前提下,选一组k_i,让乘积最小。很多人在这一步还想着“各级推力多少”“燃料多少”,其实只要把k_i的方程列出来,问题已经变成纯粹的最优化问题。
3. 不平均分配的最优解推导
现在进入这道例题的核心:如何从不平均分配中找到最优解。这里用的是拉格朗日乘子法,逻辑清晰,计算也不算复杂。
3.1 从“拍脑袋”到目标函数
我们要最小化的目标是起飞质量,也就是载荷质量乘以所有k_i的乘积。为了处理方便,把目标函数取对数,因为对数不改变单调性,却能把连乘变成加和:
目标函数 = ln(M0 / 载荷) = Σ ln k_i
约束条件是三级速度增量加起来刚好等于9000 m/s:
Σ g0 × Isp_i × ln R_i = 9000
这里R_i是k_i的函数,所以约束也是关于k_i的。两个式子一摆,就是一个标准的带等式约束的最优化问题。拉格朗日乘子法的直观含义是:我们要在“总Δv固定”这条线上找一个点,使起飞质量最小;在这个点上,改变任何一级的k_i,带来的飞行器总重量增加与速度增量增加之比都应该相等。如果某级“用较少重量换来较多速度增量”,我们就该继续给它加活,直到所有级的边际收益一致。
3.2 拉格朗日乘子法推出关键公式
构造拉格朗日函数:
L = Σ ln k_i - λ × (Σ g0 Isp_i ln R_i - 9000)
对每一个k_i求偏导并令其为0。先算ln R_i对k_i的导数,从R_i = k_i / [1 + α_i(k_i - 1)]出发,可以得到:
d(ln R_i)/dk_i = (1 - α_i) / [k_i (1 + α_i(k_i - 1))]
代入拉格朗日条件,经过化简,会得到一个非常漂亮的结论:所有级共享同一个常数c,满足:
c × Isp_i × (1 - α_i) = 1 + α_i × (k_i - 1)
解出k_i:
k_i = (1 - α_i)(c × Isp_i - 1) / α_i
再代回R_i的表达式:
R_i = (c × Isp_i - 1) / (α_i × c × Isp_i)
这个c就是那个“看不到但控制全局”的公共参数。它像一个总调度的旋钮:c定下来,三级的k_i、R_i、Δv_i全部跟着定下来。我们不用分别猜三个数,只需要找一个恰当的c。这也是为什么后面求解非常快。
需要特别注意的是,c有物理边界。R_i必须大于1,所以对每一级都要满足:
c > 1 / [Isp_i × (1 - α_i)]
也就是说,c不能从0开始试,而是要从所有级各自下界中的最大值开始。如果题目给的总Δv特别大,大到渐进极限都满足不了,就会无解;实际中这也是为什么不能无限堆级数而毫无代价的原因之一。
3.3 用二分法解出那个“共同的 c”
由于总Δv是c的单调函数,c增大,每一级Δv都会增大,整体Δv也随之增大,所以很适合用二分法求c。
具体步骤:
- 计算下界 c_low = max(1/[Isp_i×(1-α_i)])
- 取一个足够大的 c_high,使总Δv > 9000 m/s
- 取中值,代入R_i公式算出三级Δv
- 如果总Δv偏小,把c_low抬到中值;如果偏大,把c_high压到中值
- 重复,直到总Δv和9000 m/s之差小到可接受
我实际试算时,取c≈0.003952 s⁻¹就能满足约束。把c代回去,三级分配结果非常有意思:低级Δv约1326 m/s,中级约2742 m/s,高级约4936 m/s。
看到这个分配,你可能会愣一下:高级居然承担了一半以上的速度增量。这符合直觉吗?符合。它比冲最高,虽然结构系数略大,但整体效率优势明显,所以优化器把“重活”往高级推。低级虽然比冲最低,但也有它的价值:它只需要把整个系统推离稠密大气,干太多反而会拖累全盘。
4. 算例落地:一张表看清分工
光有公式不够,最好把两种方案摆在一起看具体数字。这里我把“平均分配”和“优化分配”的完整质量账列出来。
4.1 两种方案的完整对比
| 方案 | 低级Δv (m/s) | 中级Δv (m/s) | 高级Δv (m/s) | 起飞质量 (kg) | 推进剂总重 (kg) |
|---|---|---|---|---|---|
| 平均分配 | 3000 | 3000 | 3000 | 12653 | 11103 |
| 优化分配 | 1326 | 2742 | 4936 | 11127 | 9616 |
平均分配看着“公平”,但代价是起飞质量多了大约1.53 t,推进剂多耗了约1.49 t。放到真实任务里,这相当于多背了十几个大型旅行箱的重量,每一克都要变成真金白银的火箭成本。
再看优化后的各级质量,也很有意思:
- 高级起飞质量:载荷500 kg → 2419 kg,相当于把载荷质量放大了约4.84倍
- 中级起飞质量:2419 kg → 6624 kg,放大2.74倍
- 低级起飞质量:6624 kg → 11127 kg,放大1.68倍
注意,优化后高级自己反而更大、更沉,而低级相对更小。这正是反直觉的关键点:让高效率的顶部级多承担Δv,并不意味着顶部级可以瘦身,它必须带着更多推进剂,看起来更重;但因为它效率高,底部级不需要再拼命堆燃料去弥补低效环节,整支火箭反而轻了。
4.2 从结果反推工程直觉
这组数字给了一个很实在的工程启示:分工不是看“谁出力大小要平均”,而是看“谁做这件事的边际成本更低”。
低比冲级干粗活,只负责起步和穿越大气层,把“接力棒”交给效率更高的上级。高比冲级虽然自己会变大,但它每多承担一段Δv,节省的是低级那一段极其昂贵的“笨重燃料”。所以优化出的结果,本质上是用高级的“高效”去抵消低级和结构带来的“低效”。
如果只盯着“高级承担的Δv是不是太多了”,你就会陷入平均主义的陷阱。正确的问题是:“把100 m/s从低级挪到高级,总重量是变轻了还是变重了?”答案是变轻了,那就继续挪,挪到边际收益相等为止。
5. 实操中更容易踩的坑
这部分是我自己做题和帮人debug时真正遇到过的问题,单独拎出来提醒一下。很多坑不是数学不会,而是细节处理不对。
5.1 二分法的边界不能乱设
我见过不少人一上来就从c=0开始二分,结果程序直接报错。原因很简单,c太小会导致某些级的k_i为负,R_i小于1,最后的Δv成了负数,程序直接滚出负无穷。
正确的下界是max(1/[Isp_i×(1-α_i)])。取这个下界时,至少有一级R_i=1,那一级Δv为0,对应“某级完全不干活”的物理状态。总Δv需求肯定比这个状态下的值大,所以下一步只需要把上界试出来。
如果你发现总Δv需求已经非常接近Σ g0 Isp_i ln(1/α_i),就要警惕收敛困难。因为这时候c必须不断增大,R_i也在逼近1/α_i的极限,数字变得非常大,但目标Δv几乎不再增加,二分区间会被拉得很“钝”。这时可以改用牛顿法或者对c取倒数再迭代,数值稳定性会好很多。
5.2 单位换算和量纲检查是隐形杀手
例题里比冲用的是秒,速度增量常用m/s,而有些同学会顺手把比冲直接当成喷气速度,或者把7.9 km/s写成7900 km/s。这些错误只要在草稿纸上多写一步量纲就能发现,但在忙的时候特别容易忽略。
我的习惯是先把所有数据统一成SI单位:g0取9.81 m/s²,Isp直接乘以g0变成有效排气速度;总Δv写死为9000 m/s,不要一会儿9000、一会儿9.0。算完之后还要做一道硬校验:用优化得到的R_i反推各级质量,看看最后一级的起飞质量是否等于底下的全部质量之和。如果不相等,十有八九是量纲或者递推漏项的问题。
5.3 递推时别把“上一级”算漏
计算各级质量时,一定要记得“本级起飞质量 = 上一级起飞质量 + 本级推进剂 + 本级干质量”。很多人递推到中级时,只把载荷当成了有效载荷,忘了把高级整机也算进去,导致后面所有尺寸都偏小。
一个稳健的检查方法是“从载荷往上逐级算”:
- 先算最上面一级的起飞质量
- 再把该质量当作下一级的“上面部分”
- 继续往下推
每推一级,都顺手把推进剂和干质量分开列出来,最后加总。这样不仅在算题时不容易乱,在真实方案里也能直接看出哪一级重量占比异常。比如优化后高级重2419 kg,其中推进剂约1689 kg、干质量约230 kg,这些数字单独列出来,一眼就知道高级是不是被设计得过于“虚胖”。
5.4 这只是理想化基础解,现实约束还不少
教材里的例题往往假设比冲固定、结构系数固定、级间分离瞬时完成,没有大气阻力,也没有重力损失修正。真实的火箭比这复杂得多:发动机比冲随高度变化、低级在大气层里有阻力、高空点火需要额外的姿控系统、结构系数也会随尺寸放大而漂移。
但这不意味着优化结果没用。在实际总体设计中,这道题得到的最优分配,往往是后续多轮迭代的起点。工程人员会在这个基础上加约束,比如某级直径不能超过某个值、某发动机推力在一定范围内、级间分离要留足够的间隙,再通过更精细的数值优化调整。理解了例题11.5里的“共同c”思想,你就知道真实任务里那些复杂的先决条件到底在优化什么。
6. 收尾:我自己的一些经验
做完这个例题之后,我最大的收获不是学会了拉格朗日乘子法,而是养成了一个习惯:拿到一个“分级任务”的时候,先把“平均分配”当成基准方案算一遍,再和优化结果做比较。只要优化结果省下的重量超过1%,就值得认真迭代;如果只省0.5%,那还不如简化假设去保工程性。
另外,我自己有个小技巧:在所有数据输入之前,先做一次“极限检查”。把每一级的Isp和α代进公式,算出该级能提供的最大Δv,加总后跟题目需求比一下。如果总需求已经在极限附近,就要提醒自己后续迭代会非常敏感;如果需求离极限还有很大余量,比如这道题那样,就可以放心用二分法快速逼近。
最后再分享一个判断最优解是否靠谱的经验:看到结果时不要急着信。把优化后各级的Δv、质量比、推进剂质量三栏并排写出来,看看有没有哪一级推进剂占比异常、哪一级Δv反而低于相邻级。如果发现别扭的地方,多半是公式里正负号、括号或者单位换算出了问题。好的优化结果不一定“好看”,但它一定能让每一级都各司其职,整支火箭的重量账算下来干干净净。