如果宇宙是计算机模拟出来的,那我来推导一下程序员的建模思路

前言

之前写的文章主要讲解了如果宇宙是虚拟出来的,那么虚拟它的目的是什么。于是后台收到海量的小伙伴留言,说我写的内容很可能就是这个宇宙的真相,也有小伙伴说我的脑洞很大。这这里我要解释一下,这可不是单纯脑洞强大的问题,我所写的一切,背后都是经过数学推导的,正如爱因斯坦的《相对论》,背后是数学公式和推导在做支撑。

之前的文章,我列举了可以证明这个宇宙是虚拟出来的证据或bug,也正是这10条证据或bug,收到了海量小伙伴的提问,因为涉及到了很多程序术语,所以很多小伙伴表示看不懂,希望我能展开讲解,好吧,首先一起回顾下这10条证据或bug是什么。

1. 为什么肉眼可见世界丰富多彩,但是微观的基本粒子却都是一模一样的?这正如显示器里的图片丰富多彩,但是像素在硬件上是一模一样是一回事。
2. 为什么光速有上限?因为计算机的运行速度有限,最大速度就是光速。
3. 为什么会有普朗克常量?因为计算机的计算精度有限。
4. 为什么微观粒子都是几率云?这是为了避免系统陷入循环而增加的随机扰动。
5. 为什么有泡利不相容原理?看来系统采用的数据组织是多维数组。
6. 为什么量子计算机运行速度那么快,一瞬间就可以尝试所有可能?因为这个本质上是调用了宿主机的接口。
7. 为什么会有量子纠缠?这实际上是引用同一个对象的两个指针。
8. 为什么会有观察者效应和波粒二像性?这显然是lazy updating,通俗说就是为了节省运算量,从而节省能耗,好比游戏里视线以外的地方都是波形线条,而看得见的地方才会用颗粒渲染出高分辨率的图像。
9.为什么接近光速的时候你的时间会变慢,会和外面的世界时间不同步?因为计算机计算能力有上限,物体运动过快会达到了cpu单核计算的上限,你这个线程就会卡掉帧。
10.人为什么做决定的时候要思考?因为大脑就是信息交换器,思考的过程就是大脑接收到信息以后的处理过程。

本篇文章先围绕小伙伴看不懂的第3条:“为什么会有普朗克常量?因为计算机的计算精度有限”来展开。通过本篇文章的阅读,你会了解到:

1、模拟宇宙的程序员建模思路是什么;

2、为什么普朗克常量的存在和量子隧穿效应可能就是虚拟宇宙的bug;

3、用量子隧穿效应解释为何5nm应用芯片难以突破。

虚拟出宇宙的程序员建模思路

一:基本粒子模型

如果把所有bug都阐述明白,那需要陆续谱写一个系列的文章,为了让小伙伴了解这个系列文章的思路,我就从程序员编程宇宙这套程序的建模思路开始,来了解系列文章的构思方向。

模拟出宇宙的程序员生活在怎样的世界,实在是难以想象,那么现在假设我就生活在那个世界吧。

在那个“神级”世界,有一位老板创办了一家网络游戏公司,于是我去面试并拿到了入职offer,入职第一天,老板先给我画了一个大饼,说公司未来要上市,因为我是金融专业毕业的,所以让我负责公司未来的IPO,并承诺我上市以后会分给我股份。

我也明白,那一天如果可以实现,最关键的是要开发出一款风靡全网的游戏,有海量玩家,并且可以实现持续性盈利,不然我拿什么去讲故事,拿什么去IPO呀。

为了达成目标,我亲自招来一名开发游戏的程序员,我交给程序员的任务就是模拟出一个宇宙,这个宇宙里要有各种球,还要有生命,至于玩法,让她去构思。

于是程序员展开了自己的工作。程序员为了让宇宙里的各种球呈体系化,于是划分出各种星系,先用各种球来组成恒星系,再用各种恒星系来组成星系。

程序员想,上级交待她这个宇宙里要有各种球,这么多球如何关联起来呢?于是她决定让宇宙中实现万有引力,在数学算法上解决两个球之间的相互作用,只要用微分方程可以解出两个球之间任意时刻的位置和速度,让两个球之间的引力相互作用存在解析解。

