我正在寻找解决以下问题的最快方法:
在3D网格中给定一定量的格点,一些点b_i
(边界)满足f(b_i)=0
,而另一个点a_0
满足f(a_0)= 1
。
所有其他点(非边界)是周围26点的线性组合。例如,我可能想要
f(i, j, k)= .05*f(i+1, j, k)+.1*f(i, j+1, k)+.07*f(i, j, k+1)+...
系数.05+.1+.07+...
的总和将加起来为1
。我的目标是为卷中的所有f(x_i)
求解x_i
。
目前,我正在使用连续过度放松(SOR)方法,该方法基本上初始化体积的边界,为每个点分配26个周围点的加权平均值,并重复。 SOR方法在最近的迭代之后只需要f(x_i)
和之前的迭代之后的f(x_i)
。
我想知道是否有人知道任何更快的方法来解决大小为102x102x48的3D网格问题。 SOR目前需要大约500-1000次迭代才能收敛到我想要的水平(根据使用的系数而变化)。我最愿意使用matlab,idl和c ++。有没有人知道SOR与将问题转换为线性系统和使用矩阵方法(如BCGSTAB)相比有多快?此外,哪种方法最有效(和容易)并行化?我可以访问250核心集群,并且一直试图使用mpi和c ++使SOR方法并行,但是没有看到我想要的速度增加(理想情况下将是100倍)。关于加快解决这个问题的方法,我将非常感谢。谢谢。
答案 0 :(得分:3)
如果您对多线程感到满意,那么使用红黑方案进行SOR可以获得不错的加速。对于2D问题,想象一下棋盘 - 红色方块仅取决于黑色方块(可能还有自己),因此您可以并行更新所有红色方块,然后重复所有黑色方块。请注意,此 收敛速度比简单排序慢,但它允许您将工作分散到多个线程上。
共轭梯度法通常比SOR收敛得更快(如果我没记错的话,约为一个数量级)。我从未使用BCGSTAB,但我记得GMRES在非对称问题上运作良好,并且它们可能都可以从预处理中受益。
对于并行化的机会,大多数CG类型方法只需要您计算矩阵向量乘积A*x
,因此您永远不需要形成完整矩阵。这可能是每次迭代的最大成本,因此您应该考虑多线程。
有两个很好的参考资料是Golub and Van Loan和Trefethen and Bau。后者更易读恕我直言。
希望有帮助...
答案 1 :(得分:2)
我(我认为)是一个确切的解决方案,但是,它可能很长。主要的问题是计算一个非常大的(希望是稀疏的)矩阵。
假设您的音量有N
分。我们打电话给p1...pN
这些点。您要找的是f(p1)...f(pN)
我们来点pi
。它有26个邻居。我们称他们为pi-1...pi-26
。我想你可以访问每个点pi
到线性组合的系数。我们称之为ci-1...ci-j...ci-26
(“点pi
的线性组合系数为其第j个邻居”
让我们做得更好,您可以认为pi
是空间中所有点的线性组合,除了大多数(26除外)等于0。你有系数ci-1...ci-N
。
您现在可以构建这些N*N
系数的大矩阵ci-j
:
+--------------------- -------+
| 0 | c1-2 | c1-3 | ... | c1-N | |f(p1)| |f(p1)|
+--------------------- -------+ | | | |
| c2_1| 0 | c2-3 | ... | c1-N | |f(p2)| |f(p2)|
+--------------------- -------+ * . . = . .
| | . . . .
. . . . . .
+--------------------- -------+ . . . .
| cN-1| cN-2 | cN-3 | ... | 0 | |f(pN)| |f(pN)|
+--------------------- -------+
惊人! 您正在寻找的解决方案是与特征值1对应的特征向量之一!
使用优化的矩阵库来有效地计算特征向量(对于稀疏矩阵)并希望它已经并行化了!
编辑:很有趣,我只是重读了你的帖子,似乎我刚给你你的BCGSTAB解决方案......对不起! ^^
重新编辑:事实上,我不确定,你在谈论“Biconjugate Gradient Stabilized Method”吗?因为如果你正在做梯度下降,我没有看到你所谈论的线性方法......
重新编辑:我喜欢数学=)我甚至可以证明,条件sum of the ci = 1
1实际上是一个特征值。我不知道相应空间的尺寸,但它至少是1!