Эта демонстрация показывает, как найти экстремальное значение функций с помощью аналитических и числовых методов с помощью Symbolic Math Toolbox.
Первые производные: нахождение локального минимума и максимума функции
Вторые производные: нахождение точек инфляции функции
Пределы: функции с супремой
Вычисление первой производной выражения помогает вам найти локальные минимумы и максимумы того выражения. Например, создайте рациональное выражение, где числитель и знаменатель являются многочленными выражениями:
syms x
f = (3 * x^3 + 17 * x^2 + 6 * x + 1)/(2 * x^3 + x * -1 + 3)
f =
Графический вывод этого выражения показывает, что это имеет горизонтальные и вертикальные асимптоты, локальный минимум между-1 и 0, и локальный максимум между 1 и 2:
fplot(f)
По умолчанию, когда вы работаете с этим выражением, результаты могут включать и вещественные и мнимые числа. Если вы интересуетесь вещественными числами только, можно установить постоянное предположение, что x принадлежит набору вещественных чисел. Это позволяет вам избегать комплексных чисел в решениях, и это также может улучшать производительность:
assume(x, 'real')
Чтобы найти горизонтальную асимптоту, вычислите предел для x приближение к положительным и отрицательным бесконечностям. Горизонтальная асимптота :
[limit(f, x, sym(inf)), limit(f, x, -sym(inf))]
ans =
Найти вертикальную асимптоту , найдите корни многочленного выражения, которое представляет знаменатель :
solve(2 * x^3 + x * -1 + 3 == sym(0), x)
ans =
Чтобы получить явное решение для таких уравнений, попытайтесь вызвать решатель с опцией MaxDegree
. Опция задает максимальную степень полиномов, для которых решатель пытается возвратить явные решения. По умолчанию, MaxDegree
= 2
. Увеличивая это значение, можно получить явные решения для полиномов высшего порядка. Например, определение MaxDegree
= 3
приводит к явному решению:
solve(2 * x^3 + x * -1 + 3 == 0, x, 'MaxDegree', 3)
ans =
Можно аппроксимировать точное решение численно при помощи функции vpa
.
vpa(ans,6)
ans =
Теперь найдите локальный минимум и максимум выражения f
. Если точка является локальным экстремальным значением (или минимум или максимум), первая производная выражения в той точке равна нулю. Чтобы вычислить производную выражения, используйте функцию diff
:
g = diff(f, x)
g =
Чтобы найти локальные экстремальные значения f
, решите уравнение g = 0
. Если вы используете опцию MaxDegree
, решатель возвращает долгое явное решение, которое может быть аппроксимировано при помощи функции float
:
solve(g == 0, x, 'MaxDegree', 4);
extrema = vpa(ans, 6)
extrema =
График выражения, f
показывает, что x =-0.189 является локальным минимумом выражения и x = 1.286, является своим локальным максимумом.
fplot(f) hold on plot(extrema, subs(f,extrema), '*') hold off
Вычисление второй производной позволяет вам найти точки перегиба выражения.
h(x) = simplify(diff(f, x, 2))
h(x) =
Найти точки перегиба , решите уравнение h = 0
. Для этого уравнения символьный решатель возвращает сложный результат, даже если вы используете опцию MaxDegree
:
solve(h == 0, x, 'MaxDegree', 4)
ans =
Чтобы получить более простой числовой результат, решите уравнение численно при помощи vpasolve
; задайте поисковую область значений, чтобы ограничить возвращенные результаты всеми действительными решениями выражения:
inflection = vpasolve(h == 0, x, [-inf, inf])
inflection =
Выражение f
имеет две точки инфляции: x = 0.579 и x = 1.865.
fplot(f) hold on plot(extrema, subs(f,extrema), '*') plot(inflection, subs(f,inflection), '*') hold off
Не все функции могут быть обработаны аналитически; функция
является очень плоским в начале координат, и оно колеблется бесконечно часто рядом , становится линейным, когда это приближается к нулю и колеблется снова рядом .
f = @(x) tan(sin(x))-sin(tan(x))
f = function_handle with value:
@(x)tan(sin(x))-sin(tan(x))
fplot(f, [-pi , pi])
Самый важный для наших целей здесь, fplot выбрал предел на осях Y, чтобы быть
ylim
ans = 1×2
-2.5488 2.5572
В чем происходит ?
MATLAB использует арифметику двойной точности, таким образом, оценивает к одному из колебаний.
pi/2
ans = 1.5708
f(pi/2)
ans = 2.5161
Symbolic Math Toolbox использует точную арифметику, которая показывает, что функция не определена.
syms x
sym(pi/2)
ans =
F = sym(f)
F =
subs(F,x,sym(pi/2))
ans =
Мы можем также попытаться посмотреть на значение с Рядом Тейлора.
T = taylor(F,x,'Order',10,'ExpansionPoint',0)
T =
vpa(subs(T,x,pi/2))
ans =
hold on fplot(T) ylim ([-3 3]) hold off
Исчисление
Мы узнаем в исчислении, что максимум происходит в нуле производной. Но эта функция не дифференцируема около . Мы можем аналитически дифференцироваться использование Symbolic Math Toolbox.
diff(F)
ans =
fplot(diff(F), [-pi , pi])
Выборка
Мы можем выбрать функцию N времена рядом получить числовое приближение к значению максимума. Это достаточно хорошо?
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 = f(xValues)
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
max(ySoln)
ans = 2.5387
Доказательство
Определите максимум от математического доказательства.
так и что означает, следовательно,
Как , колеблется и аварийно завершается; так на самом деле не задан вообще в этой точке, как был показан выше
Теперь мы можем смотреть на численное значение.
format long
1 + tan(1)
ans = 2.557407724654902