This demonstration shows how to find extrema of functions using analytical and numerical techniques using the Symbolic Math Toolbox™.
-
First Derivatives: Finding Local Minimum and Maximum of the Function
-
Second Derivatives: Finding Inflection Points of the Function
-
Limits: Functions with Suprema
First Derivatives: Finding Local Minima and Maxima
Computing the first derivative of an expression helps you find local minima and maxima of that expression. For example, create a rational expression where the numerator and the denominator are polynomial expressions.
syms x
f = (3 * x^3 + 17 * x^2 + 6 * x + 1)/(2 * x^3 + x * -1 + 3)
f =3 x3+17 x2+6 x+12 x3-x+3
Plotting this expression shows that it has horizontal and vertical asymptotes, a local minimum between -1 and 0, and a local maximum between 1 and 2.
By default, when you operate on this expression, results can include both real and imaginary numbers. If you are interested in real numbers only, you can set the permanent assumption that x belongs to the set of real numbers. This allows you to avoid complex numbers in the solutions and it also can improve performance.
To find a horizontal asymptote, compute the limit of f for x approaching positive and negative infinities. The horizontal asymptote is x=3/2.
[limit(f, x, sym(inf)), limit(f, x, -sym(inf))]
To find a vertical asymptote of f, find the roots of the polynomial expression that represents the denominator of f.
solve(2 * x^3 + x * -1 + 3 == sym(0), x)
To get an explicit solution for such equations, try calling the solver with the option MaxDegree
. The option specifies the maximum degree of polynomials for which the solver tries to return explicit solutions. By default, MaxDegree
= 2
. Increasing this value, you can get explicit solutions for higher-order polynomials. For example, specifying MaxDegree
= 3
results in an explicit solution.
solve(2 * x^3 + x * -1 + 3 == 0, x, 'MaxDegree', 3)
ans =-16 34-241 4324321/3-34-241 4324321/3
You can approximate the exact solution numerically by using the vpa
function.
Now find the local minimum and maximum of the expression f
. If the point is a local extremum (either minimum or maximum), the first derivative of the expression at that point is equal to zero. To compute the derivative of an expression, use the diff
function.
g =9 x2+34 x+62 x3-x+3-6 x2-1 3 x3+17 x2+6 x+12 x3-x+32
To find the local extrema of f
, solve the equation g = 0
. If you use the MaxDegree
option, the solver returns the long explicit solution, which can be approximated by using the vpa
function.
solve(g == 0, x, 'MaxDegree', 4);
extrema = vpa(ans, 6)
extrema =(-0.1892451.28598)
The plot of the expression f
shows that x = -0.189 is a local minimum of the expression, and x = 1.286 is its local maximum.
fplot(f) hold on plot(extrema, subs(f,extrema), '*') hold off
Second Derivatives: Finding Inflection Points
Computing the second derivative lets you find inflection points of the expression.
h(x) = simplify(diff(f, x, 2))
h(x) =2 68 x6+90 x5+18 x4-699 x3-249 x2+63 x+1722 x3-x+33
To find inflection points of f, solve the equation h = 0
. For this equation the symbolic solver returns a complicated result even if you use the MaxDegree
option.
solve(h == 0, x, 'MaxDegree', 4)
ans =(root(σ1,z,1)root(σ1,z,4))where σ1=z6+45 z534+9 z434-699 z368-249 z268+63 z68+4317
To get the simpler numerical result, solve the equation numerically by using vpasolve
; specify the search range to restrict the returned results to all real solutions of the expression.
inflection = vpasolve(h == 0, x, [-inf, inf])
inflection =(0.578718426554417483196010858601961.8651543689917122385037075917613)
The expression f
has two inflection points: x = 0.579 and x = 1.865.
fplot(f) hold on plot(extrema, subs(f,extrema), '*') plot(inflection, subs(f,inflection), '*') hold off
Suprema
Not all functions can be treated analytically; the function
f(x)=tan(sin(x))-sin(tan(x))
is very flat at the origin and it oscillates infinitely often near -π2, becomes linear as it approaches zero and oscillates again near π.
f = @(x) tan(sin(x))-sin(tan(x))
f = function_handle with value:
@(x)tan(sin(x))-sin(tan(x))
Most important for our purposes here, fplot
has picked the limit on the y-axes to be
What is happening at π2?
MATLAB® uses double precision arithmetic, so π2 evaluates to one of the oscillations.
The Symbolic Math Toolbox uses exact arithmetic, which shows the function is undefined.
F = tan(sin(x))-sin(tan(x))
Taylor Series
We can also try to look at the value with a Taylor Series.
T = taylor(F,x,'Order',10,'ExpansionPoint',0)
ans = 3.0198759869735883213825972535797
hold on fplot(T) ylim ([-3 3]) hold off
Calculus
We learn in calculus that a maximum occurs at a zero of the derivative. But this function is not differentiable in the vicinity of π2. We can analytically differentiate f(x) using the Symbolic Math Toolbox.
ans = cos(x) tan(sin(x))2+1-cos(tan(x)) tan(x)2+1
fplot(diff(F), [-pi , pi])
Sampling
We can sample the function N times near π2 to get a numerical approximation to the value of the maximum. Is that good enough?
N = 100; xValues = 3*pi/8 + pi/4*rand(1,N)
xValues = 1×100
1.8180 1.8895 1.2778 1.8955 1.6748 1.2547 1.3968 1.6076 1.9301 1.9359 1.3019 1.9404 1.9299 1.5593 1.8066 1.2895 1.5093 1.8973 1.8003 1.9317 1.6931 1.2061 1.8450 1.9117 1.7112 1.7732 1.7618 1.4862 1.6929 1.3125 1.7326 1.2031 1.3956 1.2144 1.2544 1.8248 1.7238 1.4271 1.9244 1.2052 1.5227 1.4778 1.7793 1.8026 1.3249 1.5628 1.5281 1.6857 1.7352 1.7708
ySoln = 1×100
0.7260 1.5080 1.5932 1.5614 1.3796 1.3158 2.0658 2.4586 1.8194 1.8541 1.9088 1.8793 1.8178 2.3439 0.6145 1.7447 2.0697 1.5775 0.5629 1.8290 2.4930 0.8543 1.0347 1.6931 2.2371 0.5024 0.6011 2.2489 2.4891 2.0499 1.3564 0.8308 2.0986 0.9208 1.3122 0.8011 1.7177 0.9333 1.7830 0.8466 0.6138 2.5047 0.4857 0.5809 2.2051 2.5133 2.5387 2.2247 1.2583 0.5153
Proof
Determine the maximum from a mathematical proof.
sin(x)≤1
so sin(tan(x))≤1 and tan(sin(x))≤tan(1) which means consequently
f(x)≤1+tan(1)
As x⇒π2, tan(x) oscillates and blows up; sof(x) is actually not defined at all at this point as was shown above
f(x)<1+tan(1)
Now we can take a look at the numerical value.
Main Content
This example describes how to analyze a simple function to find its asymptotes, maximum, minimum, and inflection point.
Define a Function
The function in this example is
f(x)=3×2+6x-1×2+x-3.
First, create the function.
syms x
num = 3*x^2 + 6*x -1;
denom = x^2 + x - 3;
f = num/denom
Plot the function by using fplot
. The fplot
function automatically shows vertical asymptotes.
Find Asymptotes
To find the horizontal asymptote of f mathematically, take the limit of f as x approaches positive infinity.
The limit as x approaches negative infinity is also 3. This result means the line y=3 is a horizontal asymptote to f.
To find the vertical asymptotes of f, set the denominator equal to 0 and solve it.
roots
indicates that the vertical asymptotes are the lines
x=-1-132
and
x=-1+132.
Find Maximum and Minimum
You can see from the graph that f has a local maximum between the points x=–2 and x=0. It also has a local minimum between x=–6 and x=–2. To find the x-coordinates of the maximum and minimum, first take the derivative of f.
f1 =6 x+6x2+x-3-2 x+1 3 x2+6 x-1x2+x-32
To simplify this expression, enter the following.
f1 =-3 x2+16 x+17x2+x-32
Next, set the derivative equal to 0 and solve for the critical points.
crit_pts =(-133-83133-83)
As the graph of f shows, the function has a local minimum at
x1=-8-133
and a local maximum at
x1=-8+133.
Plot the maximum and minimum of f
.
fplot(f) hold on plot(double(crit_pts), double(subs(f,crit_pts)),'ro') title('Maximum and Minimum of f') text(-4.8,5.5,'Local minimum') text(-2,4,'Local maximum') hold off
Find Inflection Point
To find the inflection point of f, set the second derivative equal to 0 and solve for this condition.
f2 = diff(f1);
inflec_pt = solve(f2,'MaxDegree',3);
double(inflec_pt)
ans = 3×1 complex
-5.2635 + 0.0000i
-1.3682 - 0.8511i
-1.3682 + 0.8511i
In this example, only the first element is a real number, so this is the only inflection point. MATLAB® does not always return the roots to an equation in the same order.
Instead of selecting the real root by indexing into inter_pt
, identify the real root by determining which roots have a zero-valued imaginary part.
idx = imag(double(inflec_pt)) == 0; inflec_pt = inflec_pt(idx)
inflec_pt =-139 16954-2197181/3-16954-2197181/3-83
Plot the inflection point. The extra argument [-9 6]
in fplot
extends the range of x values in the plot so that you can see the inflection point more clearly, as the figure shows.
fplot(f,[-9 6]) hold on plot(double(inflec_pt), double(subs(f,inflec_pt)),'ro') title('Inflection Point of f') text(-7,1,'Inflection point') hold off
Здравствуйте, уважаемые читатели. Продолжаем разбираться в Matlab. И сегодня наша тема связанна с численной оптимизацией — нахождением локальных и глобальных экстремумов функций одной или нескольких переменных в среде Matlab.
Общие сведения
Итак, в этом блоке ничего про Matlab не будет, лишь информация о понятии оптимизации. Это понятие сводится к терминам минимума и максимума функции, или, если коротко — экстремумам.
Под минимумом понимают такое значение функции, которое в некоторой окрестности этой функции, принимает наименьшее значение из всех возможных значений в этой окрестности. Соответственно максимум — это наибольшее значение функции в какой-либо окрестности.
Если не понятно — вот простой пример с всеми известной параболой:
У этой функции есть один минимум, и он находится в точке x = 0. Эта точка называется точкой минимума, а само значение этой функции есть минимум (он тоже равен 0). Максимумов у этой функции нет, но если бы функцию перевернули вверх ногами, то он бы появился.
Часто встречаются сложные функции, у которых есть несколько и минимумов и максимумов. И в таком случае, разделяют понятия локального и глобального экстремума. Локальный — это тот экстремум, который определен в некоторой области, а глобальный — на всей области определения функции. На рисунке выше представлен глобальный минимум параболы.
И теперь, когда вы хоть как то познакомились с понятиями оптимизации и нахождения экстремумов функции, можем перейти к нахождению максимумов и минимумов в Matlab. Далее, как обычно мы будем разбирать примеры различной сложности. Часть примеров будет содержать в себе стандартные команды Matlab для нахождения минимума и максимума функции, а другая часть — это реализация метода с нуля.
Стандартные методы Matlab
Разберем 2 задачи нахождения минимума в Matlab:
1 пример. Вычислить минимум функции f(x)=-x1/x, определив графически интервал его локализации. Вычисления провести с минимальным шагом по аргументу 1*10-5
Для начала создадим скрипт, который отобразит эту функцию. Вот код для этого:
x = 0.00001:0.00001:10; y = -x.^(x.^(-1)); plot (x,y); hold on; grid on;
Запускаем скрипт и получаем:
По графику функции делаем вывод, что имеется один минимум, и его координаты находятся в интервале 2.5 — 3, то есть мы сократим интервал поиска минимума.
Теперь создадим еще один скрипт, дадим ему название first.m и пропишем в него функцию:
function fun=first(x) fun = -x.^(x.^(-1)); end
Таким образом в этом m-файле мы определили функцию. Теперь в командном окне мы пропишем следующий код:
>> [x,y] = fminbnd(@first,2.5,3)
И получаем такие значения:
x = 2.7183 — координата точки минимума
y = -1.4447 — значение минимума
В этой части кода мы использовали стандартный метод Matlab для нахождения минимума функции — fminbnd. мы передаем 3 параметра — саму функцию и интервалы для поиска минимума. Стоит отметить, что этот метод подходит только для функций, зависящих от одной переменной.
Итак, для этой задачи мы создали 2 скрипт-файла, которые вы можете скачать в конце статьи.
2 пример. Вычислить минимум функции двух переменных x4+y4-2x2+4xy-2y2+1 с точность 1*10-5.
Координаты начальной точки поиска [1.0,-1.0].
Для начала построим график функции от двух переменных — для этого создадим новый скрипт и пропишем там этот код:
[x y] = meshgrid(-2:0.1:2, -2:0.1:2); z = x.^4 + y.^4 - 2*x.^2 + 4 * x.*y - 2*y.^2 + 1; surf(x,y,z);
Функция surf позволяет строить трехмерные графики и отображать глубину значений функции для лучшего понимания. Запускаем скрипт — в итоге получился такой график:
Как видно из графика, имеется два участка, где присутствует локальный минимум (темно-синие участки), и наша задача найти координаты и значения двух этих точек. Воспользуемся стандартными инструментами Matlab и создадим новый скрипт с именем second.m, в котором и пропишем код:
function fun=second(x) fun = x(1)^4 + x(2)^4 - 2*x(1)^2 + 4 * x(1)*x(2) - 2*x(2)^2 + 1; end
После этого, в командной строке, как и для первой задачи, прописываем стандартную функцию Matlab:
>> [z,f,exitflag,output] = fminsearch(@second, [1.0,-1.0], optimset('TolX',1e-5))
Получаем такой вывод:
z = 1.4142 -1.4142 f = -7.0000 exitflag = 1 output = iterations: 40 funcCount: 74 algorithm: 'Nelder-Mead simplex direct search' message: [1x196 char]
Для нахождение минимумов в Matlab на этот раз мы использовали функцию fminsearch. Эта функция реализует симплекс — метод Нелдера-Мида. В выводе мы получили несколько переменных: в z записались значения координат точек минимума, в f само значение этого минимума. А в переменных exitflag и output помещены условия прерывания процесса поиска и информация об оптимизации соответственно.
В итоге у нас опять получилось 2 m-файла.
Метод Ньютона Matlab
А теперь попробуем сами реализовать метод Ньютона для оптимизации функции.
3 пример. Методом Ньютона найти точку минимума x* и минимальное значение f* функции f(x)=(x-2)4-lnx на отрезке xє[2;3] c точностью 10-7
Начнем с того, что создадим новый скрипт и назовем его Newton.m. Затем пропишем в нем код:
function [Xk, Yk] = Newton(f,diap) a = diap(1); % границы b = diap(2); df = char(diff(sym(f))); % символьно ищем первую ddf = char(diff(sym(df))); % и вторую производные F = inline(f); % преобразуем в функции F1 = inline(df); F2 = inline(ddf); eps = 0.0000001; % задаем точность if F(a)*F2(a) > 0 % проверка с какой границы начинать искать Xk = b; else Xk = a; end while abs(F1(Xk)) > eps X0 = Xk; % X0 - значение предыдущего шага Xk = X0 - (F1(X0)/(F2(X0))); % расчет нового значения Yk = F(Xk); end end
Вполне понятная функция, которая работает с первой и второй производной символьной функции, которую получает в качестве параметра. Также в параметрах принимается диапазон. Эта функция возвращает координаты точки и значение экстремума.
Теперь нам осталось вызвать эту функцию в командном окне:
>> fun = '(x-2)^4 - log(x)'; >> diap = [2,3]; >> [Xk, Yk] = Newton(fun, diap);
В итоге получилось:
Xk = 2.4663
Yk = -0.8554
Не будем приводить график, но вы сами можете проверить, что значения найдены правильно. Важно сказать, что этот метод позволяет найти только локальный экстремум, и если на выбранном диапазоне есть несколько экстремумов, то метод может найти не тот, который нужен вам.
Также, очень важно задавать как можно узкий диапазон поиска, иначе метод может работать некорректно, особенно это проявляется с периодическими функциями по типу cos(x) и т.п.
Заключение
Ну что ж, в этой статье мы рассмотрели некоторые методы для нахождения экстремумов в Matlab. Мы использовали как стандартные методы, так и реализовали метод Ньютона в среде Matlab. Их исходники чуть ниже.
Скачать исходники
На этом сегодня все, оставляйте ваши комментарии и задавайте вопросы.
как найти максимум функции в матлаб?
Знаток
(286),
на голосовании
11 лет назад
Голосование за лучший ответ
Andy Lee
Мастер
(1394)
11 лет назад
В матлабе есть пакет символьных вычислений, там вы можете найти производную функции (diff), далее вам нужно найти точку в которой производная = 0 (solve(резул-т дифф.) ) – нашли необход. условие сущ-ния экстремума в x0. Дальше – по определению максимума – f(x) <= f(x0) для всех х (справа и слева от х0) (или найти вторую производную в точке х0 и если она меньше 0 – точка локального макимума – собрать все найти максим).
Джеймс Девиван
Гуру
(4877)
6 лет назад
Минимум одномерной функции отыскивают с помощью команды fminsearch. Для поиска
максимума функции f (x) достаточно найти минимум функции – f (x), поэтому специальной
функции для поиска максимумов в MATLAB не существует.
Оптимизация
Оптимизация — в математике, информатике и исследовании операций задача нахождения экстремума (минимума или максимума) целевой функции в некоторой области конечномерного векторного пространства, ограниченной набором линейных и/или нелинейных равенств и/или неравенств.
Теорию и методы решения задачи оптимизации изучает математическое программирование.
Классификация
Одномерная оптимизация – целевая функция – это функция одной переменной.
Многомерная оптимизация – целевая функция – функция нескольких переменных.
Безусловная оптимизация – область, в которой происходит поиск решения задачи оптимизации, ничем не ограничена.
Условная оптимизация – область, в которой происходит поиск решения задачи оптимизации, ограничен набором линейных и/или нелинейных равенств и/или неравенств.
Безусловная оптимизация в MATLAB
Для решения задачи безусловной оптимизации в MATLAB встроены функции fminsearch
и fminunc
.
Функция fminsearch
реализует симплексный алгоритм Нелдара-Мида. Его идея заключается в следующем: на предварительном шаге выбирается n + 1
точек, не расположенных в одной гиперплоскости. Эти точки являются вершинами симплекса, откуда название алгоритма. Точка, в которой значение функции максимально, удаляется и вместо неё по определённым правилам выбирается другая. Итерации продолжаются до тех пор, пока симплекс не станет достаточно малым. Алгоритм Нелдера-Мида можно использовать для оптимизации негладких и даже разрывных функций.
Функция fminunc
реализует несколько методов гладкой безусловной оптимизации:
- метод наискорейшего спуска (Steepest Descent method)
- квази-Ньютоновский BFGS-метод (Broyden–Fletcher–Goldfarb–Shanno)
- квази-Ньютоновский DFP-метод (Davidon–Fletcher–Powell)
- методы, основанные на построении доверительных двумерных областей (trust region)
Первые три из них отнесены к «medium-scale»-методам и предназначены для решения задач оптимизации средней размерности (например, не больше 100 переменных), последний — к «large-scale»-методам. По умолчанию, если пользователь задает аналитическое выражение для градиента, запускается метод доверительного интервала. В противном случае используется BFGS-метод, но есть возможность переключиться и на
другие. Метод наискорейшего спуска, как правило, очень медлителен и его не рекомен-дуется использовать для решения практических задач. В Matlab-е он присутствует только для иллюстративных целей.
fminsearch
x = fminsearch(fun,x0) x = fminsearch(fun,x0,options) [x,fval] = fminsearch(...) [x,fval,exitflag] = fminsearch(...) [x,fval,exitflag,output] = fminsearch(...)
Входные параметры:
fun
– указатель на функцию. Например,@function_name
, если функция уже где-то определена, либоfun = '4*x.^2+3'
, т.е. можно просто задать строку, содержащую запись функции.x0
– стартовая точка.options
– стрктура, задающая различные дополнительные опции. Поля структуры:Display
– определяет объём информации, который будет выводить функция в процессе работы. Возможные значения:off
илиnone
– ничего не будет выведено в консоль.iter
– выводить информацию на каждой итерации алгоритма.notify
– выводить инфорацию только в том случае, если не удаётся найти решение (only if the function does not converge).final
(по умолчанию) – вывести финальные результаты.
FunValCheck
– проверяет, валидные ли значения возвращает функция. Возможные значения:on
– выводит сообщение об ошибке, если функция вернулаcomplex
,Inf
илиNaN
.off
(по умолчанию) – противоположно случаюon
.
MaxFunEvals
– маскимально допустимое число подсчёта значений функции. Положительное число. По умолчанию200 * numberOfVariables
.MaxIter
– маскимально допустимое число итераций алгоритма. Положительное число. По умолчанию200 * numberOfVariables
.OutputFcn
– позволяет укзать одну или более пользовательских функций, которые будут вызываться на каждой итерации.PlotFcns
– позволяет указать одну или более пользовательских функий, которые будет рисовать прогресс алгоритма. В MATLAB уже доступно несколько функций:@optimplotx
plots the current point.@optimplotfunccount
plots the function count.@optimplotfval
plots the function value.
TolFun
– Termination tolerance on the function value, a positive scalar. The default is 1e-4.TolX
– Termination tolerance on x, a positive scalar. The default value is 1e-4.
Выходные параметры:
x
– найденная точка локального минимума.fval
– значение функции в найденной точке.exitflag
– описывает причину, по которой функция завершила свою работу. Возможные значения:1
– найдено решениеx
.0
– превышено число итерацийoptions.MaxIter
или число вычислений функцииMaxFunEvals
.-1
– алгоритм был остановлен функциейoptions.OutputFcn
.
output
– структура, содержащая информацию об оптимизации. Поля структуры:iterations
– число выполненных итераций.funcCount
– число вычислений значения функции.algorithm
– название алгоритма: ‘Nelder-Mead simplex direct search’.message
– причина завершения работы функции (в виде текстового сообщения).
Пример
fun = @myfunc; % '4 * x^2 + 2 * x + 3'; [x, y, exitflag, output] = fminsearch(fun, -20); x, y, exitflag, output X = -1:0.1:1; Y = myfunc(X); hold on; plot(X, Y, '-r'); plot(x, y, '*b'); hold off;
myfunc.m:
function [Y] = myfunc(X) Y = 4 * X.^2 + 2 * X + 3;
Результат работы:
x =
-0.2500
y =
2.7500
exitflag =
1
output =
iterations: 22
funcCount: 44
algorithm: 'Nelder-Mead simplex direct search'
message: 'Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04
and...'
fminunc
x = fminunc(fun,x0) x = fminunc(fun,x0,options) x = fminunc(problem) [x,fval] = fminunc(...) [x,fval,exitflag] = fminunc(...) [x,fval,exitflag,output] = fminunc(...) [x,fval,exitflag,output,grad] = fminunc(...) [x,fval,exitflag,output,grad,hessian] = fminunc(...)
Одномерная условная оптимизация в MATLAB
Функция f(x)
одного аргумента x
называется унимодальной на отрезке [a, b]
, если на нём найдется такая точка x0
(точка минимума), что f(x)
монотонно убывает при a ≤ x ≤ x0
и монотонно возрастает при x0 ≤ x ≤ b
. Для минимизации унимодальной функции, заданной на отрезке Matlab предоставляет функцию fminbnd
.
Ее можно применять и для минимизации функций, не являющихся унимодальными. В этом случае будет найден локальный минимум. fminbnd
использует комбинацию методов золотого сечения и последовательной параболической интерполяции. Реализована функция в виде m-файла, поэтому желающие могут ознакомиться с деталями по исходному коду.