Список факторов и функций отклила

1 000 руб. за проект
28 ноября 2023, 13:16 • 0 откликов • 41 просмотр
Взять любой объект оптимизации, написать для него список факторов и функций отклика. Потом написать функцию, апишку, библиотеку или программу(что-угодно), чтобы по факторам получить отклик. Подставить её вместо параболлоида в программу.
using System; namespace mni2 { internal class Program { // Инициализация объекта Random для получения случайных чисел private static readonly Random random = new Random(); // Генерация случайного числа в указанном диапазоне static double RandomDouble(double min, double max) { return random.NextDouble() * (max - min) + min; } // Функция, задающая поверхность параболлоида static double Func(double x, double y, double a, double b, double c) { return x * x * a + y * y * b + c; } // Метод Гаусса для решения систем линейных уравнений static double[] MethodGauss(double[,] coefs, double[] constant) { int amountCoords = constant.Length; double[] solution = new double[amountCoords]; // Прямой ход метода Гаусса for (int i = 0; i < amountCoords - 1; i++) { for (int j = i + 1; j < amountCoords; j++) { double ratio = coefs[j, i] / coefs[i, i]; for (int k = i; k < amountCoords; k++) { coefs[j, k] -= ratio * coefs[i, k]; } constant[j] -= ratio * constant[i]; } } // Обратный ход метода Гаусса for (int i = amountCoords - 1; i >= 0; i--) { double sum = 0; for (int j = i + 1; j < amountCoords; j++) { sum += coefs[i, j] * solution[j]; } solution[i] = (constant[i] - sum) / coefs[i, i]; } return solution; } static void Main(string[] args) { // Задание параметров параболлоида double a = 2, b = 1, c = 3; // Инициализация переменных и параметров для алгоритма double x, y, z, xNew, yNew, zNew, globalEps = 1, eps = 0.000001; double n = 10.0, m = 20.0; double hx = n / 10.0, hy = m / 10.0; double gradX, gradY, lambda = 0.01; int dots = 4; // Создание массивов для координат точек double[] xArray = new double[dots]; double[] yArray = new double[dots]; double[] zArray = new double[dots]; // Генерация случайных начальных координат x = RandomDouble(-n, n); y = RandomDouble(-m, m); z = Func(x, y, a, b, c); Console.WriteLine("Начальная случайная точка: " + x + " " + y + " " + z); do { // Вычисление значений функции в окрестности текущей точки for (int i = 0; i < dots; i++) { if (i % 2 == 0) xArray[i] = x - hx; else xArray[i] = x + hx; if (i < 2) yArray[i] = y - hy; else yArray[i] = y + hy; zArray[i] = Func(xArray[i], yArray[i], a, b, c); } // Вычисление сумм для метода Гаусса double xSum = 0.0, ySum = 0.0, zSum = 0.0, xxSum = 0.0, yySum = 0.0, xySum = 0.0, yzSum = 0.0, xzSum = 0.0; for (int i = 0; i < dots; i++) { xSum += xArray[i]; ySum += yArray[i]; zSum += zArray[i]; xxSum += xArray[i] * xArray[i]; yySum += yArray[i] * yArray[i]; xySum += xArray[i] * yArray[i]; yzSum += yArray[i] * zArray[i]; xzSum += xArray[i] * zArray[i]; } // Подготовка коэффициентов для метода Гаусса double[,] coefficients = { { xxSum, xySum, xSum }, { xySum, yySum, ySum }, { xSum, ySum, dots } }; double[] dCoefficients = { xzSum, yzSum, zSum }; // Вычисление коэффициентов методом Гаусса double[] calcCoefficients = MethodGauss(coefficients, dCoefficients); // Вывод вычисленных коэффициентов for (int i = 0; i < 3; i++) { Console.WriteLine("Вычисленные коэффициенты: " + calcCoefficients[i]); } // Обновление координат и значения функции gradX = calcCoefficients[0]; gradY = calcCoefficients[1]; xNew = x - lambda * gradX; yNew = y - lambda * gradY; zNew = Func(xNew, yNew, a, b, c); if (zNew < z) { globalEps = Math.Abs(zNew - z); lambda *= 2; x = xNew; y = yNew; z = zNew; } else { lambda /= 2; } // Вывод обновленных координат и значения функции Console.WriteLine("Обновленная точка и значение функции: " + x + " " + y + " " + z); } while (globalEps > eps); // Вывод окончательных координат и значения функции Console.WriteLine("Итоговая точка и значение функции: x: " + x + " y: " + y + " z: " + z); } } }