【问题标题】:how to make fmincon honor constraints at each step?如何让 fmincon 在每一步都遵守约束?
【发布时间】:2013-08-27 19:07:23
【问题描述】:

我正在尝试使用 MATLAB 优化工具箱中的 fmincon 估计非线性滤波器的参数,保持状态方程矩阵的特征值小于 1。 fmincon 使用 'sqp' 算法的文档说它在所有迭代中都尊重约束,但是在我的代码的第一次迭代中,它尝试了一个暗示不稳定特征值的点。我无法在这些参数值下运行过滤器,因此我的代码崩溃了。

文档是否真的意味着“AlwaysHonorConstraints”仅适用于作为向量(lb 和 ub)传入的不等式约束?有什么办法可以保证每一步都满足非线性约束?

这是我的相关代码:

c = @(x) max(abs(eig(reshape(x(8:16), 3, 3)))) - 1;
ceq = @(x) [];                 
nonlcon = @(x) deal(c(x), ceq(x));

obj = @(x) -unscented_kalman1(x, fulldiv, crsp_allEverything);

fminconOptions = optimset('Display', 'iter-detailed', 'Algorithm', 'sqp', ...
 'TolX', errTol, 'UseParallel', 'always', 'AlwaysHonorConstraints', 'bounds');

maxX = fmincon(obj, x0, [], [], [], [], [], [], nonlcon, fminconOptions);

谢谢!

【问题讨论】:

  • 当你说“在我的代码的第一次迭代中,它会尝试一个暗示不稳定特征值的点”你是指使用x0fmincon 的第一次迭代吗?您是否尝试过不同的起始值?你把x0 设置成什么?

标签: matlab mathematical-optimization


【解决方案1】:

The documentation 确实表明'AlwaysHonorConstraints' 选项仅适用于绑定 约束,因此lbub。换句话说,fmincon 将整个域[lb ub] 视为可行区域,并忽略任何和所有线性和非线性约束。

很久以前我写了optimize,它是基于fminsearch 并且可以使用on the file exchange。现在,这是很久以前的事了,所以我可能记错了,但我记得实现了一个选项 ('superstrict'),它可以避免对可行区域之外的目标函数进行任何评估,包括 em> 线性和非线性约束。您可能想尝试一下。

但是,坚持fmincon,一种可能的解决方法是修改unscented_kalman1,例如包括惩罚:

function unscented_kalman1(x, ...)

    %// evaluate constraint (yes, also here, unfortunately)
    c = @(x) max(abs(eig(reshape(x,2,2)))) - 1;
    penalties = c > 0;

    %// modify x by thresholding 
    if penalties          
        x = ... %// [MODIFY x SUCH THAT IT LIES INSIDE THE FEASIBLE REGION]
    end

    %// ... remainder of the function here

    %// then finally: 
    y = ... %// [THE OUTCOME OF THE FUNCTION];

    if penalties  
         y = y + c.^3;  %// ...or something similar
    end

end

这使得运行您的过滤器成为可能,但是当约束被破坏时,目标函数返回一个高得多的值。这“迫使”fmincon 进入可行区域。

请注意,您使用的惩罚函数不会引入不连续性。像

 y = y + 1e8*c;

不适合,因为如果y 正好在可行域之内,则返回值只是y,但如果它在可行域之外在下一次迭代中,它会突然上升 百万。这是有问题的,因为fmincon 中的 SQP 使用了y 的一阶和二阶导数,这也会导致数百万类似的不连续性,从而搞砸下一次迭代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    相关资源
    最近更新 更多