我试图在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);
谢谢!
答案 0 :(得分:2)
The documentation确实指出'AlwaysHonorConstraints'
选项仅适用于绑定约束,因此lb
和ub
。换句话说,fmincon
将整个域[lb ub]
视为可行区域,并忽略任何和所有线性和非线性约束。
很久以前我写了optimize
,它基于fminsearch
,可用on the file exchange。现在,它已经很久了,所以我可能会记错,但我记得实现了一个选项('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
这使得可以运行过滤器,但在约束被破坏时为目标函数返回多更高的值。这会“强迫”fmincon
进入可行区域。
请注意,您使用的惩罚功能不会引入不连续性。像
这样的东西 y = y + 1e8*c;
不合适,因为如果y
只是在可行区域内,则返回的值只是y
,但如果是那么> em>在下一次迭代的区域之外,它会突然跳过百万。这是有问题的,因为fmincon
中的SQP使用y
的一阶和二阶导数,在这种不连续的邻域中也转向数百万,搞砸了下一次迭代。