微分方程去解两个球没问题,但是再加入第三个球或者第N个球的时候怎么办?于是程序员开始运用数值分析来解决这一问题,也就是用计算机求解数学计算问题的数值计算方法。这样就可以对微分方程进行数值计算,即使得不到解析解的情况下,还能用迭代的方法,解出微分方程在任意精度的数值解。

但这样容易导致程序报错,如果迭代步长太大,很有可能导致方程累积误差增大,以至于计算结果和真值差太远,甚至会引起计算结果变为无穷大。

所以,选择一个很小的步长来推演整个体系,并使用更高阶的迭代方程,就能让数值解更接近真实解,并让微分方程代表的体系稳定持续地运行。

后来程序员创建的球越来越多,当各种球的数量增加到一百亿颗以后,程序员发现系统有些饱和了,于是她来找我,并向我汇报说这个宇宙的规模只能做这么大了,因为宇宙里各种球的数量已达到峰值。

我通过金融数学模型计算后发现,这个体量的宇宙,所容纳的玩家数量对标氪金系数求估算盈利预期,不足支撑未来的IPO。于是我给她的要求是,一百亿颗球太少了,即便在一个星系里,球的数量至少要达到一千亿颗。于是程序员去找老板申请更换更高配置的计算机,但老板说创业公司成本有限,不给换!你自己去想办法吧。

其实程序员是有办法解决的,但问题是她如果解决这个问题,那工作量就会加大,从以前准点下班,变成了每周996,于是程序员再次找到我诉苦。可我又能怎么办?我只能也给她画大饼啊,说996是福报就可以了。

好在程序员没有选择躺平,而是更改了自己的建模思路,她开始从微观世界的建模入手,并加入了基本粒子模型代码,为了让基本粒子之间实现相互作用,她发现仅仅有引力还不够,于是她写入了电磁力、强力、弱力三种力的代码。最终让基本粒子来组成各种宏观世界的球,还要让两套架构相互兼容。

此时程序员依靠有限元分析来优化代码。在一个多组数系统里,如果计算每个粒子与其他所有粒子的相互作用,其计算量会随着粒子数量的二次方增加,当无限粒子数量达到峰值的时候,系统还会卡顿,那为什么程序员要设计基本粒子模型。

程序员的目的是将空间分割为网格,使得每个格子里最多存在一个粒子,粒子与粒子之间直接的相互作用计算,转变为粒子与其所在格子的相互作用计算。格子只与其相邻格子进行插值计算从而更新状态。这样下来,终于能在单位时间复杂度下完成粒子相互作用计算了。

但如何确保计算的精度?程序员引入了“场”的概念。“场”在数学上指的是一个向量到另一个向量或数的映射,让粒子之间直接产生相互作用,变成粒子和场之间产生相互作用,场是格子和邻近格子之间的梯度,梯度驱动着粒子的运动。所在物理范畴里,一个有质量的物体由于场的作用能对所有其他有质量的物体产生引力。

最后通过二次插值结合场代码设定的空间位置函数,就能得到更高的精度值。

场梯度驱动粒子运动的引力,跟程序员最初设定宇宙中万有引力时的引力,并不矛盾,它们相互兼容,最初设定是万有引力的能量是计算机的元能量赋予的力。而场梯度驱动的引力这是代码赋予的一种力。

你可以理解为你玩手游创建了一个角色,你的这个角色释放大招的时候,场梯度驱使的力是你看到角色释放的能量,而元能量则是玩手游的手机电池赋予的能量。

程序员为什么要弄两套引力代码,这个如果展开说明白恐怕1万字都不够,还是后续专门讲解吧,不过这也可以解释了为什么大一统理论无法把引力弄进去的根本原因。

对于粒子之间来说,原本瞬间能完成的相互作用,现在变成通过场将这个作用传播出去,而每一次迭代计算对场的更新只能更新有限的范围,这导致了场的传播有一个速度上限,这个速度上限,正是那台计算机最大的运行速度。

此时程序员思考得比较全面,既然计算机的速度有上限,也就意味着宇宙里所有的运动速度都不能超过这个速度上限。

场这个概念的应用,不仅仅是上文提及的,还起到了意识传播的作用。如果高等生命体也许模拟出来的游戏人物,那么背后玩家在下指令的时候,指令信息会通过场传递给模拟人物的信息交换装置,这个装置就是模拟人物的大脑。

