matlab - 是否可以在 Matlab 中为 fmincon 的内点法定义最大步长(欧几里得距离)?
问题描述
我有兴趣限制 fmincon 的内点方法可以从当前点采取的最大步长。更具体地说,我想确保该方法在每一步都不能移动超过给定的欧几里得距离。该方法最终可能会走得更远,但不会一步到位。因此,换句话说,假设最大欧几里得距离为 1.0,局部优化器可以从 x0 = 3 变为 x = 6,但它至少需要 3 次移动。是否有可能通过其选项之一本地实现这一点,而我不知道这一点?
到目前为止,我尝试将这个方面定义为外部非线性约束。通过这样做,我需要检测到该方法在边界处停止,然后在那里重新启动它(这会重置最大欧几里得距离)。但是,我得到了奇怪的结果,正如这个问题中描述的关于根据约束的不收敛的问题。
总结所链接方法的问题,如果您尝试从 -0.4(例如)开始最小化 f(x) = x^2,并将参考约束 1.0 作为最大欧几里得距离,fmincon 将不会移动。然而,它会没有那个约束(事实上,它不应该影响,因为 -0.4 更接近于函数的全局最小值的 1.0,即 0)。这是一些带有和不带有非线性约束的示例代码。没有:
[x, fval] = fmincon(@(x) x^2, -0.4,[],[],[],[], -10, 10);
结果是:x = 1.5231e-11,fval(目标函数的值)= 2.3199e-22。
但是,如果我们添加从一开始不超过 1.0 的参考约束(以欧几里得距离为单位):
[x, fval] = fmincon(@(x) x^2, -0.4,[],[],[],[], -10, 10, @(x) NLConstraint(x, -0.4, 1.0));
前提是:
function [c, ceq] = NLConstraint(x, x0, radius)
c = norm(x-x0) - radius;
ceq=[];
end
我们得到 x = -0.4000 和 fval = 0.1600,因此即使在给定半径内可以达到最优值,fmincon 最终也不会移动。为了让它更奇怪,它成功地从 -4 移动到 -3 (所以约束对我来说似乎很有效)。如果您从 -0.7 开始,它甚至会移动。
因此,如前所述,我将非常感谢任何知道如何通过 fmincon 的内点选项定义从当前步骤到下一个步骤的最大欧几里得距离的人(或者,我用外部非-线性约束在1 )中总结和描述。
解决方案
推荐阅读
- tsql - 如何拆分 T-SQL 命令
- llvm-clang - Linux 的 BPF 程序中是否允许循环?
- python-3.x - 我正在尝试使用过滤器在列表中查找素数,但由于结果是奇数而找不到错误
- ruby-on-rails - Rails:如何通过模型中的 id 通过关系创建 has_many?
- excel - Excel 2007 - 重新排列水平行中的垂直数据
- c# - 在循环内添加 SQL 参数,在循环外执行。(C# SQL 客户端中带参数的单查询多插入)
- angular - span 标签的测试用例
- d3.js - 如何在同一个图中使用 D3 创建不同类型的网格线
- sql-server - SQL IN 条件
- css - CSS网格:如何自动将所有列调整为最宽列?