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. Их исходники чуть ниже.
Скачать исходники
На этом сегодня все, оставляйте ваши комментарии и задавайте вопросы.
Тема
5.6. Технология решения задач одномерной
оптимизации средствами MatLab
Пакет MatLab,
также
как и пакет MathCad,
с помощью встроенных функций решает
задачу нахождения только локального
экстремума. Для нахождения глобального
экстремума необходимо вычислить все
локальные экстремумы и выбрать среди
них наибольший (наименьший).
В MatLab
поиск локального минимума осуществляет
функция:
[x,y]=fminbnd(name,a,b,[,options]),
где
name
– имя m-функции,
вычисляющей значение f(x);
a,
b
– границы интервала, на котором
осуществляется поиск минимума;
Options–
параметр, управляющий ходом решения;
x,
y
– координаты точки, в которой
достигается минимум функции на заданном
интервале.
Пример 4.6-1. Найти
локальные экстремумы функции
f(x)=x4-0.5x3-28x2+140.
|
% function y=x.^4-0.5*x.^3-28*x.^2+140; end %—————————————— %Построение >> >> >>plot(x,y,’-k’) > x y >> x y >> x y >> x y >> |
Пример 4.6-2. Найти
минимальное значение функции f(x)=24–2x
/3+x2/
30 наотрезке [5;20].
|
x y plot(x, >>[x, >> 10.0000 >>у 20.6667 |
[Введите текст] Страница
22
Соседние файлы в папке Учебное пособие
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Определение 1(
локальный экстремум). Говорят, что функция f имеет локальный минимум в точке x = p, если существует такой открытый
интервал I,
содержащий p,
что f(p)<=f(x) для всех xÎI. Аналогично говорят, что функция f имеет локальный максимум в точке x = p, если f(x) <= f(p) для всех x∈I. Если функция f имеет или локальный минимум, или
локальный максимум в точке x
= p,
то говорят, что она имеет локальный экстремум в точке x = p.
Определение 2(возрастание
и убывание функции). Предположим, что функция f(x) определена на интервале I.
·
Если из неравенства x1<x2 следует, что f( x1)<f(x2) для всех x1, x2∈I, то говорят, что функция f возрастает на интервале I.
·
Если из неравенства x1<x2 вытекает, что f( x1)>f(x2) для всех x1, x2∈I, то говорят, что функция f убывает на интервале I.
Теорема 1.
Предположим, что функция f(x) непрерывна на интервале I=[a,b] и дифференцируема на (a,b).
·
Если f ‘(x)>0 для всех x∈(a,b), то функция f(x) является возрастающей на
интервале I.
·
Если f ‘(x)<0 для всех x∈(a,b), то функция f(x) является убывающей на интервале I.
Теорема 2.
Предположим, что функция f(x) определена на отрезке I=[a,b] и имеет локальный экстремум во
внутренней точке p∈(a,b). Если f(x) дифференцируема в точке x=p, то f ‘(x)=0.
Теорема 3(критерий
первой производной). Предположим, что функция f(x) непрерывна на отрезке I=[a,b]. Кроме того, предположим, что
f ‘(x) определена для всех x∈(a,b) за исключением, возможно точки x=p.
·
Если f ‘(x)<0 на интервале (a,p) и f ‘(x)>0 на (p,b), то f(p) – локальный минимум.
·
Если f ‘(x)>0 на интервале (a,p) и f ‘(x)<0 на (p,b), то f(p) – локальный максимум.
Теорема 4(критерий
второй производной). Предположим, что функция f
непрерывна на отрезке [a,b] и f ‘ и f » определены на (a,b). Также предположим, что p(a,b) – критическая точка, в которой f ‘ (p)=0.
·
Если f »(p)>0, то значение f(p) является локальным минимумом f.
·
Если f »(p)<0 то значение f(p) является локальным максимумом f.
·
Если f »(p)=0, то этот критерий не является
окончательным.
Пример 1.
Используем критерий второй производной, чтобы
классифировать локальный экстремум функции f(x)= x^3 +x^2 — x+1 на интервале [-2,2].
Первая
производная равна f ‘(x)=3x^2+2x-1= (3x-1)(x+1), а вторая — f »(x) = 6x+2. Существуют две точки,
в которых f ‘(x)=0 (т. е. x=1/3, -1).
Случай
(1). Находим, что в точке x=1/3
f ‘(1/3)=0
и f »(1/3)=4>0;
таким образом, функция f(x) имеет локальный минимум в точке x=1/3.
Случай
(2). Находим, что в точке x=-1 f ‘(-1)=0 и f »(-1)=-4<0; таким образом,
функция f(x) имеет в точке x=-1 локальный максимум.