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."); } }