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 bool Equal(Extremums extremums) { if (this.x1 == extremums.getX1() && this.x2 == extremums.getX2() && this.extremum == extremums.getExtremum()) { return(true); } return(false); }
/* +-----------------------------+ | Hooke Jeeves method | +-----------------------------+ */ private void methodHookeJeeves(Double _startX1, Double _startX2, Double _step, Double _accuracy) { chart3.Series.Clear(); LevelLine ll = new LevelLine(chart3); HookeJeeves hookeJeeves = new HookeJeeves(); Extremums ec = hookeJeeves.extremumFunction(_startX1, _startX2, _step, _accuracy); String answer = "Экстремум " + ec.getExtremum().ToString() + " x1= " + ec.getX1() + " x2 = " + ec.getX2(); MessageBox.Show(answer); textBox1.Visible = true; textBox1.Text = answer; List <Extremums> extremumCoordinatesList = hookeJeeves.getExtremumsList(); Series series = new Series("way"); Series seriesPoint = new Series("point"); series.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; series.Color = System.Drawing.Color.Black; series.BorderWidth = 3; dataGridView1.RowCount = extremumCoordinatesList.Count; dataGridView1.ColumnCount = 3; dataGridView1.Columns[0].HeaderText = "X1"; dataGridView1.Columns[1].HeaderText = "X2"; dataGridView1.Columns[2].HeaderText = "MIN"; for (double extremum = 0; extremum < 4; extremum += 0.25) { ll.drawLine(extremum); } for (int i = 0; i < extremumCoordinatesList.Count; i++) { dataGridView1.Rows[i].Cells[0].Value = extremumCoordinatesList[i].getX1(); dataGridView1.Rows[i].Cells[1].Value = extremumCoordinatesList[i].getX2(); dataGridView1.Rows[i].Cells[2].Value = extremumCoordinatesList[i].getExtremum(); double x1 = extremumCoordinatesList[i].getX1(); double x2 = extremumCoordinatesList[i].getX2(); series.Points.AddXY(x1, x2); if (extremumCoordinatesList[i].getExtremum() == ec.getExtremum()) { this.label1.Text = Math.Round(extremumCoordinatesList[i].getExtremum(), 2).ToString(); this.label2.Text = Math.Round(extremumCoordinatesList[i].getX1(), 2).ToString(); this.label3.Text = Math.Round(extremumCoordinatesList[i].getX2(), 2).ToString(); ll.pointExtremum(extremumCoordinatesList[i].getX1(), extremumCoordinatesList[i].getX2()); } } chart3.Series.Add(series); }
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); }