- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 MATLAB 优化工具箱中的 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);
谢谢!
最佳答案
The documentation确实指出 'AlwaysHonorConstraints'
选项仅适用于 bound 约束,因此 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
,但如果它那么刚好在下一次迭代的区域之外,它会突然跳起来 数百万。这是有问题的,因为 fmincon
中的 SQP 使用 y
的一阶和二阶导数,在这样的不连续点附近也会变成数百万,从而搞砸了下一次迭代。
关于matlab - 如何让 fmincon 在每一步都遵守约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473556/
我是一名优秀的程序员,十分优秀!