Matlab fminunc不收敛

Matlab fminunc不收敛,matlab,optimization,Matlab,Optimization,我使用fminunc最小化一个有450个变量的函数,下面是几行 opts = optimset('Display','Iter','MaxIter', 10000000,'MaxFunEvals', 100000000,'TolX', 1e-12,'TolFun', 1e-12); [x,fval,exitflag] = fminunc(@function,x0,opts); 请注意,我没有提供梯度,因此fminunc使用准牛顿算法。 经过一些迭代之后,它以这最后一条消息结束 fminun

我使用fminunc最小化一个有450个变量的函数,下面是几行

 opts = optimset('Display','Iter','MaxIter', 10000000,'MaxFunEvals', 100000000,'TolX', 1e-12,'TolFun', 1e-12);
 [x,fval,exitflag] = fminunc(@function,x0,opts);
请注意,我没有提供梯度,因此fminunc使用准牛顿算法。 经过一些迭代之后,它以这最后一条消息结束

fminunc stopped because it cannot decrease the objective function
along the current search direction.
但是,如果我用获得的新点重新启动代码,它会继续减少,所以我不是最小值。 在我看来,算法只是沿着一个方向简单地寻找最小值,当它找到它时,它停止而开始在其他方向之间搜索

有没有任何线索可以帮助你修改问题,使其不会发生,并找到最小值?或者其他我应该使用的程序,以便更快地完成它


编辑:函数是凸的

如果目标函数中存在数值噪声,则可能会出现此类问题。然后梯度/黑森变得嘈杂,阶跃消失,直线搜索以该错误结束

尝试在起始值周围的间隔内绘制标准,但将其中一个参数从x0(i)更改为 linspace(x0(i)(1-1e07,x(i)(1+1e07),100),一次一个数字

如果函数看起来非常不稳定,那可能是您的问题

或者,您可能从函数不是凸的区域开始?在这种情况下,请尝试从fminsearch开始

另外,考虑使用解析梯度。


另外,可能您的容差设置得太精细了。尝试将tolfun和tolx减少到1e-08。您的问题是非常高维的。

我认为fminunc查找局部最小值而不是全局最小值,如果您查找全局最小值,您可能必须进行一些凸优化函数是凸的,因此不应该是p问题。如果函数实际上是凸的,你可能会有一些缩放问题。请发布你试图优化的函数。好吧,我希望所有450个变量都具有相同的magnitud阶数,因此它也不应该是缩放问题。函数有时真的很复杂,即使是我,谁实现了它,也很难取消缩放我想它不会有多大用处,我只是想知道fminunc这种奇怪的行为是否有一个“简单”的解决方案。