VBA Excel. Нахождение экстремума функции Методом Золотого Сечения.

О методе Золотого Сечения:

Безусловно, простой и быстрый метод. И как водится, скорость не способствует аккуратности. Это я о том, что если на заданном интервале поиска будут находиться несколько минимумов (максимумов), то данный алгоритм легко может вернуть локальный (не самый большой, не абсолютный) экстремум.

Задание:

Составить программу позволяющую протестировать алгоритм поиска экстремума методом Золотого Сечения на примере пяти произвольных функций. Исходными данными для поиска должны являться границы интервала, точность и тип экстремума (MAX или MIN). Программа должна отображать график функции на заданном интервале и координаты точки экстремума.

В программе есть смысл оформить следующие классы и модули:

  1. Модуль листа Excel (SheetGoldCutting), на котором как на форме будут располагаться необходимые органы управления ходом тестирования;
  2. Форма для ввода данных FormDann;
  3. Класс ExtremGC, вычисляющий координаты точки экстремума с заданной точностью, а также массив точек графика функции на заданном интервале (для отображения на диаграмме);
  4. Стандартный модуль GoldCutting для описания глобальных констант, переменных и функций.

Например, так...

VBA Excel метод золотого сечения
Рис.1 Рабочий лист Excel с диаграммой, двумя командными кнопками и кнопками выбора функции

VBA Excel метод золотого сечения
Рис.2 Форма для ввода исходных данных

Данная форма вызывается явно при щелчке по первой командной кнопке (расположенной на листе Excel) или косвенно, если в момент нажатия на вторую командную кнопку (расположенную на листе Excel), исходные данные не обеспечивают необходимых условий начала выполнения алгоритма.
Для удобства пользователя, все элементы TextBox допускают ввод только числовых значений.
При щелчке по кнопке «Отмена» все переменные получат значения, которые существовали на момент открытия формы.

При открытии файла (если макросы включены) или включении макросов (если они были отключены на момент открытия файла) выполняется обработчик события с целью задать (определить) одну из заготовленных функций, как функцию для тестирования по умолчанию. Для этого достаточно отметить одну (например, первую) OptionButton (или как часто называют - радиокнопку) и вызвать макрос назначенный этой кнопке.

Private Sub Workbook_Open()
   ' радиокнопки нумеруются в этой книге от 5 до 9.
   ' Поэтому по умолчанию выделяю первую кнопку.
    Sheets(1).Shapes("Option Button 5").ControlFormat.Value = 1
    SheetGoldCutting.OptBut1_Click
End Sub

Метод theAlgoritm класса ExtremGC, который, собственно, и выполняет определение координат точки экстремума выглядит приблизительно так:

'Нахождение экстремума функции на отрезке. Метод золотого сечения
Public Sub theAlgoritm(v1 As Double, v2 As Double, v3 As Double, v4 As Double, findMax As Boolean)
Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double, sme As Double
FullArrayOnly v1, v2, v3, v4 'для проверки допустимости аргумента

If Not BadDann Then

    zc = (1 + Sqr(5)) / 2
    n = 0 'количество разбиений (переменная модуля класса)
    Do While b - a > ep
       sme = (b - a) / zc
       x1 = b - sme: x2 = a + sme
       y1 = theFunc(x1): y2 = theFunc(x2)
       If findMax Then
             'поиск максимума
             If y1 <= y2 Then
                   a = x1
             Else
                   b = x2
             End If
       Else
             'поиск минимума
             If y1 >= y2 Then
                   a = x1
             Else
                   b = x2
             End If
       End If
       n = n + 1 'количество разбиений (переменная модуля класса)
    Loop
    dxk = Abs(b - a) ' конечное значение шага
    xe = (a + b) / 2: ye = theFunc(xe) ' результат: координаты точки экстремума

End If
End Sub

Где
FullArrayOnly - закрытый метод класса для проверки допустимости аргумента и заполнения массива точек графика;
BadDann – флаг допустимости аргумента;
zc – константа золотого сечения;
a, b – границы интервала;
ep – заданная точность поиска ε;
findMax – параметр, характеризующий режим поиска (при true ищется максимум, при false – минимум);
theFunc(x As Double) As Double – метод класса, возвращающий значение тестируемой функции в зависимости от значение аргумента.


Кому интересен остальной код – обращайтесь…
Если нужно что-то изменить в проекте под Ваши требования (например, заменить функции) – пожалуйста, проблем не будет!

скачать xlsm-файл для тестирования,

исходный код уже открыт. Используйте !

Если у Вас не появляется форма ввода данных, значит вы забыли включить макросы…

Хочу обратить внимание, что для первой функции значения аргумента не могут быть меньше или равны нулю.

Чтобы увидеть, как ошибается алгоритм и находит локальный экстремум вместо абсолютного, задайте достаточно большой интервал (например: от 0 до 25) для 4 или 5 функций, имеющих явную периодичность…


К слову, здесь        Метод золотого сечения на Паскале (Pascal 7.1)


Другие примеры на языке «Visual Basic for application - VBA»




Если на этой странице не нашлось того, что Вы так искали...

         Не расстраивайтесь, не все потеряно... Смело щелкайте...

исходный код на заказ. orenstudent.ru Автоматизация документов MS Office. orenstudent.ru исходный код на заказ. orenstudent.ru Помогите найти и устранить ошибку в исходном коде программы. orenstudent.ru Skype-консультирование по программированию
Скайп-консультации

Акция !!!
Весь код по 49 руб


требуются
школьники!


и СТУДЕНТЫ!
Кому не плевать
на деньги!
Сайт помощи студентам по программированию и информатике

Program code