int n = 5000; // 行列のサイズ
VectorDenseDouble b = new VectorDenseDouble(n); // 定数ベクトル
for (int i = 1; i <= n; ++i) b[i] = 1.0; // 値は全て 1.0
// 密な一般行列で A*x = b を解く
using (MatrixDenseGeneralDouble A = new MatrixDenseGeneralDouble(n, n))
{
for (int i = 1; i <= n; ++i)
{
A[i, i] = 2;
if (i > 1) A[i - 1, i] = -1;
if (i < n) A[i, i + 1] = -1;
}
DateTime time = DateTime.Now;
LuSolver lu = LuSolver.Create(A); // 行列 A を因子分解する。
VectorDenseDouble x = lu.Solve(b); // 因子分解の結果を用いて A*x = b を解く
Console.WriteLine("MatrixDenseGeneralDouble : " + (DateTime.Now - time));
Debug.Assert(_Mol.EQ(A * x, b)); // (A * x)==b を確認
lu.Dispose(); // lu は A と同サイズの因子分解結果行列を保持するので、積極的に破棄する。
}
// 疎な一般行列で A*x = b を解く
using (MatrixSparseGeneralDouble A = new MatrixSparseGeneralDouble(n,n))
{
for (int i = 1; i <= n; ++i)
{
A[i, i] = 2;
if (i > 1) A[i - 1, i] = -1;
if (i < n) A[i, i + 1] = -1;
}
DateTime time = DateTime.Now;
LuSolver lu = LuSolver.Create(A);
VectorDenseDouble x = lu.Solve(b);
Console.WriteLine("MatrixSparseGeneralDouble: " + (DateTime.Now - time));
Debug.Assert(_Mol.EQ(A * x, b));
lu.Dispose();
}
// 帯行列(3重対角行列)で A*x = b を解く
using (MatrixDenseBandDouble A = new MatrixDenseBandDouble(n, n, 1, 1))
{
for (int i = 1; i <= n; ++i)
{ // 対角要素(を含む)の上下1要素(3重対角要素)以外に値を設定しようとするとエラー。
// 3重対角要素以外の要素を参照すると、値ゼロが返ります。
A[i, i] = 2;
if (i > 1) A[i - 1, i] = -1;
if (i < n) A[i, i + 1] = -1;
}
DateTime time = DateTime.Now;
LuSolver lu = LuSolver.Create(A);
VectorDenseDouble x = lu.Solve(b);
Console.WriteLine("MatrixDenseBandDouble : " + (DateTime.Now - time));
Debug.Assert(_Mol.EQ(A * x, b));
lu.Dispose();
}