語文課下課鈴響起的瞬間,高三(7)班緊繃的空氣才重新開始流動。
掌聲散去,但那種混合著驚異與探究的目光,如同實質般匯聚在林允寧身上。
孟慧蘭離開前,深深地看了他一眼,眼神里既有發現璞玉的驚喜,也有一絲難以置信的困惑。
后排,導演劉偉已經放下了那個寫滿筆記的本子,他沒有再對攝影師小王下達任何指令,只是雙臂環抱,靜靜地觀察著。
作為一名從業近二十年的資深媒體人,他瞬間意識到自己錯得有多離譜。
他原本想拍一個“故事”。
但眼前這個少年,其本身就是一種“現象”。
對于現象,任何預設的劇本都是一種褻瀆。
最好的方式,就是記錄。
“小王,”
他終于開口,聲音平靜卻有力,“從現在開始,忘掉分鏡。用你的直覺去捕捉,我不要漂亮的構圖,我要真實的細節。”
下一堂是數學自習。
張老邪依舊抱著他的保溫杯,在教室里用他特有的方式巡視。
但這次他沒有靠近林允寧,只是遠遠地點了點頭,給了他一個“你小子自己安排”的眼神。
林允寧終于能清靜地打開那臺IBM ThinkPad X40。
Windows XP的經典開機畫面過后,閃動的QQ頭像帶來了韓至淵的消息。
【組長—韓至淵】:合成數據生成器已經部署好。你的第一個考驗,現在開始。讓我看看你的算法。
【附件:synthetic_data_generator.py】
林允寧下載了附件,打開仔細瀏覽了一遍,迅速讀懂了腳本的邏輯:
程序會生成一組包含已知非諧參數的、理論上完美的拉曼光譜,然后用一個儀器響應函數(IRF)對其進行卷積,最后再疊加上一層高斯白噪聲。
這就是韓至淵給他的第一個考驗,一個預設的“靶子”。
或者說,一個充滿了偽裝、干擾和噪聲的“密文”。
他要做的,就是從這團亂麻中,用自己那套“帶約束的反演算法”,不差分毫地將最初的“明文”給反算出來。
林允寧沒有急著敲代碼,而是先運行了腳本,生成了一張圖。
屏幕上,出現了一條充滿了毛刺、雜亂無章的曲線。
這就是一個實驗物理學家每天都要面對的、最真實的“敵人”——被噪聲和儀器效應污染過的原始信號。
“導演,他……”
小王壓低聲音。
“他在做研究。”
劉偉的目光銳利,“別出聲,看下去。”
林允寧的眉頭,微微皺起。
他首先嘗試了自己之前處理實驗數據的那套算法:
傅里葉變換下的直接反卷積。
這在理論上是可行的,通過除以儀器響應函數的傅里葉變換,就能得到原始信號。
他很快寫好了幾十行代碼,按下運行。
不到一分鐘,結果圖彈出——屏幕上是一片徹底崩潰的雪花噪聲,狀若心電圖最后的瘋狂抽搐。
失敗了。
“嗯?”
劉偉的眉毛揚了一下,非但沒有失望,眼中反而閃過一絲更濃厚的興趣,“有意思,他碰壁了。”
對導演而言,一帆風順的神話,遠不如天才在碰壁后憑借自身力量解決難題的“故事”來得動人。
林允寧看著那張失敗的圖,臉上沒什么表情,只是指尖在桌上有節奏地敲擊著。
他立刻就找到了問題所在:
直接反卷積,在數學上等同于用一個很小(甚至趨近于零)的數去除另一個數,這個過程會將原始數據中本不明顯的噪聲無限放大,最終導致結果完全崩潰。
在信號處理領域,這是一個經典的“病態問題”(ill-posed problem)。
“呵,果然讓陳師兄說中了,想走捷徑,門兒都沒有。”
他低聲自語。
不能硬解,那就只能換個思路。
問題的核心,是信息不足。
而他手里唯一被忽略的額外信息,就是物理定律本身的約束——Kramers-Kronig關系。
他意識到,K-K關系在這里不應該被當作一個簡單的“變換工具”,而是一個必須被嚴格遵守的“物理先驗”。
他的最終答案,無論如何都必須滿足這個約束。
那么,解題的思路就從“一步到位的求解”,變成了“戴著鐐銬的尋找”。
也就是,建立一個本身就滿足K-K約束的理論模型,然后通過迭代優化的方法,去尋找一組最優的模型參數,讓這個模型產生的結果,去無限逼近那份帶噪聲的實驗數據。
這,才是解決這類反演問題的正道。
而這整個算法的核心,就是那個在模擬空間里讓他碰壁的幽靈——
希爾伯特變換。
理論上,希爾伯特變換像一個完美的數學“翻譯官”,能將光譜的實部與虛部進行精確互換。
但這個“翻譯官”有個毛病——
他必須讀完從宇宙大爆炸到熱寂的所有信息,才能開始工作。
可現實是,實驗數據永遠只是一個有限的片段。
讓一個處理無限信號的“翻譯官”,去翻譯一本殘缺不全、只有幾百個單詞的“書”,結果必然是災難性的。
這就是問題的癥結所在。
“說來說去,還是繞不過去這個坎兒啊……”
想通了這一點,林允寧將那本Rudin的《泛函分析》又拿到了面前,快速翻到關于“希爾伯特空間與算子”的章節。
他之前在《數學物理方法》里學過希爾伯特變換,但理解停留在“怎么解決物理問題”的層面。
現在,想要完善反演算法,他需要從更底層的數學結構去理解它“為什么是這樣”。
【檢測到前置知識《數學物理方法》,主體知識《泛函分析》已閱讀,知識模塊【希爾伯特變換】已收錄!】
他立刻進入模擬空間。
【注入模擬時長:500小時,指定模塊:【希爾伯特變換】】
【模擬開始…】
【第45小時,你徹底打碎了實空間積分的牢籠,躍遷至頻域上帝視角。你洞悉了希爾伯特變換的本質——它并非一種變換,而是一種對所有頻率分量進行π/2相位旋轉的宇宙法則。認知框架被徹底重構。】
【知識模塊‘希爾伯特變換’等級提升:LV.0 -> LV.1概念認知】
【第198小時,你掌握了在頻域中利用快速傅里葉變換(FFT)實現卷積運算的范式。通過構建一個sgn(ω)的符號函數,你成功繞開了實空間中那個無窮積分的陷阱。】
【知識模塊‘希爾伯特變換’等級提升:LV.1 -> LV.2范式掌握】
【警告:缺少前置知識模塊【復變函數 LV.2】,無法繼續模擬提升!】
【模擬結束。】
【模擬時長剩余:4199小時30分鐘】
林允寧睜開眼,長出了一口氣。
LV.2,足夠支撐他構建一個數值穩定的優化模型了。
下一秒,他現實中的雙手,動了。
這一次,他敲擊鍵盤的聲音不再像之前那般狂風暴雨,而是變得沉穩、精準,富有節奏感。
他沒有從頭寫起,而是引入了科學計算庫SciPy中的優化模塊least_squares。
import numpy as np
from scipy.fftpack import fft, ifft
from scipy.optimize import least_squares
“他好像想明白什么了……”
劉偉敏銳地捕捉到了這一點,“看他的氣質都不一樣了,好像胸有成竹似的。”
大導演并沒說錯,此時林允寧的思路清晰無比:
第一步,先對包含噪聲的實驗數據進行傅里葉變換。
第二步,利用K-K關系(希爾伯特變換)構建物理響應的復數模型。
第三步,將理論模型卷積上儀器響應函數。
第四步,在頻域中,將理論結果與實驗數據進行比對,計算它們的加權“卡方殘差”。
第五步,通過加權最小二乘法,不斷優化理論模型的初始參數,直到縮減卡方(χ2/自由度)≈1為止。
這是一個完美的閉環。
他定義了一個目標函數,其輸入是待求解的模型參數,輸出是理論模型與實驗數據之間的殘差。
在這個目標函數內部,K-K約束被作為模型的固有屬性嵌入其中。
然后,他將這個復雜的、非線性的優化問題,直接扔給了身經百戰的least_squares求解器。
這是一種極為現代且高效的科研思維——將物理問題精準地抽象為數學模型,然后交給最專業的工具去求解。
他寫完代碼,設置好初始參數,按下了運行鍵。
筆記本的風扇再次發出輕微的嗡鳴。
這一次,屏幕的控制臺上,一行行日志飛速滾過:
Iteration 1: Chi-squared = 152.78
Iteration 2: Chi-squared = 45.12
...
Iteration 17: Chi-squared = 0.03
Convergence reached.
代表著誤差的數值,以肉眼可見的速度,穩定地、不可阻擋地向零逼近。
這過程,不再像之前的“一蹴而就”,而更像一場精密的、步步為營的圍剿。
然后,那個繪圖窗口,再次彈了出來。
窗口里,依舊是兩條曲線。
一條黑色的“真值”,一條紅色的“反演結果”。
兩條曲線,在噪聲水平內高度一致,幾乎重合在了一起!
在主圖下方,那條代表著誤差的藍色線條,圍繞零軸隨機起伏,波動幅度與疊加的噪聲水平相當。
看著屏幕上的兩條曲線,林允寧終于露出了笑容。
一股源于智力巔峰的愉悅感,如同暖流般從脊髓深處升起,瞬間沖散了連日來的疲憊。
這種快感,比世間任何娛樂都更令人上癮。
成功了!
第一關,通過!
宋子陽在旁邊已經看傻了,他完全無法理解發生了什么,只覺得“寧神”對著電腦敲了一會兒,屏幕上就出現了他這輩子都看不懂的圖。
林允寧滿意地伸了個懶腰,截下圖,發給了韓至淵。
后排,攝影師小王的手臂已經有些發酸。
但他不敢動,生怕錯過任何一個細節。
劉偉則緩緩地吐出一口氣,他拿起自己的筆記本,劃掉了之前寫的《寒門貴子》,然后,一筆一劃地寫下了新的標題。
這一次,他沒有再改。
“小王,”
他低聲說,語氣里帶著一種發現了新大陸的篤定,“這次,我們的主題,不是天才,也不是科學。”
他看著林允寧那個在普通校服下顯得有些單薄,卻又無比沉穩的背影,緩緩說道:
“是‘一個年輕的科學家’。從現在起,我們不用費力去解釋他做了‘什么’,我們要做的,是記錄下他看待這個世界的‘方式’。”
就在這時,林允新生電腦右下角的企鵝頭像,再次閃動起來。
是韓至淵的回復。
【組長—韓至淵】:不錯。迭代收斂得很快,恭喜你過了第一個考驗。
【組長—韓至淵】:現在,試試這個。
【附件:real_data.zip】
……