优化Mathematica中的内循环计算

时间:2010-07-14 14:39:02

标签: optimization math physics wolfram-mathematica

我目前正在Mathematica中进行一些与量子力学相关的计算。当我们从1D变为2D点阵模型时,问题规模变得有问题

目前,我们的总结看起来像这样:

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网格上的discete点。这里唯一的非离散的是我们的r。

1 个答案:

答案 0 :(得分: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}]
== Re@Sum[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仅取决于其中一个新参数(例如r,{{ 1}}),你也会将phi积分减少到一个维度,尽管它可能不是一个简单的傅立叶变换。