matlab中的lsqnonlin优化错误

时间:2015-04-16 17:25:35

标签: matlab optimization

我在Matlab中遇到解决优化问题的问题。我有一个客观的功能,我需要最小化。

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

[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算法不处理约束约束和 信任区域反射算法至少需要与变量一样多的方程;中止。

你能告诉我出了什么问题吗?这是我在Matlab中首次尝试优化工具箱,所以我不知道很多东西。

1 个答案:

答案 0 :(得分:0)

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

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

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

  1. 线性?
  2. 二次?
  3. 最小二乘? (这是您选择lsqnonlin的建议,但我怀疑您的目标函数E是标量函数)
  4. 平滑非线性?
  5. 非光滑?
  6. 结合您的约束约束,目标函数的类型将在choosing a solver页面的表格中显示可用的选项。此时,请务必阅读您选择的优化功能的文档,以获得最佳结果。