这个演示演示了如何使用符号数学工具箱使用解析和数值技术找到函数的极值。
一阶导数:求函数的局部极小值和极大值
二阶导数:求函数的膨胀点
限制:使用Suprema函数
计算一个表达式的一阶导数可以帮助你找到这个表达式的局部极小值和极大值。例如,创建一个有理表达式,其中分子和分母是多项式表达式:
信谊<年代pan style="color:#A020F0">x年代pan>f = (3 * x ^ 3 + 17 * x ^ 2 + 6 * x + 1) / (2 * x ^ 3 + x * (1 + 3)
f =
绘制这个表达式表明,它有水平和垂直的渐近线,局部最小值在-1和0之间,局部最大值在1和2之间:
fplot (f)
默认情况下,当您对该表达式进行操作时,结果可以包括实数和虚数。如果你只对实数感兴趣,你可以设置一个永久的假设,即x属于实数集合。这可以让你在解决方案中避免复数,它也可以提高性能:万博 尤文图斯
假设(x,<年代pan style="color:#A020F0">“真实”的年代pan>)
为了求水平渐近线,计算的极限<年代pan class="inlineequation"> 对于x趋于正无穷和负无穷。水平渐近线是<年代pan class="inlineequation"> :
[limit(f, x, sym(inf)), limit(f, x, -sym(inf))]
ans =
求…的垂直渐近线<年代pan class="inlineequation"> ,求代表的分母的多项式表达式的根<年代pan class="inlineequation"> :
解(2 * x^3 + x * -1 + 3 == sym(0), x)
ans =
要得到此类方程的显式解,请尝试使用该选项调用求解器MaxDegree
.该选项指定求解器试图返回显式解的多项式的最大阶数。万博 尤文图斯默认情况下,MaxDegree
= 2
.增加这个值,你可以得到高阶多项式的显式解。万博 尤文图斯例如,指定MaxDegree
= 3
得到显式解:
解(2 * x^3 + x * -1 + 3 == 0, x,<年代pan style="color:#A020F0">“MaxDegree”年代pan>3)
ans =
你可以用数值来近似精确的解vpa
函数。
vpa (ans, 6)
ans =<年代pan class="inlineequation">
现在找出表达式的局部最小值和最大值f
.如果这个点是一个局部极值点(无论是极小值还是极大值),表达式在该点的一阶导数等于零。要计算表达式的导数,使用diff
功能:
G =微分(f, x)
g =
求的局部极值f
,解方程g = 0
.如果你使用MaxDegree
选项时,求解器返回长显式解,可通过使用浮动
功能:
解(g == 0, x,<年代pan style="color:#A020F0">“MaxDegree”年代pan>4);极值= vpa(ans, 6)
极值=
表达的情节f
说明x = -0.189是表达式的局部极小值,x = 1.286是表达式的局部极大值。
fplot (f)<年代pan style="color:#A020F0">在年代pan>情节(极值,潜艇(f,极值),<年代pan style="color:#A020F0">‘*’年代pan>)举行<年代pan style="color:#A020F0">从年代pan>
计算二阶导数可以找到表达式的拐点。
H (x) =简化(diff(f, x, 2))
h (x) =
找到拐点<年代pan class="inlineequation">
,解方程h = 0
.对于这个方程,符号求解器返回一个复杂的结果,即使您使用MaxDegree
选择:
解(h == 0, x,<年代pan style="color:#A020F0">“MaxDegree”年代pan>4)
ans =
为了得到更简单的数值结果,可以用该方法对方程进行数值求解vpasolve
;指定搜索范围,将返回结果限制为表达式的所有真实解:万博 尤文图斯
(h == 0, x, [-inf, inf])
拐点=
表达式f
有两个通胀点:x = 0.579和x = 1.865。
fplot (f)<年代pan style="color:#A020F0">在年代pan>情节(极值,潜艇(f,极值),<年代pan style="color:#A020F0">‘*’年代pan>)情节(变形、潜艇(f,音调变化),<年代pan style="color:#A020F0">‘*’年代pan>)举行<年代pan style="color:#A020F0">从年代pan>
并不是所有的函数都可以解析处理;这个函数
在原点处非常平坦,并且在附近无限频繁地振荡<年代pan class="inlineequation"> ,当它趋近于0时变成线性,并在附近振荡<年代pan class="inlineequation"> .
F = @(x) tan(x) -sin(x)
f =<年代pan class="emphasis">function_handle与价值:@ (x)谭(sin (x)) sin (tan (x))
Fplot (f, [-pi, pi])
对于我们这里的目的来说,最重要的是,fplot选择了<年代pan class="emphasis">y相互重合,
ylim
ans =<年代pan class="emphasis">1×2-2.5488 - 2.5572
发生了什么年代trong> ?年代trong>
MATLAB使用双精度算法,所以<年代pan class="inlineequation"> 等于其中一个振荡。
π/ 2
ans = 1.5708
f(π/ 2)
ans = 2.5161
符号数学工具箱使用精确算术,这表明函数是未定义的。
信谊<年代pan style="color:#A020F0">x年代pan>信谊(π/ 2)
ans =
F =符号(F)
F =<年代pan class="inlineequation">
潜艇(F, x,信谊(π/ 2))
ans =<年代pan class="inlineequation">
我们也可以用泰勒级数来求。
T =泰勒(F, x,<年代pan style="color:#A020F0">“秩序”年代pan>10<年代pan style="color:#A020F0">“ExpansionPoint”年代pan>, 0)
T =
vpa(潜艇(T, x,π/ 2))
ans =<年代pan class="inlineequation">
持有<年代pan style="color:#A020F0">在年代pan>fplot(T) ylim([-3 3])保持<年代pan style="color:#A020F0">从年代pan>
微积分年代trong>
在微积分中,我们知道导数在零点处出现极大值。但是这个函数在附近是不可微的<年代pan class="inlineequation"> .我们可以分析区分<年代pan class="inlineequation"> 使用符号数学工具箱。
差异(F)
ans =<年代pan class="inlineequation">
fplot(diff(F), [-pi, pi])
抽样年代trong>
我们可以对函数进行N次采样<年代pan class="inlineequation"> 得到最大值的数值近似。这样就够了吗?
N = 100;xValues = 3*pi/8 + pi/4*rand(1,N)
xValues =<年代pan class="emphasis">1×1001.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.20144 1.2144 1.844 1.8248 1.7238 1.4271 1.9244 1.2052 1.5227 1.4778 1.7793 1.8026 1.3249 1.5628 1.7708
ySoln = f (xValues)
ySoln =<年代pan class="emphasis">1×1000.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 0.5153
马克斯(ySoln)
ans = 2.5387
证明年代trong>
从数学证明中确定最大值。
所以<年代pan class="inlineequation"> 和<年代pan class="inlineequation"> 这意味着结果
作为<年代pan class="inlineequation"> ,<年代pan class="inlineequation"> 振荡和爆炸;所以<年代pan class="inlineequation"> 实际上在这一点上根本没有定义,如上面所示
现在我们来看看数值。
格式<年代pan style="color:#A020F0">长年代pan>1 +棕褐色(1)
ans = 2.557407724654902