プロジェクションなしで Gaus Seidel を実装しました。射影されたガウス ザイデルの場合、解を下限と上限内に射影 (またはクランプ) する必要があります。
public static double[] Solve (double[,] matrix, double[] right,
double relaxation, int iterations,
double[] lo, double[] hi)
{
// Validation omitted
var x = right;
double delta;
// Gauss-Seidel with Successive OverRelaxation Solver
for (int k = 0; k < iterations; ++k) {
for (int i = 0; i < right.Length; ++i) {
delta = 0.0f;
for (int j = 0; j < i; ++j)
delta += matrix [i, j] * x [j];
for (int j = i + 1; j < right.Length; ++j)
delta += matrix [i, j] * x [j];
delta = (right [i] - delta) / matrix [i, i];
x [i] += relaxation * (delta - x [i]);
// Project the solution within the lower and higher limits
if (x[i]<lo[i])
x[i]=lo[i];
if (x[i]>hi[i])
x[i]=hi[i];
}
}
return x;
}
軽微な修正です。Bullet Physics Library から A 行列と b ベクトルを抽出し、射影された Gauss Seidel を使用してそれを解く方法を示す要点は次のとおりです: https://gist.github.com/erwincoumans/6666160