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

4 ビュー (過去 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 Center および File ExchangeCalculus についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!