Mik*_*ley 3 math optimization 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}];
Run Code Online (Sandbox Code Playgroud)
F[.,.]是预先计算的相关函数的查找函数,并且Angle [.]也是预先计算的.
完全没有办法以任何方式进一步简化这一点.我们已经通过将复指数(具有零虚部)转换为上面的余弦表达式来进行简单优化.
最大的问题是那些HL是基于尺寸大小的:对于沿轴的线性尺寸L,HL对应于L ^ d(这里d = 2).所以我们的计算实际上是O(n ^ 8),而忽略了i,j的和.
对于L = 8,这通常不是太糟糕,如果不是因为我们对r1的125个值进行迭代,而对r2的125进行迭代以创建125×125的图像.
我的问题是:如何在Mathematica中最有效地计算出来?我会用另一种语言来做这件事,但是如果我在像C++这样的东西中尝试它会有一些问题会使它变得那么慢.
额外信息:这是ND-ND(数字密度)相关计算.所有x和y都指的是离散2D网格上的discete点.这里唯一不分散的东西是我们的r.
似乎用余弦变换交换傅里叶变换是错误的优化时间,因为它隐藏了这种相关计算实际上只是两个傅里叶变换的乘积这一事实(这是计算我所知的相关性的唯一有效方法) .
用ir1=Angle[i] r1和ir2=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]]
Run Code Online (Sandbox Code Playgroud)
哪里
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}];
Run Code Online (Sandbox Code Playgroud)
由于我已经将你的缩放指数减半,我希望你很高兴:),但如果f是实数值,你可以减少指数的另一个因子:
在这种情况下,我们可以表示corr1为值的整数的f-因为你可以某种方式得到的权重函数w.如果不出意外,您可以使用简单的分箱程序以数字方式完成此操作.
corr1v2[ir_]:=Sum[ w[fval] Exp[I fval ir], {fval,fvals}],
Run Code Online (Sandbox Code Playgroud)
这清楚地表明corr1它实际上只是权重函数的傅里叶变换f(所以你应该用FFT而不是上面的总和来计算它).同样如此corr2.
或者,如果f不是实值但具有足够的对称性以允许您在表单中重新参数化,因此f仅取决于其中一个新参数(例如r,phi),您还可以将corr1积分减少到一个维度,尽管它可能不会是一个简单的傅里叶变换.
| 归档时间: |
|
| 查看次数: |
441 次 |
| 最近记录: |