Как найти экстремум функции в excel

Обновлено: 07.07.2024

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
End If
n = n + 1 'количество разбиений (переменная модуля класса)
Loop
dxk = Abs(b - a) ' конечное значение шага
xe = (a + b) / 2: ye = theFunc(xe) ' результат: координаты точки экстремума

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

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

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

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

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

Область определения функции (-∞;+∞)
Составим таблицу знаков функции f(x), полагая x равным:
a) критическим значениям функции (корням производной) или близким к ним;
b) граничным значениям (исходя из области допустимых значений неизвестного).
Имеем: 3х2+2х
Производная имеет 2 корня: x1=0; x2=-2/3

знак f(x)

Из таблицы видно, что функция 1 раз меняет знак, значит уравнение имеет 1 корень.
Уменьшим промежуток, в котором находится корень:

знак f(x)

Следовательно, x1 принадлежит промежутку ( -2; -2/3 ) . Используя процедуру Поиск решения найдем
а) все корни данного уравнения
Найдем значение функции по формуле =A1^3+A1^2+3. Эту формулу вставим в ячейку В1
Выберем Сервис→Поиск решения. Установим параметры:

параметры окна Поиск решения

Получим корень уравнения x1=-1.864 y=0

б) все экстремумы данной функции.
Найдем экстремумы функции с помощью команды Данные→Поиск решения. Установим параметры для поиска максимума:

поиск максимума с помощью процедуры Поиск решения

максимум функции

Найдем минимум функции с помощью процедуры Поиск решения. Введем параметры:

параметры окна поиск решения для нахождения минимума функции

Получим минимум в точке х=0, y=3.

значение минимума функции, найденное с помощью Поиска решений

Введем таблицу значений функции на промежутке [-2;1] с шагом 0,2. На основании данных таблицы построим график функции f(x). Для этого выберем команду главного меню Вставка→Диаграмма.
Получим график функции

Пусть дана функция с несколькими переменными F(x1, x2, . )=a1*x1+a2*x2+. Также даны граничные условия в виде b1*x1+b2*x2+. файл примера ).


Переменные (выделено зеленым) . В качестве переменных модели, очевидно, выступают x1, x2, x3, x4. Эта задача хороша тем, что переменные задаются однозначно, не требуется осмысливать житейскую задачу, например как с оптимизацией затрат . Хотя математически - это эквивалентные задачи, только количество переменных разное.

После запуска Поиск решения будет методично (последовательно) по своему алгоритму подставлять в зеленые ячейки числовые значения и вычислять функцию F (красная ячейка).

Ограничения (выделено серым) . Ограничения модели - это ограничения на область изменения переменных. Они могут задаваться как простыми выражениями для одной переменной, например х1>=0, так и для некой комбинации переменных 5*x1+4*x2-x3-2*x4 =0 ограничения можно ввести прямо в окне Поиска решения (будет показано ниже), для более сложных зависимостей удобно подготовить вспомогательную таблицу (С26:Е29).

Составить модель, особенно первую, непросто. Может помочь такой подход: считать, что переменные (зеленые ячейки) уже содержат некие значения, пусть даже не оптимальные. Так легче составлять огграничения. В нашем случае ограниечение 5*x1+4*x2-x3-2*x4 можно записать с помощью формулы = СУММПРОИЗВ($D$19:$D$22;C26:C29) . В диапазоне D19:D22 содержатся коэффициенты 5; 4; -1; -2. Кроме того, если значения переменных заданы, то и значение целевой функции также автоматически рассчитано (тоже не оптимальное пока, до запуска Поиска решения).

Целевая функция (выделено красным) . Целевая функция - это то, что требуется оптимизировать, т.е. F. Формула для ее вычисления задана в явном виде - не нужно догадываться из условий обычной задачи как ее подсчитать. Это не всегда очевидно (см., например, статью про пропускную способность трубопровода ).

Ниже приведено окно Поиска решения с заполненными полями: целевая функция, переменные и ограничения.

Найти минимум функции методом золотого сечения.
Помогите пожалуйста. Нужно найти минимум функции у=х*х-sinх методом золотого сечения. в СИ.

Найти максимум функции методом золотого сечения
Здравствуйте, в университете задали задачу, которую необходимо сделать в Mathcad'е. Необходимо.