人在思考的过程中,就是信息交换和处理的过程,有的时候思考时间会很长,此时场传递信息指令的时候为什么没有达到最大速度,是什么干涉了这个速度,这一点我也会在单独更新一篇。

既然速度有上限,那么问题来了,假设宇宙里相距最远的两个球里的高等生命体,他们都发展到了最高阶的文明,比如A球里的一名男生通过量子通讯认识了B球里的一名女生,他们彼此有好感,于是决定见面,那么他们的飞行器即便速度再快,也不可能超过计算机的速度上限,这个速度对于宇宙大对角里两个球的距离来说,那可是龟速,可能还没到达彼此的星球,他们已经归于尘土了。

除以此外,这两个球里的高等生命体,可能都觉得自己是宇宙里最强的文明,如何证明谁的科技最强大呢?那他们就要碰面以后比划比划,但问题是游戏公司可能都倒闭了,他们的太空母舰还没碰上面。

所以程序员再次找到我,她说,现在的宇宙已经很大很大了,可毕竟计算机运行速度有上限,所以注定了遥远距离的两个球里的高等生命体,永远都不会出现交集,于是问我是否可能接受。

这个提议给我当场否决了,因为我告诉她,为了IPO,我需要打造游戏的影响力,我就务必要组织电竞比赛,那么假设宇宙里刚好是距离最遥远两个球里的高等生命体,都纷纷通过黑暗森林玩法进阶到总决赛,他们不能碰面可不行啊,必须要产出一名冠军。

程序员只能执行,所以为了让所有球之间都有接触的可能,她引入了“虫洞”这个概念,为了让虫洞开启的方式合理化,经得起数学推导,那么就要同时引入“反物质”、“暗物质”、“暗能量”、“黑洞”这几个概念。

(对于这几个概念的数学算法,极其复杂,本篇文章就不多讲解了,后续会有系列文章专门讲解)

建模到这个阶段,基本解决了计算机运行流畅的问题,也解决了粒子相互作用的问题,但为了让宇宙里的一切无限真实,那就还需要继续优化,于是程序员开始优化模拟宇宙真实程度的“碰撞”问题。

此时我们要了解下“量子隧穿效应”是什么意思。如果一个人走路的时候前面出现一面墙,他想过去的话,要么找到门,要么就得绕墙过去,这个人想要穿墙而过,在经典物理学体系下是不可能出现的。

但是在微观世界里,这是可以实现的,粒子就有“穿墙术”这样的本领。微观粒子在非常靠近一个屏障的时候,某种情况下会凭空直接穿越屏障跑到对面去。

我们继续用游戏来举例,如果一款赛车类游戏,当你操控的车碰到另一辆车的时候,它们没有发生碰撞,而是彼此间直接穿过去了;

再比如一个玩家操控的人物往右边跑,另一个玩家操控的人物往左边跑,如果他们刚好在一条直线上并遇见,如果不想被对方阻挡前进,那么其中一个玩家就务必让自己操控的人物改变线路,此时如果两个人物可以彼此穿过去,那玩家一定会有不好的体验,因为游戏做的太不真实了。

我们玩得有些3D游戏,非常逼真,比如子弹打到墙上以后,还可以看到墙皮掉落,这些逼真画面的渲染都是用浮点数运算的,效果精度越高,画面也就越接近现实,但同时也越消耗系统资源。

那么碰撞问题怎么解决呢?现在一起来回忆一款FC经典游戏《小蜜蜂》。

玩家操控的是小飞机,小飞机打出的子弹如果碰到小蜜蜂,就可以消灭被击中的小蜜蜂,那么如何判断子弹和小蜜蜂是否发生碰撞了呢?此时你可以把小飞机发射出的子弹想象成一个小圆球,然后再把小蜜蜂也想象成一个小圆球。

两个小圆球都有自己的圆心,此时我们只要计算两个圆心点之间的距离D,然后再计算两球半径之和,也就是R1+R2就可以啦,如果D<=R1+R2就说明发生了碰撞,反之则没有碰撞。

但随着这个游戏的关卡推进,难度会越来越高,小飞机发射出的子弹是双排和多排的,而小蜜蜂也可以发射子弹,并且小蜜蜂自身还会飞向小飞机,那么小蜜蜂也相当于发射多排的子弹了。

