这个问题可能与数学理论有关,也可能与数学理论无关,但我还是想问一下。我有一个TESTCase.m
如下:
function ret=TESTCase(Input,k)
if k==1
if Input(2)~=1
Input(2)=1;
ret=(Input(1)-2).^2+5.*Input(2).^2;
end
else if k~=1
ret=(Input(1)-2).^2+(Input(2)-Input(1)).^2;
end
end
然后,我尝试使用fminunc和fminsearch如下:
TEST=@(x)TESTCase(x,1); fminsearch(TEST,[5,3]); fminunc(TEST,[5,3]);
我分别得到两个答案:2.0000 3.9000
(使用fminsearch)和2.0000 3.0000
(使用fminunc)
我知道这两个答案是正确的下我的函数定义,但我想知道为什么它改变第二个值时使用fminsearch
,但显示没有变化时使用fminunc
。这对我来说很奇怪。同样,当使用fminsearch时,不显示任何消息,但使用fminunc时,显示以下消息:
Warning: Gradient must be provided for trust-region algorithm;
using line-search algorithm instead.
In fminunc at 382
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the function tolerance.
<stopping criteria details>
。有什么不同?我知道fminsearch
是无衍生的,fminunc
不是,但如果消息输出,这应该意味着fminunc
在这种情况下也是无衍生的;在这种情况下,它们应该是等价的。
fminsearch
和fminunc
使用不同的无导数算法:fminsearch
使用某种单纯形搜索方法,fminunc
使用线搜索方法。由于正确选择下降方向,fminunc
在两次迭代中找到最小值:
Iteration Func-count f(x) Step-size optimality
0 3 14 6
1 6 9 0.166667 4
2 9 5 1 0
在这种情况下,单纯形法并不是最优的。fminsearch
的优化细节如下:
Iteration Func-count min f(x) Procedure
0 1 14
1 3 14 initial simplex
2 5 11.25 expand
3 6 11.25 reflect
4 8 7.25 expand
5 9 7.25 reflect
6 11 5.25 reflect
7 12 5.25 reflect
8 14 5 contract outside
9 15 5 reflect
10 17 5 contract inside
11 19 5 contract inside
12 21 5 contract inside
13 23 5 contract inside
14 25 5 contract inside
15 27 5 contract inside
16 29 5 contract inside
17 31 5 contract inside
18 33 5 contract inside
19 35 5 contract inside
20 37 5 contract inside
21 39 5 contract inside
22 41 5 contract inside
23 43 5 contract inside
24 45 5 contract inside
25 47 5 contract inside
26 49 5 contract inside
27 51 5 contract inside
28 53 5 contract inside
29 55 5 contract inside
30 57 5 contract inside
31 59 5 contract inside
32 61 5 contract inside
33 63 5 contract inside
34 65 5 contract inside
35 69 5 shrink
36 73 5 shrink
37 77 5 shrink
38 81 5 shrink
39 85 5 shrink
40 89 5 shrink
41 93 5 shrink
42 97 5 shrink
43 101 5 shrink
44 105 5 shrink
45 109 5 shrink
很难说为什么fminsearch
的结果恰好是2.0000 3.9000
。