public List <Extremums> extremumFunctionWithPenalty(double _x1_begin, double _x2_begin, double _step_begin, double _Eps) { List <Extremums> extremumsList = new List <Extremums>(); x1 = _x1_begin; x2 = _x2_begin; step = _step_begin; extremum = F(x1, x2); do { double extremumOld = extremum; basisPointNext(); if (extremumOld.Equals(extremum)) { step = step / 10; } else { x1 = Math.Round(x1, 3); x2 = Math.Round(x2, 3); extremum = Math.Round(extremum, 3); Extremums basisPoint = new Extremums(); basisPoint.Add(x1, x2, extremum); extremumsList.Add(basisPoint); } } while (step > _Eps); return(extremumsList); }
public double monteCarlo() { double x1; double x2; double ximin; double ximax; ximin = -1; ximax = 4; int i = 1; do { double ksi; ksi = getRandomValue(); x1 = ximin + ksi * (ximax - ximin); ksi = getRandomValue(); x2 = ximin + ksi * (ximax - ximin); double result = f(x1, x2); double first_border = 2 * x1 * x1 + 3 * x2 * x2; if (condidions(x1, x2)) { if (result < min) { min = result; Extremums extremums = new Extremums(); extremums.Add(x1, x2, result); extremumsList.Add(extremums); } } i++; } while (i < 1210); return(min); }
/* Этот метод предназначен для расчета методом Хука-Дживса экстремума функции с двумя переменными. * Метод передаются координаты начальной точки, шага и точность от вызывающей программы. * Метод возращает значение экстремума и её координаты.*/ public Extremums extremumFunction(double _x1_begin, double _x2_begin, double _step_begin, double _eps) { // Установить значение координат функции на начальные коорднаты и значение шага на начальный шаг. double x1 = _x1_begin; double x2 = _x2_begin; double step = _step_begin; Extremums basisPoint = new Extremums(); basisPoint.Add(x1, x2, f(x1, x2)); Extremums basisPointBegin = new Extremums(); basisPointBegin.Add(x1, x2, f(x1, x2)); extremumsList.Add(basisPointBegin); do { //* Вычислить значение функции в начальных точках и присвоить его базисной точке Extremums basisPointNew = new Extremums(); basisPointNew.Add(basisPoint.getX1(), basisPoint.getX2(), basisPoint.getExtremum()); x1 = Math.Round(basisPoint.getX1(), 3); x2 = Math.Round(basisPoint.getX2(), 3); //* Если значение функции с прибавленым шагом по оси x1 меньше значения функции в базисной точке, //* то заменяем значение новой базисной точки функцией с прибавленым шагом, //* иначе если значение функции с шагом в противоположную сторону по оси x1 меньше значения функции в базисной точке, //* то заменяем значение базисной точки функцией с с шагом в противоположную сторону. double function = f(x1 + step, x2); double xz = basisPointNew.getExtremum(); if (function < basisPointNew.getExtremum() && condition(x1 + step, x2)) { basisPointNew.Add(x1 + step, x2, f(x1 + step, x2)); } function = f(x1 - step, x2); if (function < basisPointNew.getExtremum() && condition(x1 - step, x2)) { basisPointNew.Add(x1 - step, x2, f(x1 - step, x2)); } //* Если значение функции в базисной точке не изменилось, то проделываем все тоже самое, только по оси x2. if (basisPoint.Equal(basisPointNew)) { if (f(x1, x2 + step) < basisPointNew.getExtremum() && condition(x1, x2 + step)) { basisPointNew.Add(x1, x2 + step, f(x1, x2 + step)); } if (f(x1 - step, x2) < basisPointNew.getExtremum() && condition(x1, x2 - step)) { basisPointNew.Add(x1, x2 - step, f(x1, x2 - step)); } } //* Если значение функции в базисной точке не изменилось, то уменьшаем шаг в 10 раз и возращаемся в начала функции. if (basisPoint.Equal(basisPointNew)) { step = step / 10; } //* Иначе если значение функции в базисной точке уменьшелось, то устанавливаем новое значение базисной точки и возращаемся в начало функции. else { extremumsList.Add(basisPointNew); basisPoint.Add(basisPointNew.getX1(), basisPointNew.getX2(), basisPointNew.getExtremum()); } } while (step > _eps); return(basisPoint); }