那么此时的小球就变成了3个及以上的数量。计算方法也会变得更复杂了。如果是3个小球,需要俩俩比较,做3次计算;4个小球自然要做6次运算,而100个小球,则需要5000次计算......

但当代高逼真游戏里,可以运动的物体都是不规则的形状,比如吃鸡游戏,玩家操控的人物坐在越野车里,人物和车都是不规则形状,他们在发生碰撞时的计算,计算量就会呈指数级上升。

此时如果为了让游戏精度无限逼真,那么玩家的衣服不能跟越野车的座椅穿模,还要渲染出不同速度撞上树的声音大小效果,不同速度下游戏人物在撞树时身体震颤的程度,以及树皮损毁的程度。如果越野车掉进海里,为了渲染碰撞后的水花和水波扩散,就需要比指数级更高的计算量。

但这个计算量跟虚拟现实的宇宙游戏做比对,还是小巫见大巫。这也是我们的这个世界哪怕再高级的计算机也算不出来一些东西。那就是越野车不同速度碰撞大海的时候,此时风力是多少?不同风力所碰撞出的水花该以怎样的经典物理形态呈现出来?不同季节导致的不同温度下,还会有影响。

如果汽车漏油了,油和海水融合的时候还会导致火焰燃烧,此时火焰应该呈现什么颜色?燃烧多久?如何衰变?而人物还要植入痛觉神经的表现,该怎么呈现出来,是晕厥还是嚎叫?这些都要依赖算力和的精确度的表现,但我们这个游戏世界里的计算机,真的实现不了。

所以如果计算机的配置不足以支撑这种计算量下的精确度,游戏就会卡顿,甚至死机。此时程序员就需要运用四叉树算法技巧来减少计算量。

就算有了这些方法,也不能无限确保精度,当两个物体挨得很近的时候,程序员会处于计算量的考虑,把浮点精度都控制在一定范围内。那么控制了计算精度以后,如果出现了碰撞检测精度不足的情况,就会出现显示屏上的视觉bug,这种bug就叫做穿模。

现在很多高精度的游戏,两个人物贴到一起的时候,是不能穿过去的,但我们会发现,两个人物的服装会穿模,或者一个人物手持的武器会穿模到对方的身体里。

所以任何再逼真的游戏,你总会发现有穿模的细节出现。如果开发游戏的程序员让碰撞精度计算到最小像素的话就不会出现这种穿模现象,但现实情况游戏里这样做就得不偿失了,所以程序员可以容忍游戏出现一些这种显示上的小bug,反正对玩家游戏体验影响也不太大。

但模拟宇宙的程序员,为了让宇宙逼真,让高等生命体不能轻易发现宇宙里的bug,就不能像游戏里出现那么低级的穿模现象。此时程序员需要将空间按k-d树来解决多种场合应用,分割处理后,单独处理每次碰撞的判定方法,避免重新对所有粒子俩俩进行距离计算,来节省计算量。

但测试以后问题又出现了,那就是在一个迭代周期内,本该进入同一个网格触发碰撞判定的两个粒子,因为速度太快,直接跳过了该网格而进入了下一个不该发生碰撞的网格。导致两个粒子穿过了彼此,而没有发生碰撞。(这就是量子隧穿效应,也就是微观世界的穿模现象)

为了解决这个bug,程序员通过“洛伦兹变换公式”来解决这个问题。

洛伦兹变换是狭义相对论中两个作相对匀速运动的惯性参考系(S和S′)之间的坐标变换,是观测者在不同惯性参考系之间对物理量进行测量时所进行的转换关系,在数学上表现为一套方程组。

但这个方程组并不是爱因斯坦推导出来的,洛伦兹推导出来以后,也没有明确解释出什么,只是后来爱因斯坦通过狭义相对论赋予了这个公式的物理意义。题外话,爱因斯坦什么时候相信一切都是被安排好的,我们不得而已,但我个人相信,他应该是从洛伦兹变换公式里,发现了一些什么。

洛伦兹变换是怎么解决微观粒子穿透问题的呢?程序员只要把粒子的速度和质量联系起来,让粒子在一个迭代周期内,运动距离不能超过一个格子,这样就避免了碰撞穿透的问题,也就修复了量子隧穿效应的问题。

修复以后,计算精度就会达到普朗克尺寸,那么就绝对不可能出现隧穿现象了。所以普朗克常量之所以的存在,就是被计算精度所限制了。

