Ejemplo n.º 1
0
 public SQP(
     double precision,
     bool earlyExit)
 {
     numericalDerivative   = new OptimizationNumericalDerivative(5, 3);
     linearSolver          = new MINRES(1E-50, false);
     strongWolfeLineSearch = new StrongWolfeLineSearch();
     Precision             = precision;
     EarlyExit             = earlyExit;
 }
Ejemplo n.º 2
0
        static void TestCGMethod()
        {
            MINRES   minres = new MINRES();
            CGMethod cg     = new CGMethod();

            OptVector[] A2 = new OptVector[3];
            A2[0] = new OptVector(new double[] { 2, 1, 3 });
            A2[1] = new OptVector(new double[] { 2, 6, 8 });
            A2[2] = new OptVector(new double[] { 6, 8, 18 });

            OptVector b2 = new OptVector(new double[] { 1, 3, 5 });

            var minresSol = minres.Solve(A2, b2, new OptVector(new double[3]), 50);
            var sol2      = cg.Solve(A2, b2, new OptVector(new double[3]), 50);

            OptVector[] A = new OptVector[3];
            A[0] = new OptVector(new double[] { 2, 0, 1 });
            A[1] = new OptVector(new double[] { 1, 6, 0 });
            A[2] = new OptVector(new double[] { 3, 2, 3 });

            OptVector x = new OptVector(new double[] { 2, 5, 7 });

            var sol  = cg.Solve(A, x, new OptVector(new double[3]), 50);
            var solm = minres.Solve(A, x, new OptVector(new double[3]), 50);

            OptVector[] A1 = new OptVector[3];
            A1[0] = new OptVector(new double[] { 3, 1, -6 });
            A1[1] = new OptVector(new double[] { 2, 1, -5 });
            A1[2] = new OptVector(new double[] { 6, -3, 3 });

            OptVector b1 = new OptVector(new double[] { -10, -8, 0 });

            var sol1  = cg.Solve(A1, b1, new OptVector(new double[3]), 200);
            var solm1 = minres.Solve(A1, b1, new OptVector(new double[3]), 200);

            OptVector diff  = b1 - OptVector.Mult(A1, solm1);
            OptVector diff1 = b1 - OptVector.Mult(A1, sol1);
        }
