周六的清晨,陈青山在图书馆三层靠窗的位置摊开了三样东西:左边是火箭飞行数据的打印稿,那些曲线在晨光中泛着淡淡的墨蓝;中间是周教授留的作业要求,上面用红笔圈出了几个关键词——“推力波动”、“空气阻尼”、“结构阻尼”;右边是《大话西游2》召唤兽图鉴,雷鸟的属性详解旁边有他手写的笔记。
沈思还没到。陈青山先看火箭数据。加速度曲线在2.8秒处有个小小的凹陷,像平静水面被石子激起的涟漪。但周教授在报告要求里特意标注:“请分析推力波动在飞行中变小的原因。”
推力波动为什么会变小?陈青山想起打地煞星时的经历。有时候一个技能打出去,理论伤害很高,但实际打出来的数字会低一些——因为怪物有防御、有抗性。火箭在空气中飞行,空气就像一层“防御”,会吸收、会缓冲。
他试着用游戏思维来理解。推力波动就像技能的“爆发伤害”,空气阻力就像“伤害减免”,结构本身的阻尼就像“伤害吸收”。实际打到目标身上的伤害,是爆发伤害减去各种减免。
“这么早就开始类比了?”沈思的声音在背后响起。她端着两杯豆浆,递过来一杯。
“在想怎么把问题说清楚,”陈青山接过豆浆,“周教授要我们分析推力波动被抑制的原因。我在想,能不能用游戏里的概念来解释。”
“说说看。”
“比如,火箭的推力波动是100点伤害,空气阻力能抵消30点,结构自身能吸收20点,最后实际作用在火箭上的波动就只有50点。所以波动看起来变小了。”
沈思点头:“这个比喻很形象。但我们需要定量计算,空气抵消了多少,结构吸收了多少。这需要建数学模型。”
“模型……”陈青山想起游戏里的伤害计算公式。一个技能的基础伤害,减去目标的防御,再乘以抗性系数,最后得出实际伤害。每个变量都有具体数值。
火箭也是一样。推力是基础值,空气阻力是“防御”,结构阻尼是“抗性”。但这里的数值不是游戏策划设定的,而是物理定律决定的。
“我们有个优势,”沈思打开笔记本电脑,“我们有实测数据。就像在游戏里,你打一个怪物,记录每次伤害数值,多打几次,就能反推出它的防御和抗性。”
“用实测数据反推参数?”
“对。我们知道推力曲线,知道火箭最终的飞行轨迹,就可以倒推空气阻力和结构阻尼的大小。这就像解方程——已知结果,求未知数。”
两人开始分工。沈思处理数据,陈青山思考数学模型。他先在草稿纸上画示意图:火箭在空中飞,受到四个力——向上推,向下重力,向后空气阻力,还有结构自身消耗能量的“内力”。
“结构阻尼怎么理解?”陈青山问。
“就像一根弹簧,你压它,它会弹回来,但不会完全回到原位置,会损失一点能量。火箭结构在振动时也会损失能量,这就是结构阻尼。碳纤维材料比较‘脆’,能量损失小,所以阻尼小。”
“那空气阻力呢?”
“简单说,就是空气不想让火箭通过,会推它。速度越快,推力越大,空气阻力就越大。但我们的火箭速度不高,阻力不会太大。”
陈青山在MATLAB里建了个简单模型。他把火箭想象成游戏里的一个角色:有“力量”(推力),有“重量”(质量),在“地图”(大气)里移动,受到“环境debuff”(空气阻力)。他要调整参数,让这个“角色”的移动轨迹和实测轨迹吻合。
“先假设只有空气阻力,”他设置参数,“看看模拟轨迹和实测差多少。”
运行程序。屏幕上跳出两条曲线:蓝色是实测高度变化,红色是模拟高度。前两秒两条线几乎重合,第三秒开始分离,模拟高度比实际高了一点。
“说明空气阻力不够大,”沈思说,“调大阻力参数。”
陈青山调整参数,重新运行。这次两条线在前三秒重合得更好了,但三秒后——发动机停机的瞬间——模拟曲线还是偏高。
“还有别的原因,”沈思指着曲线分离的点,“这时候推力没了,但火箭还在振动。振动会消耗能量,让火箭飞不高。这就是结构阻尼的影响。”
“那我们再加一个结构阻尼参数。”
模型变成这样:推力 - 重力 - 空气阻力 - 结构阻尼力 = 质量×加速度。其中结构阻尼力与振动速度成正比,比例系数就是结构阻尼系数。
现在有两个未知参数:空气阻力系数、结构阻尼系数。有两个方程:飞行前段(推力存在时)的轨迹匹配,飞行后段(推力消失后)的轨迹匹配。理论上可解。
陈青山写了个小程序,让MATLAB自动搜索最优参数组合。程序运行了几分钟,跳出结果:空气阻力系数0.129,结构阻尼系数0.02。
“验证一下,”沈思说,“用这两个参数重新模拟全程。”
新的模拟曲线与实测曲线几乎完全重合,最大偏差只有2%。
“所以,”陈青山总结,“推力波动被抑制,70%是因为空气阻力吸收了能量,30%是因为结构自身消耗了能量。就像游戏里,伤害被减免,70%是因为防御高,30%是因为有伤害吸收装备。”
沈思笑了:“你这个类比,周教授看了不知会怎么想。”
“但至少容易理解。”
“确实。写报告时可以用这个思路,先物理概念,再数学描述,最后用游戏类比帮助理解。”
下午五点,陈青山在银河网吧登录游戏。30级,角色头像旁多了个金色边框。信箱里有系统邮件,提示可以领取新称谓,解锁新召唤兽。
先去领称谓。任务简单,打一场战斗就完成。称号从“江湖新秀”变成“小有名气”。
然后要抓新召唤兽。雷鸟在龙窟出没,需要去那里捕捉。陈青山查了资料,抓到的召唤兽有两种:野生召唤兽和召唤兽宝宝。野生召唤兽属性低,成长差,需要先用“金柳露”洗成宝宝,洗出来的属性随机。直接抓宝宝很难,但属性固定,成长好。玩家要看初值(攻击、血量、速度等初始属性)和成长值(每级属性增长量),决定是否值得培养。
“去龙窟碰碰运气,”他决定,“能抓到宝宝最好,抓不到就抓野生,用金柳露洗。”
老白在线。陈青山发消息问能不能帮忙抓宠。
“要雷鸟?”老白回复,“龙窟我熟,带你去。”
两人组队前往龙窟。迷宫般的洞穴里,雷鸟是常见怪物。打了三场,遇到雷鸟,但都是野生雷鸟,属性面板显示“野生”,初值攻击只有80,血量200,成长1.2——很一般。
“继续找,”老白说,“雷鸟宝宝稀有,但属性好。野生的不值得培养,洗起来也费金柳露。”
又打了五场,终于遇到一只雷鸟宝宝。老白一个混乱控制住,陈青山丢出捕捉道具。两次尝试后,成功。
打开属性面板:
名称:雷鸟宝宝
等级:0
攻击:118
血量:295
速度:78
成长率:1.272
“初值不错,”老白评价,“攻击118接近满值120,血量295中等,速度78可以。成长1.272,良好。值得培养。”
陈青山松了口气。如果抓到的是成长1.1的垃圾宝宝,那还不如洗野生。现在这只可以直接练了。
“怎么加点?”他问。
“看你想让它活多久,”老白说,“全力加点,攻击高,但脆,可能两回合就飞。半攻半血,攻击低点,但能多站几回合。你们队现在保护能力一般,我建议半攻半血,保证输出持续性。”
陈青山计算。全力加点,30级攻击能达到178左右,但血量只有600上下。半攻半血,攻击148,血量900。900血比600血多50%生存能力,但攻击只低20%。
“输出和生存的权衡,”他想起火箭设计时的推重比选择。推力大,火箭加速快,但发动机重,推重比可能不够。要找到平衡点。
“我选半攻半血,”他决定,“每级1力1血。这样能抗能打。”
“好。现在带它练级。亲密很重要,每天带着战斗,喂口粮。”
老白离开。陈青山带着0级雷鸟宝宝去大雁塔刷怪。战斗间隙,他切出去看沈思发来的报告初稿。
报告用了他提出的游戏类比,把空气阻力比作“防御”,结构阻尼比作“伤害吸收”,推力波动比作“技能爆发”。然后才引入数学公式,解释每个参数的物理意义。
“这样写,周教授能接受吗?”他问沈思。
“应该能。他用琴弦比喻振动,我们用游戏比喻阻尼,都是教学策略。只要物理正确,类比方式可以灵活。”
晚上七点半,帮战。陈青山带着15级的雷鸟参战,半攻半血加点,现在攻击74,血量440。虽然还不够强,但已经能补点伤害。
帮战是龙腾四海对战神殿。陈青山队伍的任务是拖住对方一个主力队至少十回合,不求打赢,只求拖延。
战术全防守。大象保护仙族,人族控制,魔族抽血,仙族找机会输出。雷鸟的作用是——在对方召唤兽残血时补刀。
第八回合,机会来了。对方的凤凰法宠被仙族打到残血,还剩150血。陈青山的雷鸟一个雷击,打掉79。虽然没打死,但吸引了对方注意,对方不得不分心保护凤凰。
就是这个分心,让老白的主力队有机会突破另一侧防线。
第十回合,老白带队赶到,两面夹击,对方溃败。
“干得好,”老白在指挥频道说,“拖了十回合,雷鸟的补刀很关键。虽然伤害不高,但打乱了对方节奏。”
陈青山看着屏幕上战斗胜利的提示,又想起白天建的火箭模型。在模型里,每个参数都有作用,就像团队里每个角色都有定位。空气阻力参数让模拟更准,就像雷鸟的补刀让战斗更稳。
系统思维,就是在复杂中找到每个部分的位置,让它们协同工作。
无论是火箭的飞行动力学,还是游戏里的团队配合,本质都是如此。
退出游戏时,晚上十点。陈青山走出网吧,秋夜的风很凉,但很清醒。
他抬头看天。星星很亮,像无数个等待解答的问题。
但他现在知道了,每个问题,都可以被理解,可以被分析,可以用合适的方法逼近答案。
用公式,用数据,用模型。
用思考,用尝试,用调整。
这就是他走的路。
(第十三章完)