Example #1
0
        public static MWArray[] solve(double[,] Aeq, double[] beq, double[] x0, double[] tols, byte[] isMeas, double[] lowerBounds, double[] upperBounds)
        {
            MatlabWorker matlab = new MatlabWorker();

            MWArray MWAeq         = new MWNumericArray(Aeq);
            MWArray MWBeq         = new MWNumericArray(beq.Length, 1, beq);
            MWArray MWX0          = new MWNumericArray(x0.Length, 1, x0);
            MWArray MWTols        = new MWNumericArray(tols.Length, 1, tols);
            MWArray MwIsMeas      = new MWNumericArray(isMeas.Length, 1, isMeas);
            MWArray MWLowerBounds = new MWNumericArray(lowerBounds.Length, 1, lowerBounds);
            MWArray MWUpperBounds = new MWNumericArray(upperBounds.Length, 1, upperBounds);

            MWArray[] result = matlab.QPSolver(5, MWAeq, MWBeq, MWX0, MWTols, MwIsMeas, MWLowerBounds, MWUpperBounds);
            return(result);
        }
        public double[] Solve(double[] x0, double[,] a, double[] b, double[] measurability, double[] tolerance,
                              double[] lower, double[] upper)
        {
            // Проверка аргументов на null
            _ = x0 ?? throw new ArgumentNullException(nameof(x0));
            _ = a ?? throw new ArgumentNullException(nameof(a));
            _ = b ?? throw new ArgumentNullException(nameof(b));
            _ = measurability ?? throw new ArgumentNullException(nameof(measurability));
            _ = tolerance ?? throw new ArgumentNullException(nameof(tolerance));
            _ = lower ?? throw new ArgumentNullException(nameof(lower));
            _ = upper ?? throw new ArgumentNullException(nameof(upper));

            //Проверка аргументов на размерности
            if (x0.Length == 0)
            {
                throw new ArgumentException(nameof(x0));
            }
            if (a.GetLength(1) != x0.Length)
            {
                throw new ArgumentException("Array length by dimension 1 is not equal to X0 length.", nameof(a));
            }
            if (b.Length != a.GetLength(0))
            {
                throw new ArgumentException("Array length is not equal to A length by 0 dimension.", nameof(b));
            }
            if (measurability.Length != x0.Length)
            {
                throw new ArgumentException("Array length is not equal to X0 length.", nameof(measurability));
            }
            if (tolerance.Length != x0.Length)
            {
                throw new ArgumentException("Array length is not equal to X0 length.", nameof(tolerance));
            }
            if (lower.Length != x0.Length)
            {
                throw new ArgumentException("Array length is not equal to X0 length.", nameof(lower));
            }
            if (upper.Length != x0.Length)
            {
                throw new ArgumentException("Array length is not equal to X0 length.", nameof(upper));
            }

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            try
            {
                //Создаем объет для связи с матлабом
                var matlab = new MatlabWorker();

                // Преобразуем данные в понятный матлабу формат
                var aM             = new MWNumericArray(a);
                var bM             = new MWNumericArray(b.Length, 1, b);
                var x0M            = new MWNumericArray(x0.Length, 1, x0);
                var toleranceM     = new MWNumericArray(tolerance.Length, 1, tolerance);
                var measurabilityM = new MWNumericArray(measurability.Length, 1, measurability);
                var lowerM         = new MWNumericArray(lower.Length, 1, lower);
                var upperM         = new MWNumericArray(upper.Length, 1, upper);
                var maxIter        = new MWNumericArray(200);
                var drTol          = new MWNumericArray(0.0);

                // Запускаем солвер и ищем решение
                var result = matlab.QPSolver(7, aM, bM, x0M, toleranceM, measurabilityM,
                                             lowerM, upperM, maxIter, drTol);

                stopWatch.Stop();
                Time    = TimeSpan.Zero;
                TimeAll = stopWatch.Elapsed;

                DisbalanceOriginal = ((MWNumericArray)result[2]).ToScalarDouble();
                Disbalance         = ((MWNumericArray)result[3]).ToScalarDouble();

                return((double[])((MWNumericArray)result[0]).ToVector(MWArrayComponent.Real));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);

                throw new ApplicationException("Failed to solve balance task.");
            }
        }