Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск минимума ф-ии на интервале методом деления, отрезка пополам 
:(
    Опции темы
Xeim
Дата 23.9.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 17.11.2005

Репутация: нет
Всего: 0



Вообще про этот метод не нашел упоминания в Интернете.

Как это сделать?

Задача звучит так: Написать программу, которая ищет минимум функции на заданном отрезке с заданным шагом методом полного перебора. Кроме того делет тоже самое, но методом деления отрезка пополам.
Первую часть задачи я сделал, а вот над методом деления отрезка пополам ломал голову 3 дня без Интернета. С Интернетом тоже ничего не нашел. И блок-схемы чертил и что только не делал. Есть идеи, но боюсь не верные, т.к. незаконченные.
PM MAIL   Вверх
underflow
Дата 24.9.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 13.6.2008

Репутация: нет
Всего: нет



о поиске минимума делением отрезка пополам должно быть написано в любой книге по мат. анализу
PM MAIL ICQ   Вверх
Wizard_Memfis
Дата 24.9.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 12.2.2007
Где: г. Донецк, Украин а

Репутация: 2
Всего: 4



Вернее в любой книге по численным методам
З.Ы. Хотя учил ман несколько лет назад, может че-то подзабыл! smile 
--------------------
www.binary-studio.com
PM MAIL WWW ICQ Skype   Вверх
Idsa
Дата 24.9.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



Цитата(Xeim @  24.9.2008,  00:02 Найти цитируемый пост)
аписать программу, которая ищет минимум функции на заданном отрезке с заданным шагом методом полного перебора.

Этот метод называется методом общего поиска.

Цитата(Xeim @  24.9.2008,  00:02 Найти цитируемый пост)
Первую часть задачи я сделал, а вот над методом деления отрезка пополам ломал голову 3 дня без Интернета. С Интернетом тоже ничего не нашел.

Ничего сложного в этом методе нет. Обычная дихотомия за тем лишь исключением, что на первой итерации просчитывается не 3, а 5 точек. Вот код метода, который я писал не так давно:
Код

  private Result DivideByTwo(Func<double, double> objectiveFunction)
    {
      Point point1 = new Point(this.X0, objectiveFunction(this.X0));
      Point point2 = new Point(this.Xk, objectiveFunction(this.Xk));

      double pointMiddle1X = (point1.X + point2.X) / 2;

      Point pointMiddle1 = new Point(pointMiddle1X, objectiveFunction(pointMiddle1X));
      Point pointMiddle2 = new Point();
      Point pointMiddle3 = new Point();

      int iterationsCount = 0;
      int evaluationsCount = 3;

      while (point2.X - point1.X > this.E)
      {
        pointMiddle2.X = (point1.X + pointMiddle1.X) / 2;
        pointMiddle3.X = (pointMiddle1.X + point2.X) / 2;

        pointMiddle2.Y = objectiveFunction(pointMiddle2.X);
        pointMiddle3.Y = objectiveFunction(pointMiddle3.X);

        if (pointMiddle1.Y < pointMiddle2.Y && pointMiddle1.Y < pointMiddle3.Y)
        {
          point1.X = pointMiddle2.X;
          point2.X = pointMiddle3.X;
          point1.Y = pointMiddle2.Y;
          point2.Y = pointMiddle3.Y;
        }
        else if (pointMiddle2.Y < pointMiddle1.Y && pointMiddle2.Y < pointMiddle3.Y)
        {
          point2.X = pointMiddle1.X;
          pointMiddle1.X = pointMiddle2.X;
          point2.Y = pointMiddle1.Y;
          pointMiddle1.Y = pointMiddle2.Y;
        }
        else if (pointMiddle3.Y < pointMiddle1.Y && pointMiddle3.Y < pointMiddle2.Y)
        {
          point1.X = pointMiddle1.X;
          pointMiddle1.X = pointMiddle3.X;
          point1.Y = pointMiddle1.Y;
          pointMiddle1.Y = pointMiddle3.Y;
        }

        iterationsCount++;
        evaluationsCount += 2;
      }

      List<Point> resultPoints = new List<Point>() { point1, pointMiddle1, pointMiddle2, pointMiddle3, point2 };

      return new Result()
      {
        Point = resultPoints.Find(p => p.Y == resultPoints.Min(p1 => p1.Y)),
        IterationsCount = iterationsCount,
        EvaluationsCount = evaluationsCount
      };
    }


P. S. Писалось под C# 3.0, но при необходимости переделать под C# 2.0 не составит труда.
PP. S. Если Вам нужна теория по этим методам, дайте знать - залью куда-нибудь электронную книгу.

Это сообщение отредактировал(а) Idsa - 24.9.2008, 11:25


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0660 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.