我试图最小化关于参数beta0的向量的函数句柄。我的函数使用内置的 mvncdf 函数,该函数使用正定协方差矩阵。该矩阵从参数矢量的一部分计算。还有一些参数的绝对值约束小于一。
我以两种方式将约束设置为 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=[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)
但在估算期间,fmincon中止了错误
使用mvncdf时出错(第193行)SIGMA必须是方形,对称,正定矩阵。
在debuging模式下,我可以看到经过两次迭代评估后,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
我不明白为什么这个优化工具试图在禁区内找到解决方案以及如何避免这个问题。或者如何以线性方式设置正定性约束。
答案 0 :(得分:0)
优化器只是评估点,看它们是否是可行的方向。在你的model
中,你应该告诉它一个特定的方向不是一个好方向。伪代码看起来像
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