optimization - 在 Mathematica 中优化内循环计算

标签 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 的总和。

如果不是因为我们针对 r1 的 125 个值和 r2 的 125 个值进行迭代以创建 125 x 125 图像这一事实,这通常对于 L = 8 来说并不算太糟糕。

我的问题是:如何在 Mathematica 中最有效地计算它?我会用另一种语言来做,但是如果我用 C++ 之类的语言尝试它,某些问题会使它变得同样慢。

额外信息:这是 ND-ND(数密度)相关性计算。所有的 x 和 y 都是指离散二维网格上的离散点。这里唯一非离散的是我们的 r。

最佳答案

用余弦变换交换傅里叶变换似乎是错误的优化时间,因为它隐藏了这个相关计算实际上只是两个傅里叶变换的乘积这一事实(这是我计算相关性的唯一有效方法知道)。
使用 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,phi),您还将把 corr1 积分缩减为一维,尽管它可能不是简单的傅里叶变换。

关于optimization - 在 Mathematica 中优化内循环计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247234/

相关文章:

ios - 如何将 VoiceOver 辅助功能添加到应用程序的图标角标(Badge)编号?

c - 2n 缩放整数的 16 位加法

matlab - matlab中的螺旋网格

c# - 在 C# 中以科学记数法显示 IEEE-754 四精度 (binary128) 浮点值

math - 板球物理,基本模拟

javascript - 需要让球按照击球的 Angular 行进

python - os.walk 很慢,有什么办法可以优化吗?

algorithm - 计算一组结果概率的有效方法?

algorithm - 如何有效地计算奇怪的数字

math - 这是什么类型的数学 : a -> b -> c