2010-07-14 234 views
3

我目前正在Mathematica中進行一些與量子力學相關的計算。正如我們從一維到二維晶格模型移動,問題大小成爲問題在Mathematica中優化內循環計算

目前,我們有一個總結,看起來是這樣的:

corr[r1_, r2_, i_, j_] = Sum[Cos[f[x1, x2] Angle[i] r1 + f[y1, y2] Angle[j] r2], {x1, HL}, {x2, HL}, {y1, HL + 1, 2 HL}, {y2, HL + 1, 2 HL}]; 

F [。 ,]是預先計算的相關函數的查找函數,並且也預先計算Angle [。]。

根本沒有辦法以任何方式進一步簡化。我們已經通過將復指數(具有零虛部)轉換爲上面的餘弦表達式進行了簡單的優化。

最大的問題是那些HL的尺寸是基於尺寸的:對於沿軸線的線性尺寸L,HL對應於L^d(這裏d = 2)。所以我們的計算在現實中是O(n^8),忽略了對i,j的求和。

對於L = 8,這通常不會太壞,如果它不是因爲我們對r1的125個值和r2的125個迭代來創建125 x 125圖像的事實。

我的問題是:如何在Mathematica中最有效地計算這個值?我會用另一種語言來做到這一點,但是有一些問題會使得它像C++一樣嘗試時會變得很慢。

附加信息:這是一個ND-ND(數字密度)相關性計算。所有的x和y都是指離散的2D網格上的分散點。這裏唯一不離散的東西就是我們的r。

+0

你只是試圖計算一個相關性?在我看來,你需要找到一個體面,流行,經過充分測試的庫(不一定是Mathematica),你可以從你的代碼中調用。至於切換語言 - 不要跳轉到C++,請切換到Python + SciPy。 http://www.scipy.org/Cookbook/SchrodingerFDTD – 2010-07-14 15:26:40

+0

HL是否從一個圖像變爲另一個圖像? – 2010-07-14 15:48:47

+0

具有數字定義的'f'和'Angle'函數是符號的嗎?用數字方式做事可以產生巨大的影響。 OTOH,考慮到你的問題的大小,可能是你遇到了麻煩。我們在這裏討論〜10^17的操作。 – Pillsy 2010-07-14 16:20:15

回答

5

看來,傅立葉變換與餘弦變換交換是錯誤的時間來優化,因爲它隱藏了事實,即這種相關性計算實際上只是兩個傅立葉變換的產物(這是計算相關性的唯一有效方法我知道)。
隨着ir1=Angle[i] r1ir2=Angle[j] r2你的表情相當於

Sum[Cos[f[x1, x2] ir1 + f[y1, y2] ir2], {x1, HL}, {x2, HL}, {y1, HL+1, 2 HL}, {y2, HL+1, 2 HL}] 
== [email protected][Exp[I f[x1, x2] ir1] Exp[I f[y1, y2] ir2], {x1, HL}, {x2, HL},{y1, HL+1, 2 HL}, {y2, HL+1, 2 HL}] 
== Re[corr1[ir1] corr2[ir2]] 

其中

corr1[ir_]:=Sum[Exp[I f[x1, x2] ir], {x1, HL}, {x2, HL}]; 
corr2[ir_]:=Sum[Exp[I f[y1, y2] ir], {y1, HL+1, 2 HL}, {y2, HL+1, 2 HL}]; 

正如我已經砍你的標度指數的一半,我希望你是快樂:),但是如果f是真實的值得注意的是,您可以削減指數中兩個指數的另一個因子:
在這種情況下,我們可以將corr1表示爲f的整數 - 假設您可以以某種方式獲得權重函數w。如果沒有別的,你可以通過一個簡單的分箱程序來進行數字化處理。

corr1v2[ir_]:=Sum[ w[fval] Exp[I fval ir], {fval,fvals}], 

這清楚地表明,corr1其實只是傅立葉變換的f權函數(所以你應該與FFT計算它,而不是上面的總和)。 corr2也一樣。
或者,如果f不實值,但有足夠的對稱性,使您可以在表單中重新參數所以f只依賴於新的參數之一(比方說,rphi),您也將削減corr1積分來一個維度,儘管它可能不是一個簡單的傅里葉變換。

+0

感謝Janus的幫助。我們正在計算的確切東西看起來像這樣,從數學上講: Sum [w [x,r]共軛[w [x',r]] w [y,r']共軛[w [y',r ']] ] 其中w [x,r]是粒子的波函數。在我們的例子中,w [x,r]碰巧具有複雜指數的很好形式。我會嘗試你推薦的。 – 2010-07-16 15:35:54

+0

我剛剛意識到我犯了一個巨大的錯誤。我修改了我的原始問題以獲得正確的總和索引。我的y正在總結錯誤的範圍。 – 2010-07-16 15:41:25

+0

我更新了匹配的答案 - 這個想法是一樣的。我無法立即將您的第一條評論與該問題相匹配,因此請考慮未讀,但我在上面添加了對'f'的進一步評論,可能有用。 – Janus 2010-07-19 01:51:33