【问题标题】:lsqnonlin optimization error in MatlabMatlab中的lsqnonlin优化错误
【发布时间】:2015-04-17 01:52:24
【问题描述】:

我在解决 Matlab 中的优化问题时遇到问题。我有一个目标函数,我需要最小化。

我在 Matlab 中使用 lsqnonlin 函数运行这段代码:

[objective] = @(E) objective(E);
options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective','MaxFunEvals',2000);

lowb = [0.00001 0.00001 0.00001]; % lower bounds
uppb = [30 30 30]; % upper bounds

E0 = [0.00001 0.00001 0.00001]; %initial guess

problem = createOptimProblem('lsqnonlin', 'objective', objective, 'x0', E0, 'lb', lowb, 'ub', uppb, 'options', options);

ms = MultiStart;
matlabpool open
ms.UseParallel = 'always';
startpoints = RandomStartPointSet('NumStartPoints',100);
[E, fval, exitflag, output, solutions] = run(ms, problem, startpoints); 

matlabpool close

我终于得到了这个错误,我无法继续: Levenberg-Marquardt 算法不处理有界约束和 trust-region-reflective 算法至少需要与变量一样多的方程;中止。

你能告诉我出了什么问题吗?这些是我在 Matlab 中优化工具箱的第一次尝试,所以我不知道很多事情。

【问题讨论】:

  • RandomStartPointSet 中使用较少的起点,而不是使用upper/lower 边界,我认为这是您得到错误的根源

标签: matlab optimization


【解决方案1】:

lsqnonlin 函数允许您在'levenberg-marquardt''trust-region-reflective' 之间进行选择。您选择了'trust-region-reflective',但错误消息具有误导性,因为它报告了每个选项的不同要求。 lsqnonlinhere 的文档更清楚地解释了这一点。

在您的情况下,此错误是由于您的目标函数 E 返回的值(错误消息中提到的“方程式”)少于变量 (3)。 E 的输出是标量还是 2 向量?您可以通过将求解器更改为'levenberg-marquardt' 来避免此错误,但是您将不得不放弃绑定约束。

优化很复杂,并且对手头的具体问题非常敏感。 MathWorks 为choosing a solver 提供了相当全面的指南。在您的情况下,您需要描述您的目标函数(您忽略了发布)。是吗:

  1. 线性?
  2. 二次方?
  3. 最小二乘? (这是您选择 lsqnonlin 所暗示的,但我怀疑您的目标函数 E 是一个标量函数)
  4. 平滑非线性?
  5. 不流畅?

结合您的绑定约束,目标函数的类型将在choosing a solver 页面的表格中显示可用的选项。此时,请务必阅读您选择的优化函数的文档以获得最佳结果。

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 2014-08-22
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多