Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab fmincon不匹配非线性约束_Matlab_Matrix_Mathematical Optimization_Nonlinear Optimization - Fatal编程技术网

Matlab 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=[

我试图最小化关于参数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=[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