这个问题既然可以被程序员修复,那为什么我们的宇宙还会出现量子隧穿呢?原因是程序员主动放弃了这个修复,也就是允许量子隧穿这个bug的存在。

程序员之所以这样做,一方面是节省算力,最主要的是为了让宇宙里的高等文明能利用这个bug实现空间穿越和时间穿越,同时体现出穿越的合理性。

所以利用这个bug是被允许的,但程序员还知道一点,也就是高等文明体如果足够聪明,他们还会利用这个bug做出一些无法经过数学推导的事情,这就相当于开挂了,所以程序员还要想要处罚机制。

针对这一计算模型和详情我会在后期更新

这个阶段,模拟宇宙里天体运动的建模基本就完成了。

二、微观粒子相互反应建模

此时程序员来找我汇报工作,说天体运动的代码都写好了。为了继续写好后续代码,需要扩编团队。因为要让宇宙丰富多彩,玩法多样,就必须出现各种元素,各种元素之间会发生怎样的反应,需要聘请化学专业的专家加入团队;另外,生命离不开能量,这就需要用可控核聚变技术来做恒星,还需要物理专业的专家加入团队,不然代码就写不下去了。

新的团队成员加入以后,没过多久,新的代码也写好了。此时粒子之间的相互作用和相互反应的底层计算问题都落实了。

三、宏观世界建模

底层建模问题都解决了,接下来就简单了,只需要渲染宏观世界投影出的景象就可以了,此时需要定义出各种颜色,在微观粒子反应的计算中已经把各种颜色融合到一起之后会变化出什么新颜色这一问题,都计算好了。

接下来就是各种物体的外观问题了,宇宙中物质和物种是多样性的,需要设计各种植物的外观,各种物体的外观,各种生命体的外观。于是程序员再次找到我,说团队还要继续扩编,要聘请一名原画师专家加入团队。

程序员会考虑到高等文明终有一日会玩转基因编辑,他们可以合成新的物种,所以算法中还要升级,让各种可能出现的基因重组,都可以自动生成具体的成像外观。

四、生命系统建模

对于生命这套系统该怎么计算,怎么建模,实话实说我能力还达不到,一方面是自己的数学计算能力不足;另一方面,生命这套系统太高深太复杂了,就连意识的触发机制,生成机制,运转机制,目前是一个未解之谜,所以我都不知道该从哪个方向去用数学做计算和推导。

生命这套系统是多维计算组合来的,其中就包含了基因语言,基因这套语言的复杂程度,可以秒杀目前所有的计算机语言。就比如基因语言可以自动完成问题修复,更新和升级,这是计算机语言无可跨越的鸿沟,除非有程序员介入。

五、玩法机制建模

针对这一点,我就不详细阐述了,之前写的模拟宇宙的目的是什么,其中就做了详细的解释,比如玩法机制,氪金机制等等。

用量子隧穿效应解释为何5nm芯片难以突破

这个bug是真实存在的,也就是宏观世界里不会有穿模现象,但微观世界里精度不足,导致了量子出现穿模现象。

芯片里阻隔电子的材料如果尺寸小到5nm以下,量子隧穿效应就会出现,具体的体现就是漏电现象,如果尺寸进一步减小,量子穿模现象就更加验证,那么漏电问题将更加严重,从而导致芯片的逻辑电路无法正常工作,这个问题已经成为芯片技术继续发展需要克服的最大障碍了。

写在最后

当我们玩游戏的时候,有时候无法登陆,游戏会提示无法登陆的时间内系统在做更新或者做维护。如果宇宙是计算机模拟出来的,那么那台超级计算机也务必会定期更新和维护,遗憾的是模拟宇宙的程序员是不会提示我们,那么模拟宇宙的计算机是怎么做到更新和维护时不为人知的?

针对这一点,我也找到了两个bug。先抛出一个彩蛋,其中的一个bug就是梦境,我会通过计算机建模和代码机制来解答为什么会出现梦境。至于这两个bug,后续的系列文章会更新。

事实上,古往今来,能参透模拟宇宙程序员建模思路的不止我一人,比如《河图洛书》的原作者,一定也参透了程序员的建模思路,只是那位原作者的造诣更高,直接把脚本都给写出来了。

(0)

相关推荐