第二十章:算星星算到脑袋冒烟
搞定月亮轨道之后,苏九璃整个人都处于一种极度亢奋的状态。她“噌”地一下从椅子上弹起来,那九条毛茸茸的大白尾巴兴奋地甩来甩去,差点把旁边小几上的茶杯给扫下去。
“月亮太小意思了!就俩球互相绕,没劲!”她赤金色的眼睛亮得吓人,扒着窗户就往外看,恨不得把天上所有星星都拽下来算一遍,“林砚!下一步!算你们家那个‘太阳系’!就是有好几颗行星的那个!快点快点!本座倒要看看,星星多了你是不是就算不过来了!” 她回头冲着林砚嚷嚷,下巴扬得老高,那得意的小模样,活像只刚偷到鸡的小狐狸。
林砚看着她那尾巴都快摇成螺旋桨的架势,忍不住笑了:“师尊,太阳系可比地月系统复杂多了,您确定现在就要挑战?”
“废话少说!”苏九璃一条尾巴“啪”地轻轻抽在他胳膊上,力道不重,但催促意味十足,“瞧不起谁呢!本座的神识浩瀚如海,算几个球还不是手到擒来!别磨蹭!”
林砚拗不过她,只好笑着从笔记本电脑里调出太阳系的各种数据。幽幽的蓝光映亮了两人的脸。苏九璃立刻凑了过来,九条尾巴自发自动地围成一个圈,把林砚、电脑和她自己包在里面,形成一个毛茸茸的“计算堡垒”。她脑袋凑得极近,尖尖的银色狐耳几乎要戳到屏幕上,呼出的热气都喷在林砚脖子边,痒痒的。
“喏,你看,这就是数据,”林砚点开文档,指着上面密密麻麻的表格,“水星、金星、地球、火星……木星、土星……还有天王星、海王星。这是它们绕太阳转圈的轨道大小、扁不扁、歪不歪,还有自己有多重……”
苏九璃眯着眼,神识飞快地扫过那些数字,虽然看不懂“千克”、“天文单位”是啥,但大概明白这些都是“参数”。她尾巴尖得意地晃了晃:“就这?看起来也不难嘛!跟算月亮差不多呗,就是把拉来拉去的球多加了几个!赶紧的,照着之前的法子,搞起来!”
林砚看着自家师尊这盲目乐观的样子,心里默默叹了口气,脸上露出一种“孩子你还是太年轻”的复杂表情:“师尊啊,道理是这么个道理,但是……” 他故意拖长了调子,鼠标在表格上划拉,“从俩球变成一堆球,我们要操心的事儿,那可多了去了!”
“首先,咱得找个老大。”林砚把光标移到太阳那一行,“在月亮那儿,地球是老大。在这儿,太阳是绝对核心。所以咱们所有星星的位置和速度,都得围着太阳转。我这儿的数据呢,大多是‘平均’值,就像说一个人‘平均一天走一万步’,但不知道他这会儿是在跑还是在睡大觉。”
他顿了顿,抛出第一个难题:“而咱们的模拟,需要的是在‘某一刻’,所有行星相对于太阳的‘精确’位置和速度!它们这会儿到底在轨道哪个旮旯?跑得多快?朝哪儿跑?我这儿……没有。”
苏九璃眨巴眨巴眼,明白了:“哦!就是说,咱们只知道戏台子多大,角儿有哪些,但幕布一拉开,他们具体站哪儿,摆啥姿势,咱不知道?”
“对喽!”林砚一拍大腿,“就是这么个意思!光知道跑道长啥样不行,得知道运动员此刻在哪儿,才能预测他下一秒去哪儿。”
苏九璃皱了皱小鼻子:“那怎么办?瞎蒙一个?”
“有办法,但是特麻烦,得用别的公式反推,又是一大堆算。”林砚揉了揉太阳穴,“而且,这只是开胃小菜。”
他接着开始倒苦水:“第二个问题更头疼!算月亮的时候,咱只考虑了地球和月亮互相拉。但在太阳系,可不能再这么干了!” 他表情严肃起来,“比如地球,它不光被太阳这个大佬拽着,旁边金星啊、火星啊,尤其是胖乎乎的木星和土星,也都在用小小的力气扯它呢!虽然劲儿小,但时间长了,影响就出来了,会让轨道慢慢跑偏!这叫‘摄动’。”
他强调道:“所以,咱们的模型,不能再是简单的‘行星-太阳’一对一了,得是‘N体’!每一步,都得算算每一个星球,被太阳‘和’其他所有星球一起拉,总的劲儿是多大!然后再算它怎么动!”
苏九璃听着,脸上的轻松劲儿没了。她试着在脑子里模拟了一下:假设有8个行星加太阳(9个球),每一步,为了算一个球受的总拉力,得算它和另外8个球之间的拉力!这还只是一个球!算完所有球,计算量简直爆炸!她仿佛看到一张由无数根引力橡皮筋织成的大网,每个点动一下,整个网都在抖。她的眉头越皱越紧,感觉脑子有点不够用了,那几条大尾巴也耷拉下来,没什么精神地扫着地。
“还有第三个,也是最麻烦的!”林砚的声音带着点绝望,他指着那些行星的轨道周期,“咱们用的那个‘一步步算’的方法,在地月系统里凑合用还行。但在太阳系,星星们跑的速度差太多了!水星跑得飞快,八十八天绕一圈;海王星慢悠悠,一百六十五年才绕一圈!”
他解释道:“这就麻烦了!咱们‘一步’跨多大,很有讲究。步子迈大了,计算会崩,水星可能‘嗖’一下就飞没影了;步子迈小了,算到猴年马月去?而且就算一步步算,每一步都有一点点小误差,积少成多,算久了,轨道就不知道歪到哪儿去了!”
他无奈地往椅背一靠:“想算得准算得稳,得用更高级、更复杂的算法,叫什么‘龙格-库塔’啊,‘辛积分’啊之类的。这些东西的原理、怎么用……我,我就是个普通程序员,不是专门搞这个的专家啊!让我徒手搓一个出来,还不如杀了我……”
林砚说完,房间里安静了,只剩下电脑风扇轻微的嗡嗡声。
苏九璃傻傻地看着屏幕上那些原本让她跃跃欲试的数字,又看看林砚那张写满“做不到”的脸,终于后知后觉地反应过来——之前算月亮那么顺利,完全是新手福利!真正的算星星,简直难到变态!她好像看到那扇科学大门后面,不是平坦大道,而是布满荆棘的悬崖峭壁。
一股“我是谁我在哪我在干什么”的懵逼感,加上刚才兴奋过度后的疲惫,一起涌上来。她感觉脑袋瓜子嗡嗡的,像是有蜜蜂在里面开派对。她忍不住用手按住太阳穴,发出一声小小的、带着哭腔的“呜……”。那九条大尾巴彻底蔫了,软趴趴地堆在地上,像九团被雨淋湿的棉花糖。
林砚也瘫在椅子上,眼神放空,一脸仙气,仿佛身体被掏空。作为一个习惯了“拿来就用”的程序员,让他从底层造轮子,还是造航天级的轮子,简直是要他老命。他开始疯狂怀念以前只要敲几行代码调用现成库的日子。
屋里气氛一下子从热血沸腾降到了冰点。雄心勃勃的算星星大计,刚起步就撞上了一堵叫做“现实太复杂”的南墙。苏九璃那“雌小鬼”的嚣张气焰被彻底扑灭,现在更像一只被难题吓到、委屈巴巴缩成一团的小狐狸。
“……所以,”过了好半天,苏九璃才幽幽地、带着点鼻音开口,“咱们空知道个大概,不知道具体起点;明知道星星们互相拉拉扯扯,却算不过来那乱七八糟的劲儿;就算硬着头皮算,算着算着也会自己跑偏……是吧?” 她越说越沮丧,一条尾巴泄愤似的拍了一下地板。
林砚苦着脸点头:“总结得太精准了,师尊。是咱们太天真了。”他叹了口气,“可能以咱俩现在这水平,想精确模拟整个太阳系,还……早了一万年。”
又是一阵死寂。
两人,一个是化神狐仙,一个是穿越来的理科生,此刻双双被“算行星轨道”这个问题虐到怀疑人生,一起品尝着学渣面对超纲题的痛苦。苏九璃甚至把脸埋进了自己最软的那条尾巴里。
但是!就这么认输?太丢脸了!尤其是苏九璃,刚夸下海口就被打脸,这能忍?林砚骨子里那股“不搞定BUG不睡觉”的程序员之魂也在燃烧!
也不知道过了多久,两人几乎同时抬起头,对视一眼,看到了对方眼里不服输的火苗。
“不行!不能就这么算了!”林砚猛地坐直,撸起不存在的袖子,眼神重新变得犀利,“就算不能完美模拟,就算用最笨的方法,就算只知道个大概……咱们也得先搞个‘简化版’的出来看看!”
他看向苏九璃,语气带着鼓动:“咱们干脆假装其他行星之间不互相拉!只算太阳对每个行星的引力!这样,模型就变成好几个独立的‘二体问题’了!虽然不符合实际,但至少咱们能算出个‘理想中’的轨道是啥样!”
苏九璃原本黯淡的眼睛一下子又亮了。她立刻从尾巴里抬起头,头发有点乱,但眼神贼亮:“好!理想的就是理想的!总比干坐着强!快说,怎么搞?本座今天跟这些数字死磕到底了!” 她挥舞着小拳头,又恢复了那副“姑奶奶不服”的劲儿。
看到她重新燃起斗志,林砚也来了精神:“咱们得把这些轨道参数,转换成以太阳为原点的三维位置和速度。这得用点坐标变换的公式。我大概记得,咱们一起推!为了简单点,咱们就假设所有行星都在它们离太阳最近的那个点(近日点)开始跑,这样速度方向好确定……”
“那近日点跑多快怎么算?”苏九璃立刻抓住重点,狐耳又支棱起来了。
“用开普勒定律和能量守恒能推出来。”林砚一边说,一边抓过纸笔开始写,“对于椭圆轨道,在近日点速度 v = 根号下 [ (G*M_sun / a) * (1+e) / (1-e) ]?等等,好像不对……” 他卡住了,挠头。
“是不是这样?”苏九璃直接用灵光在空气中画出示意图,尝试推导。
“能量!用总能量算!”林砚灵光一闪,赶紧在纸上划拉。
“这个偏心率 e 怎么影响位置?在近日点,位置就是沿着长轴方向,距离是 a(1-e) 对吧?”苏九璃确认。
“对!但咱们得建个统一的坐标系,比如把黄道面当基准面。”林砚补充,“那轨道倾角 i、升交点经度 Ω、近日点幅角 ω 这些玩意儿就都得用上了!得搞个旋转矩阵!”
“旋转矩阵?怎么搞?转几次?先绕哪个轴转?” 苏九璃追问,她对这套不熟。
“我记得是……先绕Z轴转Ω,再绕X轴转i,再绕Z轴转ω……”林砚用手比划着。
“等等!新的X轴?转完之后的?那矩阵该怎么乘?R_z(ω) * R_x(i) * R_z(Ω)? 还是反过来的?” 苏九璃的狐耳困惑地转着圈,感觉脑子要打成结了。
“咱俩可能有一个记反了……” 林砚也晕了。
两人就此争论起来,谁也说服不了谁。苏九璃急得用尾巴尖直跺(地)板,林砚揪着头发恨不得以头抢地。最后,他们找了个特殊情况(i=0)来验证,折腾了半天,终于确认是苏九璃说的顺序 R_z(Ω) * R_x(i) * R_z(ω) 才对。
“看吧!本座是对的!”苏九璃得意坏了,尾巴翘得老高,“哼,敢怀疑本座!”
林砚认输:“师尊英明!”
解决了这个大麻烦,他们继续埋头苦干。把每个行星的轨道参数转换成具体的位置和速度,涉及大量的计算,什么三角函数、矩阵乘法、代数运算……搞得人头大。苏九璃神识虽强,也被这些繁琐的符号和计算弄得几次卡壳,烦躁得想掀桌子。林砚也是绞尽脑汁,一边回忆一边验证,感觉自己快被榨干了。
这期间,两人无数次濒临崩溃。苏九璃气得用尾巴把草稿纸扫得到处都是,嚷嚷着“不算了不算了!烦死了!”。有一次差点真把纸扔了。
林砚自己也对着一个符号错误debug到快吐血,无比怀念现代的编程环境和调试工具。
屋里充满了“啊啊啊这个数不对!”“哎呀符号反了!”“本座不干了!(过了一会儿)……等等,好像这里可以这样……” 之类的哀嚎和互相打气(以及互相吐槽)。
但最终,靠着苏九璃非人的算力和执拗,加上林砚的理论指导和(偶尔的)灵光一闪,他们硬是一点点啃下了所有计算,给每个行星都搞出了近似的初始位置和速度。
当最后一份数据确认无误,当林砚用他写得磕磕绊绊的代码,结合苏九璃那充当“人形超级计算机”的神识,终于让那幅简化版的太阳系轨道图在空气中亮起来的时候——
看着那八颗颜色不同、大小不一、轨道各异的“星星”,围绕着中央那颗火红的“太阳”,在黑色的背景里安安稳稳地沿着椭圆转圈圈时,一种巨大的、难以形容的成就感,混合着快要虚脱的疲惫,一下子把两人淹没了。
他们没有欢呼,没有跳跃,只是不约而同地、长长地、长长地“呼——”出了一口气,好像要把肺里所有的郁闷和疲惫都吐出来。
林砚直接瘫在椅背上,感觉自己变成了一滩史莱姆,连手指都不想动,但嘴角却控制不住地疯狂上扬。
苏九璃也毫无形象地瘫着,九条尾巴像泄了气的皮球一样铺了一地,把她都快埋起来了。她揉着发胀的太阳穴,看着空中那幅虽然简陋却凝聚了无数心血的星图,先是“噗嗤”一声笑了出来,接着越笑越大声,笑得眼泪都快出来了。
“哈哈哈……成了!居然真的成了!”她指着星图,虽然知道这只是个理想模型,但还是兴奋得不行,“你看它们!都在转!都在按咱们说的转!”
林砚也笑着,声音沙哑:“是啊……转了……虽然忽略了一堆东西,算法也糙,起点也是蒙的……但至少,这个‘理想太阳系’的架子,咱俩给搭起来了!”
笑了好一会儿,苏九璃才慢慢停下,但脸上还挂着灿烂的笑容。她散掉星图,侧过头,用一条尾巴尖轻轻戳了戳林砚的胳膊,眼神里带着疲惫,也带着一种共同奋战后的亲昵和得意:
“唉……”她拖长了声音,“想戴这顶星星做的王冠,还真是不容易啊,重死啦!” 她说着还夸张地用手按了按自己的头顶,仿佛真有一顶看不见的沉重王冠。
林砚看着她那搞怪的样子,忍不住笑出声,点头附和:“是啊,重死了。不过……”
他看着她亮晶晶的眼睛,认真地说:“能跟师尊一起,把它戴上去那么一会儿,感觉……还挺棒的。没白忙活,也没白来这一趟。”
苏九璃听了,微微一怔,随即脸上的笑容更甜了,狐耳轻轻抖动。她把下巴搁在柔软的白毛尾巴里,只露出一双弯弯的笑眼,看着窗外渐渐亮起来的天色,小声嘟囔:
“嗯……是没白来。”
“而且……好像还挺好玩的。下次,我们算个更难的吧?”
林砚:“……师尊,放过我吧,让我的代码和脑子都歇歇吧……”
回答他的,是苏九璃一串银铃般的、带着狡黠和无限活力的笑声。