public void CholeskySolver_SolveWhenFactorIsNull_ThrowsArgumentNullException() { var right = new Vector(3); var solver = new CholeskySolver(); Assert.Throws <ArgumentNullException>(() => solver.Solve(null, right)); }
public void TestCholeskySolver() { IVector x = new SparseVector(new double[] { 2, 4, 1 }); IVector b = A.Multiply(x); IVector x_pi = CholeskySolver.Solve(A, b); Assert.Equal(x, x_pi); }
public void CholeskySolver_SolveWhenRightIsNull_ThrowsArgumentNullException() { var matrix = new Matrix(3, 3, new double[, ] { { 81, -45, 45 }, { -45, 50, 5 }, { 45, -15, 38 } }); var solver = new CholeskySolver(); Assert.Throws <ArgumentNullException>(() => solver.Solve(matrix, null)); }
public void CholeskySolver_SolveWhenFactorAndRightHaveDifferentSize_ThrowsArgumentNullException() { var matrix = new Matrix(3, 3, new double[, ] { { 81, -45, 45 }, { -45, 50, 5 }, { 45, -15, 38 } }); var right = new Vector(2); var solver = new CholeskySolver(); Assert.Throws <ArgumentException>(() => solver.Solve(matrix, right)); }
public void CholeskySolver_SolveWhenFactorIsNotSquare_ThrowsNonSymmetricMatrixException() { var matrix = new Matrix(3, 3, new double[, ] { { 81, -45, 45 }, { -45, 50, 5 }, { 45, -15, 38 } }); var right = new Vector(3, new double[] { 531, -460, 193 }); var solver = new CholeskySolver(); Assert.Throws <NonSymmetricMatrixException>(() => solver.Solve(matrix, right)); }
public void CholeskySolver_Solve_ReturnsResultAsExpected() { var matrix = new Matrix(3, 3, new double[, ] { { 81, -45, 45 }, { -45, 50, -15 }, { 45, -15, 38 } }); var right = new Vector(3, new double[] { 531, -460, 193 }); var expected = Vector.From(new double[] { 6, -5, -4 }); var solver = new CholeskySolver(); var x = solver.Solve(matrix, right); Assert.AreEqual(expected, x); }
public void TestMatrixInverse() { IMatrix Ainv = CholeskySolver.Invert(A); IMatrix Ipi = A.Multiply(Ainv); Assert.Equal(A.Identity(3), Ipi); Ipi = Ainv.Multiply(A); //for (int row = 0; row < 2; ++row) //{ // Console.WriteLine(Ipi[row]); //} Assert.Equal(A.Identity(3), Ipi); }
private ISolver CreateSolver(CCS a) { ISolver buf; switch (parent.LastResult.SolverType) { case BuiltInSolverType.CholeskyDecomposition: buf = new CholeskySolver(a); break; case BuiltInSolverType.ConjugateGradient: buf = new PCG(new SSOR()); buf.A = a; break; default: throw new NotImplementedException(); } return(buf); }
public void Test_Solve2Dimension() { /* * Созданная матрица: * * 1 0 0 2 2 2 * 0 1 1 -2 -2 -2 * 0 1 0 -8 -8 -8 * * 2 -2 -8 3 3 3 * 2 -2 -8 3 0 3 * 2 -2 -8 3 3 6 * * Правая часть: * 1 2 1 * -8 -8 -8 * * Ожидаемый результат: * решение: * 1 1 1 * 0 0 0 * */ int dimension = 2; SymmetricMatrix <MatrixDimension3> sourceMatrix = new SymmetricMatrix <MatrixDimension3>(dimension, new MatrixDimension3()); MatrixDimension3 globalPart00 = new MatrixDimension3(); globalPart00[0, 0] = 1; globalPart00[0, 1] = 0; globalPart00[1, 0] = globalPart00[0, 1]; globalPart00[0, 2] = 0; globalPart00[2, 0] = globalPart00[0, 2]; globalPart00[1, 1] = 1; globalPart00[1, 2] = 1; globalPart00[2, 1] = globalPart00[1, 2]; globalPart00[2, 2] = 0; MatrixDimension3 globalPart01 = new MatrixDimension3(); globalPart01[0, 0] = 2; globalPart01[0, 1] = 2; globalPart01[1, 0] = -2; globalPart01[0, 2] = 2; globalPart01[2, 0] = -8; globalPart01[1, 1] = -2; globalPart01[1, 2] = -2; globalPart01[2, 1] = -8; globalPart01[2, 2] = -8; MatrixDimension3 globalPart11 = new MatrixDimension3(); globalPart11[0, 0] = 3; globalPart11[0, 1] = 3; globalPart11[1, 0] = globalPart11[0, 1]; globalPart11[0, 2] = 3; globalPart11[2, 0] = globalPart11[0, 2]; globalPart11[1, 1] = 0; globalPart11[1, 2] = 3; globalPart11[2, 1] = globalPart11[1, 2]; globalPart11[2, 2] = 0; sourceMatrix[0, 0] = globalPart00; sourceMatrix[0, 1] = globalPart01; sourceMatrix[1, 1] = globalPart11; List <Vector3D> rightPart = new List <Vector3D>(); Vector3D part1 = new Vector3D(1, 2, 1); Vector3D part2 = new Vector3D(-8, -8, -8); rightPart.Insert(0, part1); rightPart.Insert(1, part2); CholeskySolver solver = new CholeskySolver(); SymmetricMatrix <DoubleContainerElement> BMatrix = new SymmetricMatrix <DoubleContainerElement>(2 * 3, new DoubleContainerElement()); SymmetricMatrix <DoubleContainerElement> CMatrix = new SymmetricMatrix <DoubleContainerElement>(2 * 3, new DoubleContainerElement()); IList <Vector3D> solution = solver.solve(SymmetricMatrix <DoubleContainerElement> .extractMatrix(sourceMatrix), rightPart); //Ожидаемый результат List <Vector3D> expectVector = new List <Vector3D>(); Vector3D part3 = new Vector3D(1, 1, 1); Vector3D part4 = new Vector3D(0, 0, 0); expectVector.Insert(0, part3); expectVector.Insert(1, part4); //Проверка foreach (Vector3D vector in solution) { Console.Write(vector.ToString() + " "); } Console.WriteLine(); foreach (Vector3D vector in expectVector) { Console.Write(vector.ToString() + " "); } Console.WriteLine(); }
//For debugging purpose only //[TestMethod] public void Test_CreateBCMatrix() { /* * Созданная матрица: * * 1 0 0 2 2 2 * 0 1 1 -2 -2 -2 * 0 1 0 -8 -8 -8 * 2 -2 -8 3 3 3 * 2 -2 -8 3 0 3 * 2 -2 -8 3 3 6 * */ int dimension = 6; SymmetricMatrix <DoubleContainerElement> sourceMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement()); sourceMatrix[0, 0] = new DoubleContainerElement(1); sourceMatrix[0, 1] = new DoubleContainerElement(0); sourceMatrix[0, 2] = new DoubleContainerElement(0); sourceMatrix[0, 3] = new DoubleContainerElement(2); sourceMatrix[0, 4] = new DoubleContainerElement(2); sourceMatrix[0, 5] = new DoubleContainerElement(2); sourceMatrix[1, 1] = new DoubleContainerElement(1); sourceMatrix[1, 2] = new DoubleContainerElement(1); sourceMatrix[1, 3] = new DoubleContainerElement(-2); sourceMatrix[1, 4] = new DoubleContainerElement(-2); sourceMatrix[1, 5] = new DoubleContainerElement(-2); sourceMatrix[2, 2] = new DoubleContainerElement(0); sourceMatrix[2, 3] = new DoubleContainerElement(-8); sourceMatrix[2, 4] = new DoubleContainerElement(-8); sourceMatrix[2, 5] = new DoubleContainerElement(-8); sourceMatrix[3, 3] = new DoubleContainerElement(3); sourceMatrix[3, 4] = new DoubleContainerElement(3); sourceMatrix[3, 5] = new DoubleContainerElement(3); sourceMatrix[4, 4] = new DoubleContainerElement(0); sourceMatrix[4, 5] = new DoubleContainerElement(3); sourceMatrix[5, 5] = new DoubleContainerElement(0); SymmetricMatrix <DoubleContainerElement> BMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement()); SymmetricMatrix <DoubleContainerElement> CMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement()); CholeskySolver solver = new CholeskySolver(); //solver.createBCMatrix(BMatrix, CMatrix, sourceMatrix); // Ожидаемый результат: SymmetricMatrix <DoubleContainerElement> expBMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement()); SymmetricMatrix <DoubleContainerElement> expCMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement()); //Матрица B expBMatrix[0, 0] = new DoubleContainerElement(1); expBMatrix[1, 0] = new DoubleContainerElement(0); expBMatrix[2, 0] = new DoubleContainerElement(0); expBMatrix[3, 0] = new DoubleContainerElement(2); expBMatrix[4, 0] = new DoubleContainerElement(2); expBMatrix[5, 0] = new DoubleContainerElement(2); expBMatrix[1, 1] = new DoubleContainerElement(1); expBMatrix[2, 1] = new DoubleContainerElement(1); expBMatrix[3, 1] = new DoubleContainerElement(-2); expBMatrix[4, 1] = new DoubleContainerElement(-2); expBMatrix[5, 1] = new DoubleContainerElement(-2); expBMatrix[2, 2] = new DoubleContainerElement(-1); expBMatrix[3, 2] = new DoubleContainerElement(-6); expBMatrix[4, 2] = new DoubleContainerElement(-6); expBMatrix[5, 2] = new DoubleContainerElement(-6); expBMatrix[3, 3] = new DoubleContainerElement(31); expBMatrix[4, 3] = new DoubleContainerElement(31); expBMatrix[5, 3] = new DoubleContainerElement(31); expBMatrix[4, 4] = new DoubleContainerElement(-3); expBMatrix[5, 4] = new DoubleContainerElement(0); expBMatrix[5, 5] = new DoubleContainerElement(-3); //Матрица C expCMatrix[0, 0] = new DoubleContainerElement(1); expCMatrix[0, 1] = new DoubleContainerElement(0); expCMatrix[0, 2] = new DoubleContainerElement(0); expCMatrix[0, 3] = new DoubleContainerElement(2); expCMatrix[0, 4] = new DoubleContainerElement(2); expCMatrix[0, 5] = new DoubleContainerElement(2); expCMatrix[1, 1] = new DoubleContainerElement(1); expCMatrix[1, 2] = new DoubleContainerElement(1); expCMatrix[1, 3] = new DoubleContainerElement(-2); expCMatrix[1, 4] = new DoubleContainerElement(-2); expCMatrix[1, 5] = new DoubleContainerElement(-2); expCMatrix[2, 2] = new DoubleContainerElement(1); expCMatrix[2, 3] = new DoubleContainerElement(6); expCMatrix[2, 4] = new DoubleContainerElement(6); expCMatrix[2, 5] = new DoubleContainerElement(6); expCMatrix[3, 3] = new DoubleContainerElement(1); expCMatrix[3, 4] = new DoubleContainerElement(1); expCMatrix[3, 5] = new DoubleContainerElement(1); expCMatrix[4, 4] = new DoubleContainerElement(1); expCMatrix[4, 5] = new DoubleContainerElement(0); expCMatrix[5, 5] = new DoubleContainerElement(1); // Проверка //Assert.IsTrue(expCMatrix.Equals(CMatrix), "All is bad"); Assert.IsTrue(expBMatrix.Equals(BMatrix), "All is bad"); Assert.IsTrue(expCMatrix.Equals(CMatrix), "All is bad"); }
public static async Task Main(string[] args) { MatrixProvider provider = new MatrixProvider(ImagePath); ResultsSaver saver = new ResultsSaver(); IEquationSolver sequentialSolver = new EquationSolver(); IEquationSolver parallelSolver = new ParallelEquationSolver(); IEquationSolver choleskySolver = new CholeskySolver(); IEquationSolver parallelCholeskySolver = new ParallelCholeskySolver(); IEquationSolver diagonalSolver = new DiagonalSolver(); IEquationSolver parallelDiagonalSolver = new ParallelDiagonalSolver(); IEquationSolver jacobiSolver = new JacobiSolver(); IEquationSolver parallelJacobiSolver = new ParallelJacobiSolver(); int[] sizes = { 10, 100, 500 }; sequentialSolver.Solve(GetTestMatrix()); // Console.WriteLine("Sequential Cramer:"); // await PerformTesting(sizes, provider, saver, sequentialSolver); // // Console.WriteLine(); // Console.WriteLine("Parallel Cramer:"); // await PerformTesting(sizes, provider, saver, parallelSolver); // Console.WriteLine(); // Console.WriteLine("Sequential Cholesky:"); // choleskySolver.Solve(GetCholeskyTestMatrix()); // await PerformTesting(sizes, provider, saver, choleskySolver); // // Console.WriteLine(); // Console.WriteLine("Parallel Cholesky:"); // parallelSolver.Solve(GetCholeskyTestMatrix()); // await PerformTesting(sizes, provider, saver, parallelCholeskySolver); // // Console.WriteLine(); // Console.WriteLine("Sequential K-Diagonal:"); // diagonalSolver.Solve(GetDiagonalTestMatrix()); // await PerformTesting(sizes, provider, saver, diagonalSolver); // // Console.WriteLine(); // Console.WriteLine("Parallel K-Diagonal:"); // parallelDiagonalSolver.Solve(GetDiagonalTestMatrix2()); // await PerformTesting(sizes, provider, saver, parallelDiagonalSolver); Console.WriteLine(); Console.WriteLine("Sequential Jacobi on common matrix:"); jacobiSolver.Solve(GetDiagonalTestMatrix2()); await PerformTesting(sizes, provider, saver, jacobiSolver); Console.WriteLine(); Console.WriteLine("Sequential Jacobi on chess matrix:"); jacobiSolver.Solve(GetDiagonalTestMatrix2()); await PerformTesting(sizes, provider, saver, jacobiSolver, matrix => matrix.ToChessZero()); Console.WriteLine(); Console.WriteLine("Parallel Jacobi on common matrix:"); parallelJacobiSolver.Solve(GetDiagonalTestMatrix2()); await PerformTesting(sizes, provider, saver, parallelJacobiSolver); Console.WriteLine(); Console.WriteLine("Parallel Jacobi on chess matrix:"); parallelJacobiSolver.Solve(GetDiagonalTestMatrix2()); await PerformTesting(sizes, provider, saver, parallelJacobiSolver, matrix => matrix.ToChessZero()); }