|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
求助!
在调用fmincon时,我加入了非线性约束,其中有一个约束相当于
a=diag(param(5:8)) - reshape(param(17:32),4,4);
然后要求 eig(a)>0
但是我在程序运行过程中,一直出现错误,会使得eig(a)<0.。这是为什么啊??
搞了好久了,还是没弄明白怎么回事。。。
下面是我调用fmincon的程序,然后全部程序在附件中
我选用了初始值:param0=[
2.808032
0.367534
0.959048
0.100000
71.057371
0.100092
0.281932
0.100000
0.944699
0.212290
0.805673
0.100000
1.042629
-0.155304
-0.480896
0.100000
70.057371
0.000000
0.000000
0.000000
0.000000
-0.899908
0.000000
0.000000
0.000000
0.000000
-0.718068
0.000000
0.000000
0.000000
0.000000
-0.900000
0.150872 ]
function [param,fval,exitflag,output,lambda,grad,hessian]=kalman_extcir4(param0)
options=optimset('Display','iter','maxfunevals',inf,'maxiter',4000,'LargeScale','off');
lb=repmat(-300,33,1);
ub=repmat(300,33,1);
lb(5:8)=0.0000001;
lb(9:12)=0.0000001;
lb(18:21)=0.00001;
lb(23:26)=0.00001;
lb(28:31)=0.00001;
lb(33)=0.0000001;
ub(33)=1;
[param,fval,exitflag,output,lambda,grad,hessian]=fmincon(@kalfun_extcir4,param0,[],[],[],[],lb,ub,@mycon,options);
function [c,ceq]=mycon(param)
ktQ=reshape(param(1:4),4,1);
kQ=diag(param(5:8));
lamda1=reshape(param(13:16),4,1);
lamda2=reshape(param(17:32),4,4);
ktP=ktQ+lamda1;
kP=kQ-lamda2;
if det(kP)==0
logfun=0;
return
end
ev=-eig(kP)+[0.0001;0.0001;0.0001;0.0001];%------------------------------就是这个约束一直无法满足
ctemp=-inv(kP)*ktP+[0.000001;0.000001;0.000001;0.000001];%------------------------------还有这个约束经常也无法满足
c=zeros(15,1);
c(1)=0.5*param(9).^2 - param(1)+0.000001;%
c(2)=0.5*param(10).^2 - param(2)+0.000001;
c(3)=0.5*param(11).^2 - param(3)+0.000001;
c(4)=0.5*param(12).^2 - param(4)+0.000001;
c(5)=0.5*param(9).^2 - param(1)- param(13)+0.000001;
c(6)=0.5*param(10).^2 - param(2)- param(14)+0.000001;
c(7)=0.5*param(11).^2 - param(3)- param(15)+0.000001;
c(8)=0.5*param(12).^2 - param(4)- param(16)+0.000001;
c(9:12)=ev;
c(12:15)=ctemp;
c=c;
ceq=0;
[ 本帖最后由 kevin_sky 于 2009-3-16 19:52 编辑 ] |
|