如何在每一步制作fmincon荣誉约束?

use*_*403 5 matlab mathematical-optimization

我试图在MATLAB Optimization Toolboox中使用fmincon估计非线性滤波器的参数,保持状态方程矩阵的特征值小于1.使用'sqp'算法的fmincon文档说它尊重所有迭代的约束,但在我的代码的第一次迭代中,它尝试了一个隐含不稳定特征值的点.我无法在这些参数值上运行过滤器,因此我的代码崩溃了.

文档是否真的意味着'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);
Run Code Online (Sandbox Code Playgroud)

谢谢!

Rod*_*uis 2

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

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

但是,坚持使用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
Run Code Online (Sandbox Code Playgroud)

这使得运行过滤器成为可能,但当约束被打破时,为目标函数返回更高的值这种“力量”fmincon进入可行区域。

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

 y = y + 1e8*c;
Run Code Online (Sandbox Code Playgroud)

不适合,因为如果y正好在可行区域,则返回值只是y,但如果它在下一次迭代时正好在该区域之外,则它会突然跳升数百万。这是有问题的,因为 SQPfmincon使用 的一阶和二阶导数y,这也会在类似的不连续性附近变成数百万,从而搞砸下一次迭代。