请教符号计算及fminbnd求极值的局限性。

3 次查看(过去 30 天)
jivipa
jivipa 2022-11-23
回答: jifac 2022-11-23
目标:求y=sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1)在-10到10区间上的极值。
(1)利用符号计算,即导数为零法
代码
syms x
y=sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1);
yd=diff(y,x);
xs0=solve(yd,x)
yd_xs0=vpa(subs(yd,x,xs0),6)
y_xs0=vpa(subs(y,x,xs0),6)
结果
(极值点)xs0 =
0.050838341410271656880659496266968
yd_xs0 =
2.29589e-41
(导数为0时的函数值)y_xs0 =
-0.00126332
(2)fminbnd求极小值
代码
x1=-10;x2=10;
[xn0,fval,exitflag,output]=fminbnd(yx,x1,x2)
结果
xn0 =
2.5148
fval =
-0.4993
exitflag =
1
output =
iterations: 13
funcCount: 14
algorithm: 'golden section search, parabolic interpolation'
message: [1x111 char]搜索区间
(3)绘图y(x)图像,重设(收窄)fminbnd搜索区间
x11=6;x2=10;
[xn00,fval,exitflag,output]=fminbnd(yx,x11,x2)
得出:xn00 =
8.0236
fval =
-3.5680
exitflag =
1
output =
iterations: 9
funcCount: 10
algorithm: 'golden section search, parabolic interpolation'
message: [1x111 char]
求出真正的最小极值点
疑问:(1)从图看目标函数有不止一个导数为0的点,为什么用符号法solve指令只找到一个导数为0的点,符号计算不是绝对精准的吗?
(2)为什么区间收窄了,fminbnd反而找到了同样存在于此前大区间的极值点?感觉这与数学直觉不符,这是由fminbnd的算法决定的吗?
望大家指点一二^_^

采纳的回答

jifac
jifac 2022-11-23
solve 解的这个方程是超越方程,且是多根的。solve 一般难以求出超越方程多根里的所有根,这里能求出一个已经算不错了。
fminbnd 是根据你指定的区间去搜索该区间内的极值点,但一次搜索只会返回一个极值点,当你给定的区间内有多个极值点时,具体返回的是哪个特定极值点要看fminbnd内部迭代的规则和函数特性而定,但可以肯定的是,返回的极值点必然位于你的初值区间内。如果你想针对某个特定的极值点搜索,那么你的区间就缩小到只包含该极值点,如果有多个极值点,就采用多个区间,每个只包含一个极值点去进行多次调用

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Calculus 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!