Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Do Constrained Nonlinear Optimization - Wolfram Mathematica

Условная нелинейная оптимизация

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

Простой задачей оптимизации является нахождение наибольшего значения выражения DoConstrainedNonlinearOptimizationRU_1.gif при котором точка (x,y) находится в пределах 1 единицы от начала координат. Первым аргументом функции Maximize является список, состоящий из выражения и условия; вторым аргументом является список переменных:

In[2]:=

DoConstrainedNonlinearOptimizationRU_2.gif

Out[2]=

DoConstrainedNonlinearOptimizationRU_3.gif

Полученный результат представляет собой список, где первый элемент является максимальным найденным значением, а второй элемент представляет собой список правил для значений независимых переменных, обеспечивающих этот максимум.  Ниже второй элемент списка выведен в виде sol[[2]]. Эта форма записи sol[[2]] является краткой формой для функции DoConstrainedNonlinearOptimizationRU_4.gif:

In[3]:=

DoConstrainedNonlinearOptimizationRU_5.gif

Out[3]=

DoConstrainedNonlinearOptimizationRU_6.gif

Вы можете проверить, соответствует ли решение условию, путем подстановки решения в первоначальную задачу. Для этого, используйте /.sol[[2]] вслед за записью первоначального условия. Символ /. является краткой формой записи функции ReplaceAll:

In[4]:=

DoConstrainedNonlinearOptimizationRU_7.gif

Out[4]=

DoConstrainedNonlinearOptimizationRU_8.gif

Многие задачи оптимизации связаны с нахождением наименьшего значения для определенной функции:

In[5]:=

DoConstrainedNonlinearOptimizationRU_9.gif

Out[5]=

DoConstrainedNonlinearOptimizationRU_10.gif

Полученный результат Вы можете вывести в численном виде, применив функцию N:

In[6]:=

DoConstrainedNonlinearOptimizationRU_11.gif

Out[6]=

DoConstrainedNonlinearOptimizationRU_12.gif

    

Если Вашей целью является получение численных результатов, более эффективным будет изначальное использование аналогичных функций для численных вычислений NMinimize и NMaximize. Обратите внимание, что NMinimize и NMaximize используют числовые алгоритмы и могут давать результаты, которые не являются глобальным оптимумом:

In[7]:=

DoConstrainedNonlinearOptimizationRU_13.gif

Out[7]=

DoConstrainedNonlinearOptimizationRU_14.gif

Maximize и Minimize выполняют символьный анализ выражения, подвергаемого оптимизации, выдавая проверенный глобальный оптимум. Если имеющееся у Вас выражение не может быть проанализировано символьное, NMaximize и NMinimize окажутся более полезными и эффективными.

Здесь приводится простое выражение, которое Maximize и Minimize не могут обработать, так как функция NIntegrate не может выполнить расчет, если параметр q не является числом:

In[8]:=

DoConstrainedNonlinearOptimizationRU_15.gif

DoConstrainedNonlinearOptimizationRU_16.gif

Out[8]=

DoConstrainedNonlinearOptimizationRU_17.gif

Здесь для этого выражения дается функция , которую Вы можете использовать с NMinimize. Использование условия DoConstrainedNonlinearOptimizationRU_18.gif для а& #1088;гумента, защищает функцию от вычисления NIntegrate если q не является числом. Символ ? является краткой формой записи для PatternTest:

In[9]:=

DoConstrainedNonlinearOptimizationRU_19.gif

Вы можете использовать NMinimize и NMaximize для выполнения оптимизации численными алгоритмами. Второй аргумент задает для q два начальных значения для нахождения наклонов:

In[10]:=

DoConstrainedNonlinearOptimizationRU_20.gif

Out[10]=

DoConstrainedNonlinearOptimizationRU_21.gif

NMinimize, NMaximize, Minimize и Maximize ищут глобальный минимум или максимум. Функции FindMinimum и FindMaximum, порой более быстродействующие, ищут локальный минимум или максимум:

In[11]:=

DoConstrainedNonlinearOptimizationRU_22.gif

Out[11]=

DoConstrainedNonlinearOptimizationRU_23.gif

In[12]:=

DoConstrainedNonlinearOptimizationRU_24.gif

Out[12]=

DoConstrainedNonlinearOptimizationRU_25.gif

    

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

In[13]:=

DoConstrainedNonlinearOptimizationRU_26.gif

Аргументами для FindFit являются данные, выражение, список параметров (коэффициентов) выражения, а также переменная. Вот как решается задача:

In[14]:=

DoConstrainedNonlinearOptimizationRU_27.gif

Out[14]=

DoConstrainedNonlinearOptimizationRU_28.gif

Вы можете добавить ограничивающие условия. Например, предположим, что все параметры должны быть положительными; поместим эти условия в список вслед за выражением:

In[15]:=

DoConstrainedNonlinearOptimizationRU_29.gif

Out[15]=

DoConstrainedNonlinearOptimizationRU_30.gif

Здесь проводится сравнение двух аппроксимаций. Обе они очень близки за исключением участка, где x принимает маленькие значения:

In[16]:=

DoConstrainedNonlinearOptimizationRU_31.gif

Out[16]=

DoConstrainedNonlinearOptimizationRU_32.gif