Эта демонстрация показывает, как найти экстрему функций с помощью аналитических и численных методов с помощью Symbolic Math Toolbox.
Первые производные: нахождение локального минимума и максимума функции
Вторые производные: нахождение точек инфляции функции
Пределы: Функции с Suprema
Вычисление первой производной выражения помогает вам найти локальные минимумы и максимумы этого выражения. Для примера создайте рациональное выражение, где числитель и знаменатель являются полиномиальными выражениями:
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