Ejemplo n.º 3
0
        private static void TestGmres()
        {
            var luSolver = new LUSolver();

            var solver = new MINRES();
            var cg     = new ConjugateGradient();

            SparseMatrix A = new SparseMatrix(6, 6);

            A.Rows[0] = SparseVector.GetSparseElement(new double[] { 10.0, 0.0, 0.0, 0.0, 0.0, 0.0 });
            A.Rows[1] = SparseVector.GetSparseElement(new double[] { 0.0, 10.0, -3.0, -1.0, 0.0, 0.0 });
            A.Rows[2] = SparseVector.GetSparseElement(new double[] { 0.0, 0.0, 15.0, 0.0, 0.0, 0.0 });
            A.Rows[3] = SparseVector.GetSparseElement(new double[] { -2.0, 0.0, 0.0, 10.0, -1.0, 0.0 });
            A.Rows[4] = SparseVector.GetSparseElement(new double[] { -1.0, 0.0, 0.0, -5.0, 1.0, -3.0 });
            A.Rows[5] = SparseVector.GetSparseElement(new double[] { -1.0, -2.0, 0.0, 0.0, 0.0, 6.0 });

            double[] b = new double[] { 10.0, 7.0, 45.0, 33.0, -34.0, 31.0 };
            double[] x = new double[b.Length];

            for (int i = 0; i < x.Length; i++)
            {
                x[i] = 0.0;
            }

            //symmetrize system
            SparseMatrix At = SparseMatrix.Transpose(A);
            //SparseMatrix AA = SparseMatrix.Square(At);
            SparseMatrix AA = SparseMatrix.Multiply(At, A);

            double[] Ab = SparseMatrix.Multiply(At, b);

            var cgout = solver.Solve(AA, Ab, x, 10);
            var out1  = solver.Solve(AA, Ab, x, 30000);

            var solver1 = new GMRES();

            var out2 = solver1.Solve(A, b, x, 30, 6);
            //var lout = luSolver.Solve(A, b, out bool valid);

            HouseholderQR hs = new HouseholderQR();

            SparseMatrix B = new SparseMatrix(5, 3);

            B.Rows[0] = SparseVector.GetSparseElement(new double[] { 12.0, -51.0, 4.0 });
            B.Rows[1] = SparseVector.GetSparseElement(new double[] { 6.0, 167.0, -68.0 });
            B.Rows[2] = SparseVector.GetSparseElement(new double[] { -4.0, 24.0, -41.0 });
            B.Rows[3] = SparseVector.GetSparseElement(new double[] { -1.0, 1.0, 0.0 });
            B.Rows[4] = SparseVector.GetSparseElement(new double[] { 2.0, 0.0, 3.0 });

            hs.Householder(B);
            hs.Solve(A, b);

            Lemke lm = new Lemke(SharpEngineMathUtility.Solver.SolverType.HouseHolderQR);

            SparseMatrix M = new SparseMatrix(3, 3);

            M.Rows[0] = SparseVector.GetSparseElement(new double[] { 21.0, 0.0, 0.0 });
            M.Rows[1] = SparseVector.GetSparseElement(new double[] { 28.0, 14.0, 0.0 });
            M.Rows[2] = SparseVector.GetSparseElement(new double[] { 24.0, 24.0, 12.0 });

            double[] q = new double[] { -1.0, -1.0, -1.0 };

            lm.Solve(M, q, 10);

            SparseMatrix M1 = new SparseMatrix(2, 2);

            M1.Rows[0] = SparseVector.GetSparseElement(new double[] { 2.0, 1.0 });
            M1.Rows[1] = SparseVector.GetSparseElement(new double[] { 1.0, 2.0 });

            double[] q1 = new double[] { -5.0, -6.0 };

            lm.Solve(M1, q1, 10);

            double[] q2 = new double[] { 1.0, 2.0 };

            lm.Solve(M1, q2, 10);

            SparseMatrix M3 = new SparseMatrix(3, 3);

            M3.Rows[0] = SparseVector.GetSparseElement(new double[] { 1.0, 0.0, 2.0 });
            M3.Rows[1] = SparseVector.GetSparseElement(new double[] { 3.0, 2.0, -1.0 });
            M3.Rows[2] = SparseVector.GetSparseElement(new double[] { -2.0, 1.0, 0.0 });

            double[] q3 = new double[] { -1.0, 2.0, -3.0 };

            lm.Solve(M3, q3, 10);

            SparseMatrix M4 = new SparseMatrix(3, 3);

            M4.Rows[0] = SparseVector.GetSparseElement(new double[] { 0.0, 0.0, 1.0 });
            M4.Rows[1] = SparseVector.GetSparseElement(new double[] { 0.0, 2.0, 1.0 });
            M4.Rows[2] = SparseVector.GetSparseElement(new double[] { -1.0, -1.0, 0.0 });

            double[] q4 = new double[] { -6.0, 0.0, 4.0 };

            lm.Solve(M4, q4, 10);

            SparseMatrix M5 = new SparseMatrix(3, 3);

            M5.Rows[0] = SparseVector.GetSparseElement(new double[] { 1.0, 2.0, 0.0 });
            M5.Rows[1] = SparseVector.GetSparseElement(new double[] { 0.0, 1.0, 2.0 });
            M5.Rows[2] = SparseVector.GetSparseElement(new double[] { 2.0, 0.0, 1.0 });

            double[] q5 = new double[] { -1.0, -1.0, -1.0 };

            lm.Solve(M5, q5, 10);

            SparseMatrix M6 = new SparseMatrix(4, 4);

            M6.Rows[0] = SparseVector.GetSparseElement(new double[] { 1.0, 1.0, 3.0, 4.0 });
            M6.Rows[1] = SparseVector.GetSparseElement(new double[] { 5.0, 3.0, 1.0, 1.0 });
            M6.Rows[2] = SparseVector.GetSparseElement(new double[] { 2.0, 1.0, 2.0, 2.0 });
            M6.Rows[3] = SparseVector.GetSparseElement(new double[] { 1.0, 4.0, 1.0, 1.0 });

            double[] q6 = new double[] { -1.0, 2.0, 1.0, 3.0 };

            lm.Solve(M6, q6, 10);

            SparseMatrix M8 = new SparseMatrix(6, 6);

            M8.Rows[0] = SparseVector.GetSparseElement(new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 });
            M8.Rows[1] = SparseVector.GetSparseElement(new double[] { 2.0, 4.0, 8.0, 16.0, 32.0, 64.0 });
            M8.Rows[2] = SparseVector.GetSparseElement(new double[] { 3.0, 9.0, 27.0, 81.0, 243.0, 729.0 });
            M8.Rows[3] = SparseVector.GetSparseElement(new double[] { 4.0, 16.0, 64.0, 256.0, 1024.0, 4096.0 });
            M8.Rows[4] = SparseVector.GetSparseElement(new double[] { 5.0, 25.0, 125.0, 625.0, 3125.0, 15625.0 });
            M8.Rows[5] = SparseVector.GetSparseElement(new double[] { 6.0, 36.0, 216.0, 1296.0, 7776.0, 46656.0 });

            var ll1 = luSolver.Solve(M8, new double[6], out bool valid1);
        }