Matlab fmincon不匹配非线性约束
我试图最小化关于参数beta0向量的函数句柄。我的函数使用内置的mvncdf函数,该函数使用正定协方差矩阵。该矩阵由参数向量的一部分计算得出。还有一些参数的绝对值小于1的限制 我通过两种方式将约束设置为fmincon:所需值的上限和下限,并使用以下非线性约束:Matlab fmincon不匹配非线性约束,matlab,matrix,mathematical-optimization,nonlinear-optimization,Matlab,Matrix,Mathematical Optimization,Nonlinear Optimization,我试图最小化关于参数beta0向量的函数句柄。我的函数使用内置的mvncdf函数,该函数使用正定协方差矩阵。该矩阵由参数向量的一部分计算得出。还有一些参数的绝对值小于1的限制 我通过两种方式将约束设置为fmincon:所需值的上限和下限,并使用以下非线性约束: function [c,ceq] = pos_def(beta0) rho_12 = beta0(end-2,1); rho_13 = beta0(end-1,1); rho_23 = beta0(end,1); sigma111=[
function [c,ceq] = pos_def(beta0)
rho_12 = beta0(end-2,1);
rho_13 = beta0(end-1,1);
rho_23 = beta0(end,1);
sigma111=[1 rho_12 rho_13; rho_12 1 rho_23; rho_13 rho_23 1];
sigma110=[1 rho_12 -rho_13; rho_12 1 -rho_23; -rho_13 -rho_23 1];
sigma101=[1 -rho_12 rho_13; -rho_12 1 -rho_23; rho_13 -rho_23 1];
sigma100=[1 -rho_12 -rho_13; -rho_12 1 rho_23; -rho_13 rho_23 1];
eig111 = eig(sigma111);
eig110 = eig(sigma110);
eig101 = eig(sigma101);
eig100 = eig(sigma100);
c = vertcat(-eig111,-eig110,-eig101,-eig100);
由于所有矩阵都是平方的,并且通过收缩对称,所以作为正微分的代理,我使用特征值的符号
优化问题如下所示:
opts = optimset ('Display','iter','TolX',1e-15,'TolFun',1e-15,...
'Algorithm','interior-point','MaxIter',100000,'MaxFunEvals',1000000);
xc3_3=fmincon(model, beta,[],[],[],[],lb,ub,@pos_def, opts)
但在估计过程中,FMINCO因错误而中止
使用mvncdf(第193行)的误差σ必须是一个正方形、对称、正定矩阵
在调试模式下,我可以看到,经过两次评估迭代后,Matlab尝试估计beta0,它不符合我的非线性约束
beta0 =
-46.9208
33.2916
-2.1797
-46.4251
3.8337
-0.3066
6.1213
-20.9480
-1.7760
-0.1807
1.3950
4.5348
-0.9838
0.2600
-6.9887
-24.6157
-0.0112
-0.9923
-0.9284
0.7664
0.3062
且约束c<0不满足:
c =
0.3646
-1.2998
-2.0648
0.3646
-1.2998
-2.0648
0.3646
-1.2998
-2.0648
0.3646
-1.2998
-2.0648
我不明白为什么这个优化工具试图在禁止的领域找到解决方案,以及如何避免这个问题。或者如何以线性方式设置正定性约束。优化器只是评估点,看看它们是否是可行的移动方向。在您的
模型中
您应该告诉它特定的方向不是一个好的方向。伪代码看起来像
GetEigvalues
if (positive definite) then
Do what you really want to happen
else
Return a large number
end
或者
try
Do what you really want to happen
catch
Return a large number
end