美麗而脆弱的天體運(yùn)動(dòng):當(dāng)C#遇見宇宙混沌
你是否曾仰望星空,驚嘆于宇宙那宏大而精準(zhǔn)的秩序?行星億萬(wàn)年如一日地圍繞恒星旋轉(zhuǎn),仿佛背后有一只無(wú)形的手在精確地指揮。然而,在這看似和諧的宇宙樂(lè)章之下,其實(shí)涌動(dòng)著混沌的暗流。今天,我想通過(guò)我最新的一個(gè)開源項(xiàng)目,帶大家一窺這美麗而又脆弱的天體之舞。
這個(gè)項(xiàng)目就是 n-body,一個(gè)我用 C# 結(jié)合 ode45 高精度常微分方程求解器和 Direct2D 圖形渲染,專門用來(lái)模擬二維天體運(yùn)動(dòng)的“宇宙沙盤”。
從我們熟悉的家園開始
讓我們先從最經(jīng)典的場(chǎng)景開始:太陽(yáng)-地球-月球系統(tǒng)。這是一個(gè)我們從小就熟知的穩(wěn)定模型。
下面是它的初始參數(shù)定義:
public static SystemDef CreateSolarEarthMoon1() => new([
new(0.3534, 0, 0, -0.2658, BodyType.Solar, 1.0),
new(-1.1466, 0, 0, 0.8183 , BodyType.Planet, 0.3),
new(-0.9466, 0, 0, 2.0430 , BodyType.Moon, 0.01)
]);
運(yùn)行起來(lái)的效果,正如你我所預(yù)料的那樣和諧而穩(wěn)定:

可以清楚地看到,地球圍繞著太陽(yáng)公轉(zhuǎn),月球則圍繞著地球旋轉(zhuǎn)。但如果你再仔細(xì)觀察,會(huì)發(fā)現(xiàn)一個(gè)有趣的細(xì)節(jié):地球的軌道并非一個(gè)完美的橢圓,它在月球引力的作用下,會(huì)產(chǎn)生輕微的、周期性的擺動(dòng)。這正是萬(wàn)有引力定律在微小尺度上展現(xiàn)的魅力。
蝴蝶效應(yīng):失之毫厘,謬以千里
天體運(yùn)動(dòng)的迷人之處在于其對(duì)初始條件的極端敏感性。如果我們將初始參數(shù)做一些看似微不足道的調(diào)整,宇宙的劇本可能就會(huì)完全不同。
比如,我們微調(diào)參數(shù),將太陽(yáng)的質(zhì)量和位置稍作改變:
public static SystemDef CreateSolarEarthMoon2() => new([
new(-0.2013, 0, 0, 0.16041, BodyType.Solar, 2.0),
new(1.2987, 0, 0, -1.0744, BodyType.Planet, 0.3),
new(1.4987, 0, 0, 0.1503, BodyType.Moon, 0.01)
]);
再來(lái)看模擬結(jié)果,整個(gè)系統(tǒng)的動(dòng)態(tài)就變得狂野起來(lái):

月球被地球和太陽(yáng)的引力反復(fù)拉扯,上演了一出驚險(xiǎn)的“太空芭蕾”,最終才勉強(qiáng)穩(wěn)定下來(lái)。這正是混沌理論中“蝴蝶效應(yīng)”的直觀體現(xiàn):初始狀態(tài)的微小差異,足以導(dǎo)致最終結(jié)果的天壤之別。
完美環(huán)狀三星:脆弱的平衡藝術(shù)
除了我們熟悉的這種主星-行星-衛(wèi)星模型,宇宙中還存在著更令人著迷的結(jié)構(gòu),比如劉慈欣《三體》中提到的,也是困擾了無(wú)數(shù)物理學(xué)家和數(shù)學(xué)家的“三體問(wèn)題”。
我的模擬器提供了一個(gè)可以生成任意數(shù)量星體、并讓它們進(jìn)行穩(wěn)定環(huán)狀運(yùn)動(dòng)的函數(shù):
public static SystemDef CreateStableRing(int N, double scale = 1.0, double G = 1.0, double M = 1.0, double R = 1.0)
{
if (N < 2)
{
throw new ArgumentException("星體數(shù)量 N 必須大于等于 2", nameof(N));
}
double forceSumFactor = 0;
for (int k = 1; k < N; ++k)
{
forceSumFactor += 1.0 / Math.Sin(Math.PI * k / N);
}
double v_squared = (G * M / (4.0 * R)) * forceSumFactor;
double v = Math.Sqrt(v_squared) * scale;
BodyDef[] stars = new BodyDef[N];
for (int i = 0; i < N; ++i)
{
double angle = 2.0 * Math.PI * i / N;
double px = R * Math.Sin(angle);
double py = R * -Math.Cos(angle);
double vx = v * Math.Cos(angle);
double vy = v * Math.Sin(angle);
stars[i] = new BodyDef(new BodyState(px, py, vx, vy), BodyType.Solar, M);
}
return new SystemDef(stars, G);
}
利用這個(gè)函數(shù),我們可以創(chuàng)造一個(gè)理論上完美而穩(wěn)定的環(huán)狀三體系統(tǒng)。它們的軌跡如同精密的時(shí)鐘,優(yōu)雅而迷人:

