我遇到了以下线性求解器的实现,它用于实现 Jos Stam 的稳定流体方法:
/**
* Iterative linear system solver using the Gauss-sidel
* relaxation technique. Room for much improvement here...
**/
void linearSolver(int b, float[] x, float[] x0, float a, float c)
{
for (int k = 0; k < 20; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
x[I(i, j)] = (a * ( x[I(i-1, j)] + x[I(i+1, j)]
+ x[I(i, j-1)] + x[I(i, j+1)])
+ x0[I(i, j)]) / c;
}
}
setBoundry(b, x);
}
}
(来自http://www.multires.caltech.edu/teaching/demos/java/FluidSolver.java的实现)
我已经能够收集x
和x0
是矩阵,其中I
只是一个简单的数组索引函数,并且b
只是一个要设置边界条件的标志。
但我不确定这段代码到底在做什么。我认为线性求解器通常会尝试x
计算Ax = b
. 但是这段代码中似乎没有任何向量,只有矩阵。
有谁知道这段代码是如何工作的?我试图通过预处理共轭梯度的方法使其更有效。但我不明白这里的参考实现。