嗯……
如果没有进一步的信息,我猜它会fmincon
用完内存,因为它需要 Hessian(鉴于您的决策变量是 10^4,它会10^4 x numel(f(x1,x2,x3,....))
很大)。
确定 Hessian 的值也需要很多时间,因为fmincon
如果您没有明确指定导数,通常会使用有限差分。
您可以做几件事来加快速度。
如果您事先知道 Hessian 矩阵中会有很多零,则可以通过 传递 Hessian 矩阵的稀疏模式HessPattern
。这节省了大量的内存和计算时间。
如果很容易为您的目标函数的 Hessian 提出明确的公式,请创建一个计算 Hessian 的函数并通过optimset 中fmincon
的选项将其传递给。HessFcn
梯度也是如此。(GradConstr
对于您的非线性约束函数)和/或GradObj
(对于您的目标函数)适用于此处。
我可能在这里忘记了一些选项,这也可以帮助您。只需浏览优化工具箱的optimset中的所有选项,看看它们是否可以帮助您。
如果这一切都没有帮助,你真的必须切换优化器。鉴于这fmincon
是 MATLAB 优化工具箱的骄傲和乐趣,确实没有比这更好的现成工具了,您必须在其他地方搜索。
TOMLAB是一个非常好的 MATLAB 商业解决方案。如果您不介意使用 C 或 C++...有SNOPT(这是 TOMLAB/SNOPT 的基础)。还有很多你可以在 GSL 中尝试的东西(虽然我还没有看到像 SNOPT 那样先进的东西......)。
我不知道您使用的是哪个版本的 MATLAB,但我知道在 R2009b(可能还有更高版本)中,fmincon
对于某些类型的问题有一些真正的弱点。我很清楚这一点,因为我曾经因此输掉了一场非常有声望的比赛(GTOC)。我们的方法结果与获胜者的方法完全相同,除了他们可以访问 SNOPT,这使得他们的几百万个变量优化问题在几次迭代中收敛,而根本fmincon
无法收敛,无论我们如何尝试过(相信我,我们尝试过)。直到今天,我仍然不知道为什么会发生这种情况,但是当我可以访问 SNOPT 时,我自己验证了它。有一次,当我有无限的时间时,我会发现这一点并将其报告给 MathWorks。但在那之前……我失去了一点信任fmincon
:)