Найти минимум функции x^2-sinx методом золотого сечения
Найти минимум функции x^2-sinx методом золотого сечения

"Помогите" = "сделайте всё за меня"?
Как насчёт график нарисовать в том же Экселе и определить пределы расположения локальных экстремумов? Сколько их вообще будет?
Вот блок-схема нахождения локального минимума функции на отрезке [a;b] с заданной точностью jogano, К сожалению, я абсолютно ничего не понимаю в этом.. Это так решается? К примеру в решении приводится один из локальных экстремумов - min функции
Если решение верное, то мне надо таким же образом получить max функции, хотя я не уверен, что именно так должно решаться, даже не имею представления

Хочу сообщить, что тема все еще АКТУАЛЬНА. Спасибо!

jogano, а как быть, если в условии задачи не указаны отрезки [a;b]?

Вот блок-схема нахождения локального минимума функции на отрезке [a;b] с заданной точностью Добрый вечер, jogano, хочу уточнить одну вещь. В блок-схеме приводится метод решения задачи, при известных отрезках (интервалах) [a;b]. В моем же случае отрезки не указаны, как мне определить эти отрезки, для дальнейшего решения задачи? Спасибо! Dr_Mann, вам уже промолчали по этому поводу. Намёков вы, видимо, не понимаете. Отвечаю прямо - когда я делал вашу задачу, я сначала нарисовал график в Экселе, и визуально определил нужный отрезок. Как это сделать без графика, я не знаю. Надеюсь, больше вопросов вида "а если не рисовать?", "а как можно по другому?" не будет. Добрый вечер, jogano, хочу уточнить одну вещь. В блок-схеме приводится метод решения задачи, при известных отрезках (интервалах) [a;b]. В моем же случае отрезки не указаны, как мне определить эти отрезки, для дальнейшего решения задачи? Спасибо! Постройте график функции в том же самом табличном редакторе которым вы пользуетесь, Excel или Calc из libreOffice / OpenOffice. WH, Получилось вот так, по-моему не совсем правильно..
Потому что для построения тоже нужны значения для аргумента x. Я ввел значения от 0 до 10, наверно нужны другие значения.. Нужно просто взять большее чило значений, не через 1, а к примеру через 0,1, и копированием формулы построить ряд данных, секундное дело. И подобрать подходящий вид графика и его тип. Если Вам нужно в пределах 0. 10, то вот что у меня получилось в программе Calc, все выглядит вполне нормально.
Ответ у Вас должен получиться такой
х = 2.3896
f(x) = 0.5979
правда я не в табличном редакторе считал, так что не спрашивайте меня как это сделать в таблицах. WH, Так получается я могу любые значения х ввести и всегда будет разный график и соответственно разные интервалы. Возвращаясь к самой задачи, какие значения х мне следует вводить, чтобы получить верный график функции и его верные интервалы [a;b], для дальнейшего решения моей задачи? От 0 до 10 я ввел рандомно.

Решение

У Вас в условиях задачи сказано - найти локальные экстремумы. Строим график функции что бы понять где они находятся. Видим, что экстремумов 3, причем 2 из них являются еще и глобальными и равными друг другу (это будет понятно если построить графики в более широком диапазоне значений X и более узких границах, а так же и по формуле функции). Теперь методом золотого сечения находим значения:

Глобальные экстремумы выделил красными кружочками, находятся в диапазонах X где то между -4. -1 и между 1. 4.
Локальный экстремум можно выделить в диапазоне значений Х на промежутке -1. 1 (синий кружочек), находится он по оси X в районе нуля.


Результат который у Вас должен получиться.

WH, Спасибо большое, что не прошли мимо и помогли разобраться. Теперь у меня есть понимание решения этой задачи.. Думаю, тему следует закрывать


Минимизация функции методом золотого сечения
Здравствуйте, помогите с лабораторной. Нужно написать код, исходя из следующей блок схемы.


Минимизировать Функции методом золотого сечения
Минимизировать Функции f(x) = |x| + e^10x методом золотого сечения Отрезок неопределнности .

Определить минимум функции методом золотого сечения
Ребята помогите с решением задачи в маткаде по золотому сечению: Определить методом золотого.

Поиск экстремума функции методом золотого сечения
Напишите программу, которая находит все минимумы и максимумы функции (см. варианты на следующей.

Читайте также: