Beispiel #1
0
        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);
        }
Beispiel #2
0
 public bool Equal(Extremums extremums)
 {
     if (this.x1 == extremums.getX1() &&
         this.x2 == extremums.getX2() &&
         this.extremum == extremums.getExtremum())
     {
         return(true);
     }
     return(false);
 }
Beispiel #3
0
/*
 +-----------------------------+
 |     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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        /* Этот метод предназначен для расчета методом Хука-Дживса экстремума функции с двумя переменными.
         * Метод передаются координаты начальной точки, шага и точность от вызывающей программы.
         * Метод возращает значение экстремума и её координаты.*/
        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);
        }