课文《草船借箭》里,诸葛亮先让船「船头朝西,船尾朝东」受箭,箭像下雨一样,他又下令「把船掉过来,船头朝东,船尾朝西」,让船两面受箭。要是不掉头,十万支箭全扎在船的一边,船会怎样?我们设了一条船,让代码一支一支地算。
船是这样设的:平底方船,宽 2.5 米、长 12 米、型深 1.2 米,船体、30 名军士和草把一共 4 吨,重心离船底 0.8 米;箭每支 30 克,扎在右舷草把上、离甲板 0.8 米高。选窄船是照演义「魯肅私自撥輕快船二十隻」,演义没写船多大,这些数都是我们定的。算法把船当成横截面上的一块刚体:每一步按水面把船体切开,求排水面积和浮心,横摇按转动惯量和阻尼往前积分;箭扎上就粘住,船多一份重量、多一份力矩。不算进水。
片里的几个回合:
原著的量,一条船五六千支,6000 支只歪 1.0°。
2 万支,歪 3.7°。船舱里挂了一根水平仪,气泡走满半程算 5°,好让一两度的歪也看得出来;约 2.75 万支时倾角牌过了 5°,气泡顶到了头。
3 万多支时倾角过了 6.8°,甲板上的散草把开始往低处滑;快到 4 万支,左边船底一角翘出水面。4 万支,8.1°。
5 万支,11.5°。再往后八轮,一轮比一轮少:1000、940、860、760、640、500、365、230 支;每一轮却比上一轮歪得多:+0.55°、+0.60°、+0.64°、+0.69°、+0.74°、+0.77°、+0.82°、+0.96°。按每一千支算,最后一千支(54,345 到 55,345 支)让船从 14.9° 歪到 17.9°,多歪了 3.0°;它前面那一千支多歪 1.2°,再往前每一千支都不到 1°。
55,345 支时船还站得住;第 55,346 支扎上去,船就再也找不到平衡的位置,翻了。
翻的时候右舷离水面还有六十多厘米,不是船舷进水。空船吃水只有 13 厘米,箭又扎得高、扎在一边,重心被抬上去、拉到右边,回正的力气在十几度就到顶了。最后那一支扎上以后,按真实时间船要慢慢歪一百零一秒才到 20°,再过四秒多翻过 90°。片里 5 万支以后、静默那几秒、最后一支之后到船歪过 57°,物理时钟都调快了,画面上标了「示意 · 时间加快」;分屏右边受箭那几秒也加快了。
分屏右边是同一条船,照课文掉头:先一面受 5 万支(静平衡 11.5°,这几秒加快了,倾角牌最高读到 11.4°);掉头以后另一面再受 5 万支,船回正,一共 10 万支,静平衡 0°,片里船在 0.1° 上下轻晃,水平仪的气泡回到正中。两边各 5 万时,这条船要歪到约 42° 才会失去回正。比左边多了 4.5 万支,船反倒平了。
翻在第几支,对船和箭的设定很敏感。同样的算法换几组数,单边翻覆支数:4 吨的船,箭 20 克 8.3 万支、30 克 5.5 万支、40 克 4.2 万支;6 吨的船,9.6 万、6.4 万、4.8 万支。换成 15×3.5 米、8 吨的大船,十万支全扎一边只歪约 7.3°,不翻。汉代的箭我们没找到完整的称重数据,30 克是假设,20–40 克是这张表的区间。
出处:
《三国演义》第四十六回(维基文库本):「每船要軍士三十人,船上皆用青布為幔,各束草千餘個,分布兩邊」「孔明教把船掉轉,頭東尾西,逼近水寨受箭」「每船上箭約五六千矣。不費江東半分之力,已得十萬餘箭」「魯肅私自撥輕快船二十隻」。
统编版语文五年级下册第 5 课《草船借箭》(据演义第四十六回改写):「诸葛亮又下令把船掉过来,船头朝东,船尾朝西,仍旧擂鼓呐喊,逼近曹军水寨受箭。」
船真被箭射得快翻的记载在《三国志·吴主传》建安十八年(213 年)条,裴松之注引《魏略》:「權乘大船來觀軍,公使弓弩亂發,箭著其船,船偏重將覆,權因回船,復以一面受箭,箭均船平,乃還。」说的是孙权,地点是濡须,坐的是大船,不是赤壁。《魏略》没写那条船多大、中了多少箭;「大船」可能是上层建筑很高的楼船,重心比我们设的平底船高得多,和上面那条 15 米、8 吨的平底大船不是一回事,所以「大船只歪 7°」和孙权的大船「將覆」并不矛盾。同一条注里的《吴历》另有一说:孙权「乘輕船」进曹营看阵,曹操下令「弓弩不得妄發」,没有受箭这回事。两说不同,片尾只引了《魏略》。
示意的地方:每根画出来的箭代表若干支,计数器按真实支数走;落进江里的箭、翻船时甩出去的草把和水花、掉头的翻牌动作都是演出。水平仪是放大用的示意,气泡走多远是我们定的比例。
数字由代码真算,画面由代码逐帧算出,配乐由代码合成(音色库 GeneralUser GS,S. Christian Collins;翻纸声是 Kenney 的 CC0 音效)。