三顆星體在引力的束縛下,跳著一曲永不終結(jié)的華爾茲。這畫面充滿了數(shù)學(xué)和物理上的和諧之美,不是嗎?
然而,這種美麗,是建立在一種極其脆弱的平衡之上的。
秩序的瞬間崩潰
在真實(shí)的宇宙中,絕對(duì)的“完美”是不存在的。任何一絲微小的擾動(dòng),都可能成為壓垮這個(gè)精密系統(tǒng)的最后一根稻草。在我的模擬中,盡管已經(jīng)使用了 ode45 這樣高精度的求解器,但計(jì)算過(guò)程中累積的微小誤差,足以打破這種脆弱的平衡。
于是,在一段時(shí)間的完美運(yùn)行后,末日來(lái)臨了:

曾經(jīng)優(yōu)雅的舞蹈瞬間化為混亂的掙扎,星體被無(wú)情地拋向遠(yuǎn)方。秩序在剎那間崩潰,混沌取而代之。這就是三體問(wèn)題最本質(zhì)的恐怖與魅力——穩(wěn)定是偶然,混亂是必然。
為了更清晰地展示這種不穩(wěn)定性,我們可以人為地給這個(gè)系統(tǒng)施加一點(diǎn)點(diǎn)“擾動(dòng)”。
如果我們將三體的初始速度降低 10%,它們將無(wú)法維持圓形軌道,最終螺旋式地坍然后重生:

反之,如果我們將初始速度提高 10%,它們則會(huì)掙脫引力的束縛,漸行漸遠(yuǎn),但由于失去速度最終又回歸:

更多奇異的宇宙之舞
當(dāng)然,三體運(yùn)動(dòng)的可能性遠(yuǎn)不止于此。宇宙的想象力遠(yuǎn)超人類。比如下面這個(gè)被稱為 "Henon5" 的初始配置:
public static SystemDef CreateHenon5() => new([
new(-0.9353825545, 0, 0, 3.3166932522),
new(1.9545571553, 0, 0, 0.1654488998),
new(-1.0191746008, 0, 0, -3.4821421520)
]);
它會(huì)產(chǎn)生一種更加復(fù)雜、更加奇特的運(yùn)行軌跡,宛如一幅不斷變換的抽象畫:

總結(jié)
從和諧的日地月系統(tǒng),到美麗而脆弱的三體環(huán)舞,再到最終不可避免的混沌結(jié)局,我們通過(guò)代碼管中窺豹,領(lǐng)略了宇宙法則的兩個(gè)側(cè)面:它可以創(chuàng)造出令人贊嘆的秩序,也可以在瞬間將一切歸于混亂。
這種從有序到無(wú)序的張力,正是天體運(yùn)動(dòng)乃至整個(gè)物理世界最迷人的地方。
感謝你閱讀到這里!如果感覺本文對(duì)您有幫助,請(qǐng)不吝 評(píng)論 和 點(diǎn)贊,這也是我持續(xù)創(chuàng)作的最大動(dòng)力!
如果你覺得我的 N 體運(yùn)行模擬項(xiàng)目很有趣,歡迎來(lái) GitHub 給一個(gè) Star ?:
https://github.com/sdcb/n-body
也歡迎加入我的 .NET騷操作 QQ群:495782587,在這里我們可以一起交流 .NET 和 AI 領(lǐng)域各種最新、最酷、最“騷”的玩法!

浙公網(wǎng)安備 33010602011771號(hào)