【问题标题】:Optimizing an inner loop calculation in Mathematica在 Mathematica 中优化内循环计算
【发布时间】:2010-07-14 14:39:01
【问题描述】:

我目前正在 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。

【问题讨论】:

  • 您只是想计算相关性吗?在我看来,您需要找到一个可以从代码中调用的体面、流行、经过良好测试的库(不一定是 Mathematica 库)。至于切换语言 - 不要跳到 C++,切换到 Python + SciPy。 scipy.org/Cookbook/SchrodingerFDTD
  • HL 是否从一个图像更改为另一个图像?
  • fAngle 函数是否具有数字定义,或者它们是否是符号?以数字方式做事可以产生巨大的影响。 OTOH,鉴于您的问题的规模,您可能只是遇到了麻烦。我们在这里讨论 ~10^17 次操作。
  • 使用蒙特卡洛积分方案不是更好吗?他们是为这类问题而生的......
  • @Hamish,是的,这是一个 ND-ND 相关计算。与 Mathematica 相比,Python + SciPy 处理这个问题的能力如何? @belisarius:没有 HL 不会改变,这仅适用于单个图像。 @Pillsy、f 和 A​​ngle 实际上是预计算值的查找函数。对于这个问题,这就是我们计算相关性的方式。我不相信蒙特卡洛会很适合这个。

标签: optimization math physics wolfram-mathematica


【解决方案1】:

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

【讨论】:

  • 感谢 Janus 的帮助。从数学上讲,我们正在计算的确切内容如下所示: Sum[w[x, r] Conjugate[w[x', r]] w[y, r'] Conjugate[w[y', r'] ] ] 其中 w[x, r] 是粒子的波函数。在我们的例子中,w[x, r] 恰好有一个很好的复指数形式。不过我会试试你推荐的。
  • 我刚刚意识到我犯了一个巨大的错误。我修改了我原来的问题以获得正确的总和指数。我的 y 在错误的范围内求和。
  • 我更新了答案以匹配 - 想法是一样的。我无法立即将您的第一条评论与问题相匹配,因此请考虑未读,但我在上面的 f 添加了一条可能有用的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 2019-09-27
  • 2017-06-04
相关资源
最近更新 更多